kernel - Add uid, gid, and inum to stat data for pipes
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 21 Nov 2018 20:37:08 +0000 (12:37 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 21 Nov 2018 20:37:08 +0000 (12:37 -0800)
* fstat(pipefd) now populations additional fields. uid, gid,
  and inum.  In-line with other BSDs and Linux.  Not sure why
  any program would use the inum field but... now its populated.

* Add an anonymous inode allocator to the pcpu structure.  No
  atomic ops required.  Basically just does:

  pipe->inum = gd->gd_anoninum++ * ncpus + gd->gd_cpuid + 2;

* Facility can be used for other things as needed.

Suggested-by: mjg
sys/kern/sys_pipe.c
sys/sys/globaldata.h
sys/sys/pipe.h

index 0a1fa2f..556acd4 100644 (file)
@@ -406,6 +406,7 @@ pipe_create(struct pipe **pipep)
                pipe->next = NULL;
        } else {
                pipe = kmalloc(sizeof(*pipe), M_PIPE, M_WAITOK | M_ZERO);
+               pipe->inum = gd->gd_anoninum++ * ncpus + gd->gd_cpuid + 2;
                lwkt_token_init(&pipe->bufferA.rlock, "piper");
                lwkt_token_init(&pipe->bufferA.wlock, "pipew");
                lwkt_token_init(&pipe->bufferB.rlock, "piper");
@@ -1048,8 +1049,11 @@ pipe_stat(struct file *fp, struct stat *ub, struct ucred *cred)
        ub->st_atimespec = rpb->atime;
        ub->st_mtimespec = rpb->mtime;
        ub->st_ctimespec = pipe->ctime;
+       ub->st_uid = fp->f_cred->cr_uid;
+       ub->st_gid = fp->f_cred->cr_gid;
+       ub->st_ino = pipe->inum;
        /*
-        * Left as 0: st_dev, st_ino, st_nlink, st_uid, st_gid, st_rdev,
+        * Left as 0: st_dev, st_nlink, st_rdev,
         * st_flags, st_gen.
         * XXX (st_dev, st_ino) should be unique.
         */
index 70ae125..704daa6 100644 (file)
@@ -186,7 +186,7 @@ struct globaldata {
        struct lwkt_tokref gd_handoff;          /* hand-off tokref */
        void            *gd_delayed_wakeup[2];
        void            *gd_sample_pc;          /* sample program ctr/tr */
-       void            *gd_reserved_pcpu_mmap; /* future */
+       uint64_t        gd_anoninum;            /* anonymous inode (pipes) */
        uint64_t        gd_forkid;              /* per-cpu unique inc ncpus */
        void            *gd_sample_sp;          /* sample stack pointer */
        uint64_t        gd_cpumask_simple;
index c7955e9..c3a3d48 100644 (file)
@@ -93,6 +93,8 @@ struct pipe {
        struct timespec ctime;          /* time of status change */
        struct pipe     *next;
        uint32_t        open_count;
+       uint32_t        unused01;
+       uint64_t        inum;
 } __cachealign;
 
 #endif /* _KERNEL || _KERNEL_STRUCTURES */