btrfs: define BTRFS_MAGIC as a u64 value
authorZach Brown <zab@redhat.com>
Wed, 20 Feb 2013 00:55:13 +0000 (00:55 +0000)
committerJosef Bacik <jbacik@fusionio.com>
Wed, 20 Feb 2013 18:00:01 +0000 (13:00 -0500)
super.magic is an le64 but it's treated as an unterminated string when
compared against BTRFS_MAGIC which is defined as a string.  Instead
define BTRFS_MAGIC as a normal hex value and use endian helpers to
compare it to the super's magic.

I tested this by mounting an fs made before the change and made sure
that it didn't introduce sparse errors.  This matches a similar cleanup
that is pending in btrfs-progs.  David Sterba pointed out that we should
fix the kernel side as well :).

Signed-off-by: Zach Brown <zab@redhat.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
fs/btrfs/check-integrity.c
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/volumes.c

index 11d47bfb62b418f6f4d5459d8c02a18b05c3731b..18af6f48781a1f31e1d41c23bb08a2e1b6ea12a7 100644 (file)
@@ -813,8 +813,7 @@ static int btrfsic_process_superblock_dev_mirror(
            (bh->b_data + (dev_bytenr & 4095));
 
        if (btrfs_super_bytenr(super_tmp) != dev_bytenr ||
-           strncmp((char *)(&(super_tmp->magic)), BTRFS_MAGIC,
-                   sizeof(super_tmp->magic)) ||
+           super_tmp->magic != cpu_to_le64(BTRFS_MAGIC) ||
            memcmp(device->uuid, super_tmp->dev_item.uuid, BTRFS_UUID_SIZE) ||
            btrfs_super_nodesize(super_tmp) != state->metablock_size ||
            btrfs_super_leafsize(super_tmp) != state->metablock_size ||
index 961ff2986341a777d2cf589202f833d70bf2f7f1..1679051f4d3971f176e393fd93847f597d9e61e4 100644 (file)
@@ -46,7 +46,7 @@ extern struct kmem_cache *btrfs_path_cachep;
 extern struct kmem_cache *btrfs_free_space_cachep;
 struct btrfs_ordered_sum;
 
-#define BTRFS_MAGIC "_BHRfS_M"
+#define BTRFS_MAGIC 0x4D5F53665248425FULL /* ascii _BHRfS_M, no null */
 
 #define BTRFS_MAX_MIRRORS 3
 
index e511d9f78c193cf57445d10d1e45f03b61685398..39ff34a62a245ba005356c1e3eae1890d4f7d641 100644 (file)
@@ -2407,8 +2407,7 @@ int open_ctree(struct super_block *sb,
        sb->s_blocksize = sectorsize;
        sb->s_blocksize_bits = blksize_bits(sectorsize);
 
-       if (strncmp((char *)(&disk_super->magic), BTRFS_MAGIC,
-                   sizeof(disk_super->magic))) {
+       if (disk_super->magic != cpu_to_le64(BTRFS_MAGIC)) {
                printk(KERN_INFO "btrfs: valid FS not found on %s\n", sb->s_id);
                goto fail_sb_buffer;
        }
@@ -2815,8 +2814,7 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev)
 
                super = (struct btrfs_super_block *)bh->b_data;
                if (btrfs_super_bytenr(super) != bytenr ||
-                   strncmp((char *)(&super->magic), BTRFS_MAGIC,
-                           sizeof(super->magic))) {
+                   super->magic != cpu_to_le64(BTRFS_MAGIC)) {
                        brelse(bh);
                        continue;
                }
index 567076542d1dc5c8b28370ba062c2ce5987b5b21..72b1cf1b2b5ee5b586612cf8bf952c805670e66e 100644 (file)
@@ -855,8 +855,7 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
        disk_super = p + (bytenr & ~PAGE_CACHE_MASK);
 
        if (btrfs_super_bytenr(disk_super) != bytenr ||
-           strncmp((char *)(&disk_super->magic), BTRFS_MAGIC,
-                   sizeof(disk_super->magic)))
+           disk_super->magic != cpu_to_le64(BTRFS_MAGIC))
                goto error_unmap;
 
        devid = btrfs_stack_device_id(&disk_super->dev_item);