Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / fs / hfsplus / wrapper.c
index 0c51d63..72cab78 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/blkdev.h>
 #include <linux/cdrom.h>
 #include <linux/genhd.h>
-#include <linux/version.h>
 #include <asm/unaligned.h>
 
 #include "hfsplus_fs.h"
@@ -29,8 +28,11 @@ static int hfsplus_read_mdb(void *bufptr, struct hfsplus_wd *wd)
 {
        u32 extent;
        u16 attrib;
+       __be16 sig;
 
-       if (be16_to_cpu(*(__be16 *)(bufptr + HFSP_WRAPOFF_EMBEDSIG)) != HFSPLUS_VOLHEAD_SIG)
+       sig = *(__be16 *)(bufptr + HFSP_WRAPOFF_EMBEDSIG);
+       if (sig != cpu_to_be16(HFSPLUS_VOLHEAD_SIG) &&
+           sig != cpu_to_be16(HFSPLUS_VOLHEAD_SIGX))
                return 0;
 
        attrib = be16_to_cpu(*(__be16 *)(bufptr + HFSP_WRAPOFF_ATTRIB));
@@ -71,7 +73,7 @@ static int hfsplus_get_last_session(struct super_block *sb,
                        *start = (sector_t)te.cdte_addr.lba << 2;
                        return 0;
                }
-               printk(KERN_ERR "HFS: Invalid session number or type of track\n");
+               printk(KERN_ERR "hfs: invalid session number or type of track\n");
                return -EINVAL;
        }
        ms_info.addr_format = CDROM_LBA;
@@ -115,6 +117,10 @@ int hfsplus_read_wrapper(struct super_block *sb)
                }
                if (vhdr->signature == cpu_to_be16(HFSPLUS_VOLHEAD_SIG))
                        break;
+               if (vhdr->signature == cpu_to_be16(HFSPLUS_VOLHEAD_SIGX)) {
+                       HFSPLUS_SB(sb).flags |= HFSPLUS_SB_HFSX;
+                       break;
+               }
                brelse(bh);
 
                /* check for a partition block
@@ -144,7 +150,7 @@ int hfsplus_read_wrapper(struct super_block *sb)
                blocksize >>= 1;
 
        if (sb_set_blocksize(sb, blocksize) != blocksize) {
-               printk("HFS+: unable to blocksize to %u!\n", blocksize);
+               printk(KERN_ERR "hfs: unable to set blocksize to %u!\n", blocksize);
                return -EINVAL;
        }
 
@@ -159,7 +165,9 @@ int hfsplus_read_wrapper(struct super_block *sb)
                return -EIO;
 
        /* should still be the same... */
-       if (be16_to_cpu(vhdr->signature) != HFSPLUS_VOLHEAD_SIG)
+       if (vhdr->signature != (HFSPLUS_SB(sb).flags & HFSPLUS_SB_HFSX ?
+                               cpu_to_be16(HFSPLUS_VOLHEAD_SIGX) :
+                               cpu_to_be16(HFSPLUS_VOLHEAD_SIG)))
                goto error;
        HFSPLUS_SB(sb).s_vhbh = bh;
        HFSPLUS_SB(sb).s_vhdr = vhdr;