On 10/23/2017 12:45 PM, Misono, Tomohiro wrote:
Currently "fi usage" (and "dev usage") cannot run for the filesystem using
seed device.
This is because FS_INFO ioctl returns the number of devices excluding
seeds, but load_device_info() tries to access valid device from devid 0
to max_id, and results in accessing seeds too (thus causing mismatching
of number of devices).
A long time back I tried to fix this by fixing the FS_INFO num_devs
itself, but the concern was backward compatibility of the ioctl.
However there is no such a concern here. I am ok with this approach.
Since only the size of non-seed devices is matter, fix this by just
skipping seed device by checking device's fsid and comparing it to the fsid
obtained by FS_INFO ioctl.
Signed-off-by: Tomohiro Misono <misono.tomoh...@jp.fujitsu.com>
Reviewed-by: Anand Jain <anand.j...@oracle.com>
Thanks, Anand
---
cmds-fi-usage.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/cmds-fi-usage.c b/cmds-fi-usage.c
index a72fb4e..50c7e51 100644
--- a/cmds-fi-usage.c
+++ b/cmds-fi-usage.c
@@ -545,6 +545,7 @@ static int load_device_info(int fd, struct device_info
**device_info_ptr,
struct btrfs_ioctl_fs_info_args fi_args;
struct btrfs_ioctl_dev_info_args dev_info;
struct device_info *info;
+ __u8 fsid[BTRFS_UUID_SIZE];
*device_info_count = 0;
*device_info_ptr = NULL;
@@ -568,6 +569,7 @@ static int load_device_info(int fd, struct device_info
**device_info_ptr,
if (ndevs >= fi_args.num_devices) {
error("unexpected number of devices: %d >= %llu", ndevs,
(unsigned long long)fi_args.num_devices);
+ error("if seed device is used, try run as root.");
goto out;
}
memset(&dev_info, 0, sizeof(dev_info));
@@ -580,6 +582,19 @@ static int load_device_info(int fd, struct device_info
**device_info_ptr,
goto out;
}
+ /*
+ * Skip seed device by cheking device's fsid (require root).
+ * Ignore EACCES since if seed is not used this function works
+ * correctly without root privilege.
+ */
+ ret = dev_to_fsid((const char *)dev_info.path, fsid);
+ if (ret != -EACCES) {
+ if (ret)
+ goto out;
+ if (memcmp(fi_args.fsid, fsid, BTRFS_FSID_SIZE) != 0)
+ continue;
+ }
+
info[ndevs].devid = dev_info.devid;
if (!dev_info.path[0]) {
strcpy(info[ndevs].path, "missing");
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html