On Wed, Jan 14, 2015 at 02:27:17PM -0800, Zach Brown wrote:
> On Wed, Jan 14, 2015 at 04:06:02PM -0500, Sandy McArthur Jr wrote:
> > Sometimes btrfs scrub status reports that is not running when it still is.
> >
> > I think this a cosmetic bug. And I believe this is related to the
> > scrub completing on some drives before others in a multi-drive btrfs
> > filesystem that is not well balanced.
>
> Boy, I don't really know this code, but it looks like:
>
> if (ss->in_progress)
> printf(", running for %llu seconds\n", ss->duration);
> else
> printf(", interrupted after %llu seconds, not running\n",
> ss->duration);
>
> in_progress = is_scrub_running_in_kernel(fdmnt, di_args, fi_args.num_devices);
>
> static int is_scrub_running_in_kernel(int fd,
> struct btrfs_ioctl_dev_info_args *di_args, u64 max_devices)
> {
> struct scrub_progress sp;
> int i;
> int ret;
>
> for (i = 0; i < max_devices; i++) {
> memset(&sp, 0, sizeof(sp));
> sp.scrub_args.devid = di_args[i].devid;
> ret = ioctl(fd, BTRFS_IOC_SCRUB_PROGRESS, &sp.scrub_args);
> if (ret < 0 && errno == ENODEV)
> continue;
> if (ret < 0 && errno == ENOTCONN)
> return 0;
>
> It says that scrub isn't running if any devices have completed. If you drop
> all those ret < 0 conditional branches that are either noops or wrong, does it
> work like you'd expect?
Why wrong? The ioctl callback returns -ENODEV or -ENOTCONN that get
translated to the errno values and ioctl(...) returns -1 in both cases.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html