fallback of name_to_handle_at
OBS-URL: https://build.opensuse.org/package/show/Base:System/psmisc?expand=0&rev=139
This commit is contained in:
parent
edde1ad604
commit
4d78edc35b
@ -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 <werner@suse.de>
|
From: Werner Fink <werner@suse.de>
|
||||||
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
|
Subject: [PATCH] Use mountinfo to be able to use the mount identity
|
||||||
|
|
||||||
which allows to distinguish different mounts with the
|
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
|
Determine the namespace of a process only once to speed
|
||||||
up the parsing of fdinfo.
|
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 <werner@suse.de>
|
Signed-off-by: Werner Fink <werner@suse.de>
|
||||||
---
|
---
|
||||||
configure.ac | 15 +-
|
configure.ac | 15 +-
|
||||||
src/fuser.c | 701 +++++++++++++++++++++++++++++++++++++++-----------
|
src/fuser.c | 734 +++++++++++++++++++++++++++++++++++++++-----------
|
||||||
src/fuser.h | 25 +-
|
src/fuser.h | 25 +-
|
||||||
src/timeout.c | 5 +-
|
src/timeout.c | 5 +-
|
||||||
4 files changed, 585 insertions(+), 161 deletions(-)
|
4 files changed, 618 insertions(+), 161 deletions(-)
|
||||||
|
|
||||||
diff --git configure.ac configure.ac
|
diff --git configure.ac configure.ac
|
||||||
index 182a0df..d4dee51 100644
|
index 182a0df..d4dee51 100644
|
||||||
@ -67,7 +70,7 @@ index 182a0df..d4dee51 100644
|
|||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
diff --git src/fuser.c src/fuser.c
|
diff --git src/fuser.c src/fuser.c
|
||||||
index 03e6237..79d44ef 100644
|
index 03e6237..ee2ba15 100644
|
||||||
--- src/fuser.c
|
--- src/fuser.c
|
||||||
+++ src/fuser.c
|
+++ src/fuser.c
|
||||||
@@ -32,6 +32,8 @@
|
@@ -32,6 +32,8 @@
|
||||||
@ -674,11 +677,11 @@ index 03e6237..79d44ef 100644
|
|||||||
- continue;
|
- continue;
|
||||||
- find_mountp++;
|
- find_mountp++;
|
||||||
- if ((find_space = strchr(find_mountp, ' ')) == NULL)
|
- 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)
|
+ if (timeout(thestat, find_mountp, &st, 5) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
- *find_space = '\0';
|
||||||
|
- if (timeout(thestat, find_mountp, &st, 5) != 0) {
|
||||||
|
- continue;
|
||||||
- }
|
- }
|
||||||
+
|
+
|
||||||
/* Scan the devices */
|
/* Scan the devices */
|
||||||
@ -747,7 +750,7 @@ index 03e6237..79d44ef 100644
|
|||||||
{
|
{
|
||||||
list_t *ptr, *tmp;
|
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);
|
+ stat(mpoint, &st);
|
||||||
+ mntinf->dev = st.st_dev; /* stat(2) on binary does not see subvol dev */
|
+ 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
|
+#else
|
||||||
+ if ((mnt = fopen(PROC_MOUNTS, "r")) == (FILE *) 0)
|
+ if ((mnt = fopen(PROC_MOUNTS, "r")) == (FILE *) 0)
|
||||||
+ return;
|
+ return;
|
||||||
@ -822,17 +834,8 @@ index 03e6237..79d44ef 100644
|
|||||||
+ if (mntinf && strncmp(devname, "/dev/", 5) == 0 && stat(devname, &st) == 0) {
|
+ if (mntinf && strncmp(devname, "/dev/", 5) == 0 && stat(devname, &st) == 0) {
|
||||||
+ if (st.st_rdev != 0 && mntinf->dev != st.st_rdev)
|
+ if (st.st_rdev != 0 && mntinf->dev != st.st_rdev)
|
||||||
+ mntinf->vol = 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
|
+#endif
|
||||||
fclose(mnt);
|
fclose(mnt);
|
||||||
+}
|
+}
|
||||||
@ -920,7 +923,12 @@ index 03e6237..79d44ef 100644
|
|||||||
+ }
|
+ }
|
||||||
+ return ret == 2 ? 0 : -1;
|
+ 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)
|
+#if defined(HAS_NAME_TO_HANDLE_AT)
|
||||||
+static ino_t
|
+static ino_t
|
||||||
+get_namespace(const pid_t pid)
|
+get_namespace(const pid_t pid)
|
||||||
@ -943,8 +951,41 @@ index 03e6237..79d44ef 100644
|
|||||||
+ int mnt_id = -1;
|
+ int mnt_id = -1;
|
||||||
+
|
+
|
||||||
+ errno = 0;
|
+ errno = 0;
|
||||||
+ if (name_to_handle_at(0, path, &fh.handle, &mnt_id, 0) == -1)
|
+ if (name_to_handle_at(0, path, &fh.handle, &mnt_id, 0) == -1) {
|
||||||
+ mnt_id = -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;
|
+ return mnt_id;
|
||||||
+}
|
+}
|
||||||
+#endif
|
+#endif
|
||||||
@ -964,12 +1005,7 @@ index 03e6237..79d44ef 100644
|
|||||||
+#if defined(HAS_NAME_TO_HANDLE_AT)
|
+#if defined(HAS_NAME_TO_HANDLE_AT)
|
||||||
+ if (mnt_id >= 0) {
|
+ if (mnt_id >= 0) {
|
||||||
+ list_t *ptr;
|
+ 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;
|
+ errno = ENOENT;
|
||||||
+ list_for_each(ptr, &mntinfo) {
|
+ list_for_each(ptr, &mntinfo) {
|
||||||
mntinfo_t *mnt = list_entry(ptr, mntinfo_t);
|
mntinfo_t *mnt = list_entry(ptr, mntinfo_t);
|
||||||
@ -1047,12 +1083,12 @@ index 03e6237..79d44ef 100644
|
|||||||
- if (mid != mnt->parid)
|
- if (mid != mnt->parid)
|
||||||
+
|
+
|
||||||
+ if (nlen != mnt->nlen)
|
+ if (nlen != mnt->nlen)
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ if (strcmp(use, mnt->mpoint))
|
|
||||||
continue;
|
continue;
|
||||||
- move_head(ptr, &sort);
|
- move_head(ptr, &sort);
|
||||||
+
|
+
|
||||||
|
+ if (strcmp(use, mnt->mpoint))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
+ ret = 0;
|
+ ret = 0;
|
||||||
+ errno = 0;
|
+ errno = 0;
|
||||||
+ *mountinfo = mnt;
|
+ *mountinfo = mnt;
|
||||||
@ -1078,7 +1114,7 @@ index 03e6237..79d44ef 100644
|
|||||||
/*
|
/*
|
||||||
* Determine device of links below /proc/
|
* 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];
|
char name[PATH_MAX + 1];
|
||||||
const char *use;
|
const char *use;
|
||||||
@ -1088,7 +1124,7 @@ index 03e6237..79d44ef 100644
|
|||||||
|
|
||||||
if ((use = realpath(path, name)) == NULL || *use != '/')
|
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;
|
errno = 0;
|
||||||
return stat(path, buf);
|
return stat(path, buf);
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Feb 23 13:04:06 UTC 2022 - Dr. Werner Fink <werner@suse.de>
|
||||||
|
|
||||||
|
- 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 <werner@suse.de>
|
Tue Feb 1 12:39:16 UTC 2022 - Dr. Werner Fink <werner@suse.de>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user