From: Eric Sandeen Date: Thu, 8 Jan 2009 21:25:27 +0000 (-0600) Subject: libdisk: recognize btrfs disk format X-Git-Tag: v3.0.0~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=75dd641ab5f161243a0ee0899059ddcdabb11b51;p=thirdparty%2Fxfsprogs-dev.git libdisk: recognize btrfs disk format Now that the btrfs disk format has stabilized, libdisk can recognize it and mkfs.xfs will not overwrite it w/o "-f" : # mkfs.btrfs -l 16384 -L mylabel -n 8192 -s 4096 /tmp/fsfile fs created label mylabel on /tmp/fsfile nodesize 8192 leafsize 16384 sectorsize 4096 size 1.28GB Btrfs v0.16-37-gb8271dc # mkfs.xfs /tmp/fsfile mkfs.xfs: /tmp/fsfile appears to contain an existing filesystem (btrfs). mkfs.xfs: Use the -f option to force overwrite. This'll fix up xfsqa failures when mkfs.btrfs is found, too. Reviewed-by: Christoph Hellwig --- diff --git a/libdisk/fstype.c b/libdisk/fstype.c index 775b74b1e..f84b4e4eb 100644 --- a/libdisk/fstype.c +++ b/libdisk/fstype.c @@ -68,7 +68,7 @@ swapped(unsigned short a) { Added jfs - Christoph Hellwig Added sysv - Tim Launchbury Added udf - Bryce Nesbitt - Added gfs/gfs2 - Eric Sandeen + Added gfs/gfs2, btrfs - Eric Sandeen */ /* @@ -194,6 +194,7 @@ fstype(const char *device) { struct adfs_super_block adfssb; struct sysv_super_block svsb; struct gfs2_sb gfs2sb; + struct btrfs_super_block btrfssb; struct stat statbuf; /* opening and reading an arbitrary unknown path can have @@ -398,6 +399,17 @@ fstype(const char *device) { } } + if (!type) { + /* block 64 */ + if (lseek(fd, BTRFS_SUPER_INFO_OFFSET, SEEK_SET) != BTRFS_SUPER_INFO_OFFSET + || read(fd, (char *) &btrfssb, sizeof(btrfssb)) != sizeof(btrfssb)) + goto io_error; + if (!strncmp((char *)(btrfssb.magic), BTRFS_MAGIC, + sizeof(btrfssb.magic))) { + type = "btrfs"; + } + } + if (!type) { /* perhaps the user tries to mount the swap space on a new disk; warn her before she does mkfs on it */ diff --git a/libdisk/fstype.h b/libdisk/fstype.h index cd3eec9f1..c0abbab62 100644 --- a/libdisk/fstype.h +++ b/libdisk/fstype.h @@ -292,6 +292,32 @@ struct gfs2_sb { #define gfsformat(s) assemble4be(s.sb_fs_format) #define gfsmultiformat(s) assemble4be(s.sb_multihost_format) +/* btrfs constants */ +#define BTRFS_SUPER_INFO_OFFSET (64 * 1024) + +/* 32 bytes in various csum fields */ +#define BTRFS_CSUM_SIZE 32 + +#define BTRFS_FSID_SIZE 16 + +#define BTRFS_MAGIC "_BHRfS_M" + +/* + * the super block basically lists the main trees of the FS + * it currently lacks any block count etc etc + */ +struct btrfs_super_block { + char csum[BTRFS_CSUM_SIZE]; + /* the first 3 fields must match struct btrfs_header */ + char fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */ + char bytenr[8]; /* this block number */ + char flags[8]; + + /* allowed to be different from the btrfs_header from here own down */ + char magic[8]; + /* more follows but this is all our libdisk cares about*/ +} __attribute__ ((__packed__)); + static inline int assemble2le(char *p) { return (p[0] | (p[1] << 8));