]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: introduce new association SHM representing shared file mapping
authorMasatake YAMATO <yamato@redhat.com>
Thu, 6 May 2021 13:19:11 +0000 (22:19 +0900)
committerKarel Zak <kzak@redhat.com>
Wed, 6 Oct 2021 09:01:53 +0000 (11:01 +0200)
MEM is kept for representing private file mapping.

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

index e1b5309e304cc349ff705e75bd7826bb9725697f..16f6ab9145d8b3544c6e63c82cd8bb2c7d9bdddf 100644 (file)
@@ -47,6 +47,7 @@ static const char *assocstr[N_ASSOCS] = {
        [ASSOC_NS_USER]   = "user",
        [ASSOC_NS_UTS]    = "uts",
        [ASSOC_MEM]       = "mem",
+       [ASSOC_SHM]       = "shm",
 };
 
 static const char *strftype(mode_t ftype)
index 5f33868ad64da2a4e4683366cd32cb7f8e11b69d..0a76066143c37ba91841c77a25a189872bead65e 100644 (file)
@@ -420,12 +420,29 @@ static struct file *collect_fd_file(int dd, struct dirent *dp, void *data)
        return f;
 }
 
+static struct map *find_map(struct list_head *maps, unsigned long start_addr)
+{
+       struct list_head *m;
+
+       list_for_each(m, maps) {
+               struct map *map = list_entry(m, struct map, maps);
+               if (map->mem_addr_start == start_addr)
+                       return map;
+       }
+       return NULL;
+}
+
 static struct file *collect_mem_file(int dd, struct dirent *dp,
-                                    void *data __attribute__((__unused__)))
+                                    void *data)
 {
+       struct list_head *maps = data;
        struct stat sb;
        ssize_t len;
        char sym[PATH_MAX];
+       struct file *f;
+       unsigned long start, end;
+       struct map *map;
+       enum association assoc;
 
        if (fstatat(dd, dp->d_name, &sb, 0) < 0)
                return NULL;
@@ -434,7 +451,16 @@ static struct file *collect_mem_file(int dd, struct dirent *dp,
        if ((len = readlinkat(dd, dp->d_name, sym, sizeof(sym) - 1)) < 0)
                return NULL;
 
-       return collect_file(&sb, sym, -ASSOC_MEM);
+
+       map = NULL;
+       if (sscanf(dp->d_name, "%lx-%lx", &start, &end) == 2)
+               map = find_map(maps, start);
+
+       assoc = (map && map->shared)? ASSOC_SHM: ASSOC_MEM;
+       f = collect_file(&sb, sym, -assoc);
+       if (!f)
+               return NULL;
+       return f;
 }
 
 static void enqueue_file(struct proc *proc, struct file * file)
index 99037c5d0fea1c3b220b0e66367326421ce84941..d6a35f660c1c4b32715084296b8c4bb5d13f4576 100644 (file)
@@ -91,7 +91,8 @@ enum association {
        ASSOC_NS_TIME4C,
        ASSOC_NS_USER,
        ASSOC_NS_UTS,
-       ASSOC_MEM,
+       ASSOC_MEM,              /* private file mapping */
+       ASSOC_SHM,              /* shared file mapping */
        N_ASSOCS,
 };