From 56ed79f0a5711bb9dd10d1d179162b5e955693dd Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Fri, 5 Mar 2021 14:12:24 +0000 Subject: [PATCH] Fix bsc#1178407 OBS-URL: https://build.opensuse.org/package/show/Base:System/psmisc?expand=0&rev=129 --- ...to-be-able-to-use-the-mount-identity.patch | 74 ++++++++++--------- psmisc.changes | 7 ++ 2 files changed, 48 insertions(+), 33 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 39bb7b2..e734897 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 @@ -16,16 +16,19 @@ On BtrFS stat(2) on binary does not see subvol dev Allow not unique mounts as well as not unique mountpoint +Fuser does not show open kvm storage image files +such as qcow2 files. Patch from Ali Abdallah + Signed-off-by: Werner Fink --- configure.ac | 15 + - src/fuser.c | 643 ++++++++++++++++++++++++++++++++++++++++++++-------------- + src/fuser.c | 646 ++++++++++++++++++++++++++++++++++++++++++++-------------- src/fuser.h | 27 +- src/timeout.c | 5 - 4 files changed, 530 insertions(+), 160 deletions(-) + 4 files changed, 534 insertions(+), 159 deletions(-) --- configure.ac -+++ configure.ac 2021-01-14 11:14:51.192122696 +0000 ++++ configure.ac 2021-03-05 13:57:45.175585808 +0000 @@ -44,6 +44,19 @@ if test "$enable_timeout_stat" = "static fi AM_CONDITIONAL([WANT_TIMEOUT_STAT], [test "$enable_timeout_stat" = "static"]) @@ -56,7 +59,7 @@ Signed-off-by: Werner Fink dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST --- src/fuser.c -+++ src/fuser.c 2021-01-14 11:22:51.546798981 +0000 ++++ src/fuser.c 2021-03-05 14:03:20.189518326 +0000 @@ -32,6 +32,10 @@ #include #include @@ -434,32 +437,37 @@ Signed-off-by: Werner Fink char *dirpath; char filepath[PATH_MAX]; -@@ -1594,11 +1703,29 @@ check_dir(const pid_t pid, const char *d +@@ -1594,11 +1703,34 @@ check_dir(const pid_t pid, const char *d } for (dev_tmp = dev_head; dev_tmp != NULL; dev_tmp = dev_tmp->next) { - if (thedev != dev_tmp->device) ++ int subvol_found = 0; ++ + if (thedev != dev_tmp->device) { + struct subvol *vol_tmp; -+ int found = 0; + + for (vol_tmp = dev_tmp->vol; vol_tmp != NULL; + vol_tmp = vol_tmp->next) { + /* Check for BtrFS sub volumes as well */ + if (thedev == vol_tmp->device) { -+ found++; ++ subvol_found++; + break; + } + } + -+ if (!found) ++ if (!subvol_found) + continue; + } + + if (get_fdinfo(pid, direntry->d_name, &fd) != 0) + continue; -+ if (fd.mnt_id != dev_tmp->mnt_id) ++ ++ if (subvol_found && fd.mnt_id != dev_tmp->mnt_id) ++ continue; ++ else if (thedev != dev_tmp->device) continue; ++ if (access == ACCESS_FILE - && (lstat(filepath, &lst) == 0) - && (lst.st_mode & S_IWUSR)) { @@ -467,7 +475,7 @@ Signed-off-by: Werner Fink add_matched_proc(dev_tmp->name, pid, uid, ACCESS_FILEWR | -@@ -1620,9 +1747,10 @@ check_dir(const pid_t pid, const char *d +@@ -1620,9 +1752,10 @@ check_dir(const pid_t pid, const char *d continue; } if (st.st_ino == ino_tmp->inode) { @@ -480,7 +488,7 @@ Signed-off-by: Werner Fink add_matched_proc(ino_tmp->name, pid, uid, ACCESS_FILEWR | -@@ -1651,31 +1779,54 @@ check_map(const pid_t pid, const char *f +@@ -1651,31 +1784,54 @@ check_map(const pid_t pid, const char *f FILE *fp; unsigned long long tmp_inode; unsigned int tmp_maj, tmp_min; @@ -545,7 +553,7 @@ Signed-off-by: Werner Fink } fclose(fp); } -@@ -1699,6 +1850,7 @@ static uid_t getpiduid(const pid_t pid) +@@ -1699,6 +1855,7 @@ static uid_t getpiduid(const pid_t pid) * fill_unix_cache : Create a list of Unix sockets * This list is used later for matching purposes */ @@ -553,7 +561,7 @@ Signed-off-by: Werner Fink void fill_unix_cache(struct unixsocket_list **unixsocket_head) { FILE *fp; -@@ -1715,6 +1867,8 @@ void fill_unix_cache(struct unixsocket_l +@@ -1715,6 +1872,8 @@ void fill_unix_cache(struct unixsocket_l while (fgets(line, BUFSIZ, fp) != NULL) { char *path; char *scanned_path = NULL; @@ -562,7 +570,7 @@ Signed-off-by: Werner Fink if (sscanf(line, "%*x: %*x %*x %*x %*x %*d %llu %ms", &scanned_inode, &scanned_path) != 2) { if (scanned_path) -@@ -1730,6 +1884,8 @@ void fill_unix_cache(struct unixsocket_l +@@ -1730,6 +1889,8 @@ void fill_unix_cache(struct unixsocket_l free(path); continue; } @@ -571,7 +579,7 @@ Signed-off-by: Werner Fink if ((newsocket = (struct unixsocket_list *) malloc(sizeof(struct unixsocket_list))) == NULL) { free(path); -@@ -1738,6 +1894,7 @@ void fill_unix_cache(struct unixsocket_l +@@ -1738,6 +1899,7 @@ void fill_unix_cache(struct unixsocket_l newsocket->sun_name = strdup(scanned_path); newsocket->inode = st.st_ino; newsocket->dev = st.st_dev; @@ -579,7 +587,7 @@ Signed-off-by: Werner Fink newsocket->net_inode = scanned_inode; newsocket->next = *unixsocket_head; *unixsocket_head = newsocket; -@@ -1750,6 +1907,7 @@ void fill_unix_cache(struct unixsocket_l +@@ -1750,6 +1912,7 @@ void fill_unix_cache(struct unixsocket_l /* * Free up the list of Unix sockets */ @@ -587,7 +595,7 @@ Signed-off-by: Werner Fink void clear_unix_cache(struct unixsocket_list **unixsocket_head) { while(*unixsocket_head != NULL) { -@@ -1921,34 +2079,21 @@ scan_mounts(struct names *names_head, st +@@ -1921,34 +2084,21 @@ scan_mounts(struct names *names_head, st { struct device_list *dev_tmp; struct inode_list *ino_tmp; @@ -630,7 +638,7 @@ Signed-off-by: Werner Fink add_special_proc(dev_tmp->name, PTYPE_MOUNT, 0, find_mountp); } -@@ -1960,7 +2105,6 @@ scan_mounts(struct names *names_head, st +@@ -1960,7 +2110,6 @@ scan_mounts(struct names *names_head, st find_mountp); } } @@ -638,7 +646,7 @@ Signed-off-by: Werner Fink } static void -@@ -2013,16 +2157,44 @@ scan_swaps(struct names *names_head, str +@@ -2013,16 +2162,44 @@ scan_swaps(struct names *names_head, str fclose(fp); } @@ -687,7 +695,7 @@ Signed-off-by: Werner Fink { list_t *ptr, *tmp; -@@ -2033,72 +2205,247 @@ static void clear_mntinfo(void) +@@ -2033,72 +2210,247 @@ static void clear_mntinfo(void) } } @@ -747,7 +755,7 @@ Signed-off-by: Werner Fink + mntinf->dev = st.st_dev; /* stat(2) on binary does not see subvol dev */ + } + } -+ } + } +#else + if ((mnt = fopen(PROC_MOUNTS, "r")) == (FILE *) 0) + return; @@ -768,11 +776,16 @@ Signed-off-by: Werner Fink + if (st.st_rdev != 0 && mntinf->dev != st.st_rdev) + mntinf->vol = st.st_rdev; + } - } ++ } +#endif fclose(mnt); +} -+ + +- /* 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) { +static int +get_fdinfo(const pid_t pid, const char *fd, struct fdinfo *info) +{ @@ -862,12 +875,7 @@ Signed-off-by: Werner Fink + int ret = -1; + + *mountinfo = NULL; - -- /* 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 (mnt_id >= 0) { + list_t *ptr; @@ -980,7 +988,7 @@ Signed-off-by: Werner Fink /* * Determine device of links below /proc/ */ -@@ -2106,8 +2453,7 @@ static int mntstat(const char *path, str +@@ -2106,8 +2458,7 @@ static int mntstat(const char *path, str { char name[PATH_MAX + 1]; const char *use; @@ -990,7 +998,7 @@ Signed-off-by: Werner Fink if ((use = realpath(path, name)) == NULL || *use != '/') { -@@ -2119,27 +2465,26 @@ static int mntstat(const char *path, str +@@ -2119,27 +2470,26 @@ static int mntstat(const char *path, str errno = 0; return stat(path, buf); } @@ -1037,7 +1045,7 @@ Signed-off-by: Werner Fink #endif /* WITH_MOUNTINFO_LIST */ --- src/fuser.h -+++ src/fuser.h 2021-01-14 11:16:13.262529434 +0000 ++++ src/fuser.h 2021-03-05 13:57:45.215585084 +0000 @@ -37,10 +37,16 @@ struct procs { #define PTYPE_KNFSD 2 #define PTYPE_SWAP 3 @@ -1116,7 +1124,7 @@ Signed-off-by: Werner Fink #define PROC_MOUNTS "/proc/mounts" #define PROC_SWAPS "/proc/swaps" --- src/timeout.c -+++ src/timeout.c 2021-01-14 11:14:51.196122619 +0000 ++++ src/timeout.c 2021-03-05 13:57:45.215585084 +0000 @@ -67,9 +67,6 @@ # ifndef constructor # define constructor __constructor__ diff --git a/psmisc.changes b/psmisc.changes index b324e98..4f7e8ce 100644 --- a/psmisc.changes +++ b/psmisc.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Fri Mar 5 14:10:11 UTC 2021 - Dr. Werner Fink + +- Change patch 0001-Use-mountinfo-to-be-able-to-use-the-mount-identity.patch + * Fix bsc#1178407: fuser does not show open kvm storage image files + such as qcow2 files. Patch from Ali Abdallah + ------------------------------------------------------------------- Thu Jan 14 15:48:53 UTC 2021 - Dr. Werner Fink