btrfs-progs: don't use closed fd
authorEric Sandeen <sandeen@redhat.com>
Fri, 25 Jan 2013 00:18:50 +0000 (18:18 -0600)
committerZach Brown <zab@redhat.com>
Wed, 6 Feb 2013 00:09:41 +0000 (16:09 -0800)
In the case that btrfs scrub cancel is given a device name,
we close the file handle, and then pass it to check_mounted_where()
which eventually preads from that (now closed) fd.  Fix the logic
so that we close & re-open the discovered mountpoint properly.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Zach Brown <zab@redhat.com>
cmds-scrub.c

index 31ace6d..b984e96 100644 (file)
@@ -1457,14 +1457,14 @@ static int cmd_scrub_cancel(int argc, char **argv)
 again:
        ret = ioctl(fdmnt, BTRFS_IOC_SCRUB_CANCEL, NULL);
        err = errno;
-       close(fdmnt);
 
        if (ret && err == EINVAL) {
-               /* path is no mounted btrfs. try if it's a device */
+               /* path is not a btrfs mount point.  See if it's a device. */
                ret = check_mounted_where(fdmnt, path, mp, sizeof(mp),
                                          &fs_devices_mnt);
-               close(fdmnt);
                if (ret) {
+                       /* It is a device; open the mountpoint. */
+                       close(fdmnt);
                        fdmnt = open_file_or_dir(mp);
                        if (fdmnt >= 0) {
                                path = mp;
@@ -1473,6 +1473,8 @@ again:
                }
        }
 
+       close(fdmnt);
+
        if (ret) {
                fprintf(stderr, "ERROR: scrub cancel failed on %s: %s\n", path,
                        err == ENOTCONN ? "not running" : strerror(errno));