From 9d6e21a714fadd6e5845f2fd7087e7d8fe43c75b Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Wed, 23 Feb 2022 13:51:28 +0000 Subject: [PATCH] fallback of name_to_handle_at OBS-URL: https://build.opensuse.org/package/show/Base:System/psmisc?expand=0&rev=139 --- ...to-be-able-to-use-the-mount-identity.patch | 108 ++++++++++++------ psmisc.changes | 7 ++ 2 files changed, 79 insertions(+), 36 deletions(-) diff --git a/0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch b/0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch index b070198..291f264 100644 --- a/0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch +++ b/0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch @@ -1,6 +1,6 @@ -From fe73905beaf1f7a7ec5a5c2796031987e5336fd7 Mon Sep 17 00:00:00 2001 +From 1066ab018235e9981d8770f6c94b294f8b16c7fe Mon Sep 17 00:00:00 2001 From: Werner Fink -Date: Tue, 1 Feb 2022 13:15:39 +0100 +Date: Wed, 23 Feb 2022 13:58:32 +0100 Subject: [PATCH] Use mountinfo to be able to use the mount identity which allows to distinguish different mounts with the @@ -25,13 +25,16 @@ determine the appropriate mount ID for e.g. qcow2 files. Determine the namespace of a process only once to speed up the parsing of fdinfo. +Add a fallback if the system call name_to_handle_at() is +not supported by the used file system. + Signed-off-by: Werner Fink --- configure.ac | 15 +- - src/fuser.c | 701 +++++++++++++++++++++++++++++++++++++++----------- + src/fuser.c | 734 +++++++++++++++++++++++++++++++++++++++----------- src/fuser.h | 25 +- src/timeout.c | 5 +- - 4 files changed, 585 insertions(+), 161 deletions(-) + 4 files changed, 618 insertions(+), 161 deletions(-) diff --git configure.ac configure.ac index 182a0df..d4dee51 100644 @@ -67,7 +70,7 @@ index 182a0df..d4dee51 100644 dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST diff --git src/fuser.c src/fuser.c -index 03e6237..79d44ef 100644 +index 03e6237..ee2ba15 100644 --- src/fuser.c +++ src/fuser.c @@ -32,6 +32,8 @@ @@ -674,11 +677,11 @@ index 03e6237..79d44ef 100644 - continue; - find_mountp++; - if ((find_space = strchr(find_mountp, ' ')) == NULL) -- continue; -- *find_space = '\0'; -- if (timeout(thestat, find_mountp, &st, 5) != 0) { + if (timeout(thestat, find_mountp, &st, 5) != 0) continue; +- *find_space = '\0'; +- if (timeout(thestat, find_mountp, &st, 5) != 0) { +- continue; - } + /* Scan the devices */ @@ -747,7 +750,7 @@ index 03e6237..79d44ef 100644 { list_t *ptr, *tmp; -@@ -2053,72 +2240,286 @@ static void clear_mntinfo(void) +@@ -2053,72 +2240,319 @@ static void clear_mntinfo(void) } } @@ -801,8 +804,17 @@ index 03e6237..79d44ef 100644 + stat(mpoint, &st); + mntinf->dev = st.st_dev; /* stat(2) on binary does not see subvol dev */ + } -+ } -+ } + } +- append(mnt, mntinfo); +- mnt->mpoint = ((char *)mnt) + alignof(mntinfo_t); +- strcpy(mnt->mpoint, mpoint); +- mnt->nlen = nlen; +- mnt->parid = parid; +- mnt->dev = makedev(maj, min); +- mnt->id = mid; +- if (mid > max) +- max = mid; + } +#else + if ((mnt = fopen(PROC_MOUNTS, "r")) == (FILE *) 0) + return; @@ -822,17 +834,8 @@ index 03e6237..79d44ef 100644 + if (mntinf && strncmp(devname, "/dev/", 5) == 0 && stat(devname, &st) == 0) { + if (st.st_rdev != 0 && mntinf->dev != st.st_rdev) + mntinf->vol = st.st_rdev; - } -- append(mnt, mntinfo); -- mnt->mpoint = ((char *)mnt) + alignof(mntinfo_t); -- strcpy(mnt->mpoint, mpoint); -- mnt->nlen = nlen; -- mnt->parid = parid; -- mnt->dev = makedev(maj, min); -- mnt->id = mid; -- if (mid > max) -- max = mid; - } ++ } ++ } +#endif fclose(mnt); +} @@ -920,7 +923,12 @@ index 03e6237..79d44ef 100644 + } + return ret == 2 ? 0 : -1; +} -+ + +- /* Sort mount points accordingly to the reverse mount order */ +- initial(&sort); +- for (mid = 1; mid <= max; mid++) { +- list_t *ptr, *tmp; +- list_for_each_safe(ptr, tmp, &mntinfo) { +#if defined(HAS_NAME_TO_HANDLE_AT) +static ino_t +get_namespace(const pid_t pid) @@ -943,8 +951,41 @@ index 03e6237..79d44ef 100644 + int mnt_id = -1; + + errno = 0; -+ if (name_to_handle_at(0, path, &fh.handle, &mnt_id, 0) == -1) -+ mnt_id = -1; ++ if (name_to_handle_at(0, path, &fh.handle, &mnt_id, 0) == -1) { ++ const static char delimiters[] = ": \t\n"; ++ char fdinfo[PATH_MAX+1]; ++ char line[BUFSIZ]; ++ FILE* fp; ++ int fd; ++ ++ if (errno != EOPNOTSUPP) ++ return -1; ++ fd = open(path, O_PATH); ++ if (fd < 0) ++ return -1; ++ ++ snprintf(fdinfo, PATH_MAX, "/proc/self/fdinfo/%d", fd); ++ if ((fp = fopen(fdinfo, "r")) == NULL) { ++ close(fd); ++ return -1; ++ } ++ while (fgets(line, BUFSIZ, fp)) { ++ char *xp, *vp, *ep; ++ unsigned long ul; ++ xp = strtok(&line[0], delimiters); ++ if (!xp || *xp == 0) ++ continue; ++ vp = strtok(NULL, delimiters); ++ if (!vp || *vp == 0) ++ continue; ++ if (strcmp(xp, "mnt_id") == 0 && (ul = strtoul(vp, &ep, 0)) != ULONG_MAX && ep && *ep == 0) { ++ mnt_id = (int)ul; ++ break; ++ } ++ } ++ fclose(fp); ++ close(fd); ++ } + return mnt_id; +} +#endif @@ -964,12 +1005,7 @@ index 03e6237..79d44ef 100644 +#if defined(HAS_NAME_TO_HANDLE_AT) + if (mnt_id >= 0) { + list_t *ptr; - -- /* Sort mount points accordingly to the reverse mount order */ -- initial(&sort); -- for (mid = 1; mid <= max; mid++) { -- list_t *ptr, *tmp; -- list_for_each_safe(ptr, tmp, &mntinfo) { ++ + errno = ENOENT; + list_for_each(ptr, &mntinfo) { mntinfo_t *mnt = list_entry(ptr, mntinfo_t); @@ -1047,12 +1083,12 @@ index 03e6237..79d44ef 100644 - if (mid != mnt->parid) + + if (nlen != mnt->nlen) -+ continue; -+ -+ if (strcmp(use, mnt->mpoint)) continue; - move_head(ptr, &sort); + ++ if (strcmp(use, mnt->mpoint)) ++ continue; ++ + ret = 0; + errno = 0; + *mountinfo = mnt; @@ -1078,7 +1114,7 @@ index 03e6237..79d44ef 100644 /* * Determine device of links below /proc/ */ -@@ -2126,8 +2527,7 @@ static int mntstat(const char *path, struct stat *buf) +@@ -2126,8 +2560,7 @@ static int mntstat(const char *path, struct stat *buf) { char name[PATH_MAX + 1]; const char *use; @@ -1088,7 +1124,7 @@ index 03e6237..79d44ef 100644 if ((use = realpath(path, name)) == NULL || *use != '/') { -@@ -2139,27 +2539,26 @@ static int mntstat(const char *path, struct stat *buf) +@@ -2139,27 +2572,26 @@ static int mntstat(const char *path, struct stat *buf) errno = 0; return stat(path, buf); } diff --git a/psmisc.changes b/psmisc.changes index d905eed..7153501 100644 --- a/psmisc.changes +++ b/psmisc.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Feb 23 13:04:06 UTC 2022 - Dr. Werner Fink + +- Change patch 0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch + * Add a fallback if the system call name_to_handle_at() is + not supported by the used file system. + ------------------------------------------------------------------- Tue Feb 1 12:39:16 UTC 2022 - Dr. Werner Fink