aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Behrens <sbehrens@giantdisaster.de>2013-10-11 09:20:42 -0400
committerChris Mason <chris.mason@fusionio.com>2013-11-11 22:01:09 -0500
commit27087f370174ebb298cdf6dcb36b1e4dcbe34e93 (patch)
treedf09525ed37796cda82c6b6df83475557405444c
parent30d133fc221a0ec50030c33aa7bf6931503894c7 (diff)
Btrfs: init device stats for new devices
Device stats are only initialized (read from tree items) on mount. Trying to read device stats after adding or replacing new devices will return errors. btrfs_init_new_device() and btrfs_init_dev_replace_tgtdev() are the two functions that allocate and initialize new btrfs_device structures after a filesystem is mounted. They set the device stats to zero by using kzalloc() which is correct for new devices. The only missing thing was to declare these stats as being valid (device->dev_stats_valid = 1) and this patch adds this missing code. This is the reproducer: TEST_DEV1=/dev/sdzzzzz1 TEST_DEV2=/dev/sdzzzzz2 TEST_DEV3=/dev/sdzzzzz3 TEST_MNT=/mnt mkfs.btrfs $TEST_DEV1 mount $TEST_DEV1 $TEST_MNT btrfs device add $TEST_DEV2 $TEST_MNT btrfs device stat $TEST_MNT btrfs replace start -B $TEST_DEV2 $TEST_DEV3 $TEST_MNT btrfs device stat $TEST_MNT umount $TEST_MNT Reported-by: Ondrej Kunc <kunc88@gmail.com> Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de> Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-rw-r--r--fs/btrfs/volumes.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 5d7ea267d8ff..f492f7eabf29 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2042,6 +2042,7 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path)
2042 device->in_fs_metadata = 1; 2042 device->in_fs_metadata = 1;
2043 device->is_tgtdev_for_dev_replace = 0; 2043 device->is_tgtdev_for_dev_replace = 0;
2044 device->mode = FMODE_EXCL; 2044 device->mode = FMODE_EXCL;
2045 device->dev_stats_valid = 1;
2045 set_blocksize(device->bdev, 4096); 2046 set_blocksize(device->bdev, 4096);
2046 2047
2047 if (seeding_dev) { 2048 if (seeding_dev) {
@@ -2209,6 +2210,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_root *root, char *device_path,
2209 device->in_fs_metadata = 1; 2210 device->in_fs_metadata = 1;
2210 device->is_tgtdev_for_dev_replace = 1; 2211 device->is_tgtdev_for_dev_replace = 1;
2211 device->mode = FMODE_EXCL; 2212 device->mode = FMODE_EXCL;
2213 device->dev_stats_valid = 1;
2212 set_blocksize(device->bdev, 4096); 2214 set_blocksize(device->bdev, 4096);
2213 device->fs_devices = fs_info->fs_devices; 2215 device->fs_devices = fs_info->fs_devices;
2214 list_add(&device->dev_list, &fs_info->fs_devices->devices); 2216 list_add(&device->dev_list, &fs_info->fs_devices->devices);