diff options
Diffstat (limited to 'cmds-fi-usage.c')
-rw-r--r-- | cmds-fi-usage.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/cmds-fi-usage.c b/cmds-fi-usage.c index a72fb4e3..83d0c589 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,8 @@ 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 running this command as root"); goto out; } memset(&dev_info, 0, sizeof(dev_info)); @@ -580,6 +583,17 @@ static int load_device_info(int fd, struct device_info **device_info_ptr, goto out; } + /* + * Skip seed device by checking device's fsid (requires root). + * And we will skip only if dev_to_fsid is successful and dev + * is a seed device. + * Ignore any other error including -EACCES, which is seen when + * a non-root process calls dev_to_fsid(path)->open(path). + */ + ret = dev_to_fsid((const char *)dev_info.path, fsid); + if (!ret && 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"); |