]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: collect the device number for mqueue fs in the initialization stage
authorMasatake YAMATO <yamato@redhat.com>
Mon, 18 Sep 2023 06:39:39 +0000 (15:39 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Mon, 18 Sep 2023 09:16:26 +0000 (18:16 +0900)
Though lsfd reads device minor numbers for file-systems having "nodev"
from /proc/$pid/mountinfo, we observed lsfd failed to resolve the
values of SOURCE column for mqueue files on s390 CI/CD env. It seems
that /proc/$pid/mountinfo doesn't provide enough information.

This change makes lsfd open a mqueue file in lsfd's initialization
stage as a new data source for resolving; lsfd can collect an
actually-used minor number from the file descriptor with fstat(2).

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
meson.build
misc-utils/Makemodule.am
misc-utils/lsfd-file.c

index 8e3d6bb1d93dfc42afc4e1514bbd5b2a9fdeb630..6c23797beba122548ca1de01871c611fbbaadad9 100644 (file)
@@ -2615,12 +2615,16 @@ if not is_disabler(exe)
   bashcompletions += ['lsblk']
 endif
 
+mq_libs = []
+mq_libs += cc.find_library('rt', required : true)
+
 exe = executable(
   'lsfd',
   lsfd_sources,
   include_directories : includes,
   link_with : [lib_common,
                lib_smartcols],
+  dependencies : mq_libs,
   install_dir : usrbin_exec_dir,
   install : true)
 if not is_disabler(exe)
@@ -3377,9 +3381,6 @@ exe = executable(
   build_by_default: program_tests)
 exes += exe
 
-mq_libs = []
-mq_libs += cc.find_library('rt', required : true)
-
 if LINUX
   exe = executable(
     'test_mkfds',
index dd6204afdd0385e2f67d5f7a0467433452fa3ab9..e794d8cb1202433773db509e1ada01263fd2af9b 100644 (file)
@@ -267,7 +267,7 @@ lsfd_SOURCES = \
        misc-utils/lsfd-sock-xinfo.c \
        misc-utils/lsfd-unkn.c \
        misc-utils/lsfd-fifo.c
-lsfd_LDADD = $(LDADD) libsmartcols.la libcommon.la
+lsfd_LDADD = $(LDADD) $(MQ_LIBS) libsmartcols.la libcommon.la
 lsfd_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir)
 endif
 
index 186ce62e5e3541dc724b747e23d69a21e80a514f..f65910d31caf8f51b81befdae052ce8493b5d7d8 100644 (file)
 #include <linux/sched.h>
 #include <sys/shm.h>
 
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <mqueue.h>            /* mq_open */
+
 #include "buffer.h"
 #include "idcache.h"
 #include "strutils.h"
@@ -460,6 +464,34 @@ static unsigned long get_minor_for_sysvipc(void)
        return m;
 }
 
+static unsigned long get_minor_for_mqueue(void)
+{
+       mqd_t mq;
+       char mq_name[BUFSIZ];
+       struct mq_attr attr = {
+               .mq_maxmsg = 1,
+               .mq_msgsize = 1,
+       };
+
+       pid_t self = getpid();
+       struct stat sb;
+
+       snprintf(mq_name, sizeof(mq_name), "/.lsfd-mqueue-nodev-test:%d", self);
+       mq = mq_open(mq_name, O_CREAT|O_EXCL | O_RDONLY, S_IRUSR | S_IWUSR, &attr);
+       if (mq < 0)
+               return 0;
+
+       if (fstat((int)mq, &sb) < 0) {
+               mq_close(mq);
+               mq_unlink(mq_name);
+               return 0;
+       }
+
+       mq_close(mq);
+       mq_unlink(mq_name);
+       return minor(sb.st_dev);
+}
+
 static void file_class_initialize(void)
 {
        unsigned long m;
@@ -474,6 +506,10 @@ static void file_class_initialize(void)
        m = get_minor_for_sysvipc();
        if (m)
                add_nodev(m, "tmpfs");
+
+       m = get_minor_for_mqueue();
+       if (m)
+               add_nodev(m, "mqueue");
 }
 
 static void file_class_finalize(void)