The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=bda73e441f2576de5ad00856d758354c299a3f75

commit bda73e441f2576de5ad00856d758354c299a3f75
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2024-10-07 01:44:49 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2024-10-08 12:38:03 +0000

    posix shm: add shm_get_path(9)
    
    to calculate the posix shm path from the vm_object backing shm segment.
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D46970
---
 sys/kern/uipc_shm.c | 31 +++++++++++++++++++++++++++++++
 sys/sys/mman.h      |  1 +
 2 files changed, 32 insertions(+)

diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index cf98e1410074..f6861a3278ff 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -2208,3 +2208,34 @@ sys_shm_open2(struct thread *td, struct shm_open2_args 
*uap)
        return (kern_shm_open2(td, uap->path, uap->flags, uap->mode,
            uap->shmflags, NULL, uap->name));
 }
+
+int
+shm_get_path(struct vm_object *obj, char *path, size_t sz)
+{
+       struct shmfd *shmfd;
+       int error;
+
+       error = 0;
+       shmfd = NULL;
+       sx_slock(&shm_dict_lock);
+       VM_OBJECT_RLOCK(obj);
+       if ((obj->flags & OBJ_POSIXSHM) == 0) {
+               error = EINVAL;
+       } else {
+               if (obj->type == shmfd_pager_type)
+                       shmfd = obj->un_pager.swp.swp_priv;
+               else if (obj->type == OBJT_PHYS)
+                       shmfd = obj->un_pager.phys.phys_priv;
+               if (shmfd == NULL) {
+                       error = ENXIO;
+               } else {
+                       strlcpy(path, shmfd->shm_path == NULL ? "anon" :
+                           shmfd->shm_path, sz);
+               }
+       }
+       if (error != 0)
+               path[0] = '\0';
+       VM_OBJECT_RUNLOCK(obj);
+       sx_sunlock(&shm_dict_lock);
+       return (error);
+}
diff --git a/sys/sys/mman.h b/sys/sys/mman.h
index 6ee2d5562db1..d2c7bdf1f022 100644
--- a/sys/sys/mman.h
+++ b/sys/sys/mman.h
@@ -310,6 +310,7 @@ void        shm_drop(struct shmfd *shmfd);
 int    shm_dotruncate(struct shmfd *shmfd, off_t length);
 bool   shm_largepage(struct shmfd *shmfd);
 void   shm_remove_prison(struct prison *pr);
+int    shm_get_path(struct vm_object *obj, char *path, size_t sz);
 
 extern struct fileops shm_ops;
 

Reply via email to