Message ID | 1466141874-15854-1-git-send-email-chandan@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
On Fri, Jun 17, 2016 at 11:07:54AM +0530, Chandan Rajendra wrote: > stripesize should ideally be set to the value of sectorsize. However > previous versions of btrfs-progs/mkfs.btrfs had set stripesize to a > value of 4096. On machines with PAGE_SIZE other than 4096, This could > lead to the following scenario, > > - /dev/loop0, /dev/loop1 and /dev/loop2 are mounted as a single > filesystem. The filesystem was created by an older version of mkfs.btrfs > which set stripesize to 4k. > - losetup -a > /dev/loop0: [0030]:19477 (/root/disk-imgs/file-0.img) > /dev/loop1: [0030]:16577 (/root/disk-imgs/file-1.img) > /dev/loop2: [64770]:3423229 (/root/disk-imgs/file-2.img) > - /etc/mtab lists only /dev/loop0 > - losetup /dev/loop4 /root/disk-imgs/file-1.img > The new mkfs.btrfs invoked as 'mkfs.btrfs -f /dev/loop4' succeeds even > though /dev/loop1 has already been mounted and has > /root/disk-imgs/file-1.img as its backing file. > > The above behaviour occurs because check_super() function returns an > error code (due to stripesize not being set to 4096) and hence > check_mounted_where() function treats /dev/loop1 as a disk containing a > filesystem other than Btrfs. > > Hence as a workaround this commit allows 4096 as a valid stripesize. > > Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com> Applied, thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/disk-io.c b/disk-io.c index 77eb0a6..fbce506 100644 --- a/disk-io.c +++ b/disk-io.c @@ -1476,7 +1476,8 @@ static int check_super(struct btrfs_super_block *sb) error("invalid bytes_used %llu", btrfs_super_bytes_used(sb)); goto error_out; } - if (btrfs_super_stripesize(sb) != 4096) { + if ((btrfs_super_stripesize(sb) != 4096) + && (btrfs_super_stripesize(sb) != btrfs_super_sectorsize(sb))) { error("invalid stripesize %u", btrfs_super_stripesize(sb)); goto error_out; } diff --git a/mkfs.c b/mkfs.c index a3a3c14..697bdc2 100644 --- a/mkfs.c +++ b/mkfs.c @@ -1482,6 +1482,7 @@ int main(int argc, char **argv) } sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE)); + stripesize = sectorsize; saved_optind = optind; dev_cnt = argc - optind; if (dev_cnt == 0)
stripesize should ideally be set to the value of sectorsize. However previous versions of btrfs-progs/mkfs.btrfs had set stripesize to a value of 4096. On machines with PAGE_SIZE other than 4096, This could lead to the following scenario, - /dev/loop0, /dev/loop1 and /dev/loop2 are mounted as a single filesystem. The filesystem was created by an older version of mkfs.btrfs which set stripesize to 4k. - losetup -a /dev/loop0: [0030]:19477 (/root/disk-imgs/file-0.img) /dev/loop1: [0030]:16577 (/root/disk-imgs/file-1.img) /dev/loop2: [64770]:3423229 (/root/disk-imgs/file-2.img) - /etc/mtab lists only /dev/loop0 - losetup /dev/loop4 /root/disk-imgs/file-1.img The new mkfs.btrfs invoked as 'mkfs.btrfs -f /dev/loop4' succeeds even though /dev/loop1 has already been mounted and has /root/disk-imgs/file-1.img as its backing file. The above behaviour occurs because check_super() function returns an error code (due to stripesize not being set to 4096) and hence check_mounted_where() function treats /dev/loop1 as a disk containing a filesystem other than Btrfs. Hence as a workaround this commit allows 4096 as a valid stripesize. Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com> --- Changelog: v1->v2: Use Tabs to indent rather than spaces. Thanks to Satoru Takeuchi for pointing this out. disk-io.c | 3 ++- mkfs.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)