summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2014-08-18 16:38:19 +0800
committerDavid Sterba <dsterba@suse.cz>2014-10-10 18:11:32 +0200
commitd0588bfa479409b2a0f6243f894338a01a56221a (patch)
tree5ffc785f1449c901b7263d273483535237cab2c2
parent2513077f2f830b4bc83d528bfb6979eb461918bd (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>
-rw-r--r--utils.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/utils.c b/utils.c
index e9306b05..40b8f1a3 100644
--- a/utils.c
+++ b/utils.c
@@ -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]);