On 10/10/2018 01:08 PM, Jiri Denemark wrote: > On Tue, Oct 09, 2018 at 15:48:47 +0200, Michal Privoznik wrote: >> There are couple of things wrong with the current implementation. >> The first one is that in the first loop the code tries to build a >> list of fuse.glusterfs mount points. Well, since the strings are >> allocated in a temporary buffer and are not duplicated this >> results in wrong decision made later in the code. >> >> The second problem is that the code does not take into account >> subtree mounts. For instance, if there's a fuse.gluster mounted >> at /some/path and another FS mounted at /some/path/subdir the >> code would not recognize this subdir mount. >> >> Reported-by: Han Han <hhan@xxxxxxxxxx> >> Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> >> --- >> src/util/virfile.c | 58 +++++++++++++---------------------- >> tests/virfiledata/mounts3.txt | 2 ++ >> tests/virfiletest.c | 2 ++ >> 3 files changed, 26 insertions(+), 36 deletions(-) >> >> diff --git a/src/util/virfile.c b/src/util/virfile.c >> index 666d703f99..19f504cc6d 100644 >> --- a/src/util/virfile.c >> +++ b/src/util/virfile.c >> @@ -3468,18 +3468,14 @@ static int >> virFileIsSharedFixFUSE(const char *path, >> long *f_type) >> { >> - char *dirpath = NULL; >> - const char **mounts = NULL; >> - size_t nmounts = 0; >> - char *p; >> FILE *f = NULL; >> struct mntent mb; >> char mntbuf[1024]; >> + char *mntDir = NULL; >> + char *mntType = NULL; >> + size_t maxMatching = 0; >> int ret = -1; >> >> - if (VIR_STRDUP(dirpath, path) < 0) >> - return -1; >> - >> if (!(f = setmntent(PROC_MOUNTS, "r"))) { >> virReportSystemError(errno, >> _("Unable to open %s"), >> @@ -3488,43 +3484,33 @@ virFileIsSharedFixFUSE(const char *path, >> } >> >> while (getmntent_r(f, &mb, mntbuf, sizeof(mntbuf))) { >> - if (STRNEQ("fuse.glusterfs", mb.mnt_type)) >> + const char *p; >> + size_t len = strlen(mb.mnt_dir); >> + >> + if (!(p = STRSKIP(path, mb.mnt_dir))) >> continue; > > I think you wanted to do something clever with the p pointer here to > avoid false positives on, e.g., /mnt/ble when searching for /mnt/bleak > path. Otherwise you could have just use STRPREFIX(). > > The rest of the patch looks OK. Oh right. I wanted to do this: diff --git i/src/util/virfile.c w/src/util/virfile.c index 19f504cc6d..03e14c757f 100644 --- i/src/util/virfile.c +++ w/src/util/virfile.c @@ -3490,6 +3490,9 @@ virFileIsSharedFixFUSE(const char *path, if (!(p = STRSKIP(path, mb.mnt_dir))) continue; + if (*p != '/') + continue; + if (len > maxMatching) { len = maxMatching; VIR_FREE(mntType); Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list