]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfsprogs: be careful about what we stat in platform_check_mount
authorEric Sandeen <sandeen@redhat.com>
Wed, 23 May 2018 21:30:49 +0000 (16:30 -0500)
committerEric Sandeen <sandeen@redhat.com>
Wed, 23 May 2018 21:30:49 +0000 (16:30 -0500)
After we lost ustat(2) in commit 4e7a824, we ended up with a slightly
bonkers method to determine if our target block device was mounted:
it goes through every entry returned by getmntent and stats the dir
to see if its underlying device matches ours.

Unfortunately that dir might be a hung nfs server and sadness ensues.

So just do a really simple sanity check before we try to stat the
mountpoint: does its device start with a / ?  If not, skip it.

Fixes: 4e7a824 ("libxfs/linux.c: Replace use of ustat by stat")
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libfrog/linux.c

index 0bace3ebc416d12bee97da01b61ef9e9b8217f46..66e8a4bd685c976c147bd47708de168deaaaaa12 100644 (file)
@@ -77,7 +77,17 @@ platform_check_mount(char *name, char *block, struct stat *s, int flags)
                    progname, name);
                return 1;
        }
+       /*
+        * This whole business is to work out if our block device is mounted
+        * after we lost ustat(2), see:
+        *      4e7a824 libxfs/linux.c: Replace use of ustat by stat
+        * We don't really want to stat every single mounted directory,
+        * as that may include tmpfs, cgroups, procfs or - worst - hung nfs
+        * servers.  So first, a simple check: does the "dev" start with "/" ?
+        */
        while ((mnt = getmntent(f)) != NULL) {
+               if (mnt->mnt_fsname[0] != '/')
+                       continue;
                if (stat(mnt->mnt_dir, &mst) < 0)
                        continue;
                if (mst.st_dev != s->st_rdev)