diff options
author | Anand Jain <anand.jain@oracle.com> | 2014-08-18 16:38:19 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2014-10-10 18:11:32 +0200 |
commit | d0588bfa479409b2a0f6243f894338a01a56221a (patch) | |
tree | 5ffc785f1449c901b7263d273483535237cab2c2 /utils.c | |
parent | 2513077f2f830b4bc83d528bfb6979eb461918bd (diff) |
btrfs-progs: do a separate probe for transient replacing device
As mentioned in the kernel patch
btrfs: ioctl BTRFS_IOC_FS_INFO and
BTRFS_IOC_DEV_INFO miss-matched with slots
The count as returned by BTRFS_IOC_FS_INFO is the number of slots that
btrfs-progs would allocate for the BTRFS_IOC_DEV_INFO ioctl. Since
BTRFS_IOC_DEV_INFO would loop across the seed devices, So its better
ioctl BTRFS_IOC_FS_INFO returns the total_devices instead of num_devices.
The above mentioned patch just does that. That is, it returns
total_devices instead of num_devices.
Which means we need to probe for the replacing device separately.
This patch will probe for the replacing device separately.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'utils.c')
-rw-r--r-- | utils.c | 19 |
1 files changed, 18 insertions, 1 deletions
@@ -1819,12 +1819,29 @@ int get_fs_info(char *path, struct btrfs_ioctl_fs_info_args *fi_args, if (!fi_args->num_devices) goto out; - di_args = *di_ret = malloc(fi_args->num_devices * sizeof(*di_args)); + /* + * with kernel patch + * btrfs: ioctl BTRFS_IOC_FS_INFO and BTRFS_IOC_DEV_INFO miss-matched with slots + * the kernel now returns total_devices which does not include + * replacing device if running. + * As we need to get dev info of the replace device if it is running, + * so just add one to fi_args->num_devices. + */ + + di_args = *di_ret = malloc((fi_args->num_devices + 1) * sizeof(*di_args)); if (!di_args) { ret = -errno; goto out; } + /* get the replace target device if it is there */ + ret = get_device_info(fd, i, &di_args[ndevs]); + if (!ret) { + ndevs++; + fi_args->num_devices++; + } + i++; + for (; i <= fi_args->max_id; ++i) { BUG_ON(ndevs >= fi_args->num_devices); ret = get_device_info(fd, i, &di_args[ndevs]); |