Date: Mon, 8 Sep 2014 04:50:53 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 1199378 for review Message-ID: <201409080450.s884ordg026184@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@1199378?ac=10 Change 1199378 by jhb@jhb_jhbbsd on 2014/08/26 16:04:20 First cut at providing fake st_dev/st_ino for POSIX shm fds similar to pipes (except that they aren't allocated lazily for simplicity) Affected files ... .. //depot/projects/smpng/sys/kern/uipc_shm.c#24 edit Differences ... ==== //depot/projects/smpng/sys/kern/uipc_shm.c#24 (text+ko) ==== @@ -101,6 +101,8 @@ static struct sx shm_dict_lock; static struct mtx shm_timestamp_lock; static u_long shm_hash; +static struct unrhdr *shm_ino_unr; +static dev_t shm_dev_ino; #define SHM_HASH(fnv) (&shm_dictionary[(fnv) & shm_hash]) @@ -408,6 +410,8 @@ sb->st_uid = shmfd->shm_uid; sb->st_gid = shmfd->shm_gid; mtx_unlock(&shm_timestamp_lock); + sb->st_dev = shm_dev_ino; + sb->st_ino = shmfd->shm_ino; return (0); } @@ -539,6 +543,7 @@ shm_alloc(struct ucred *ucred, mode_t mode) { struct shmfd *shmfd; + int ino; shmfd = malloc(sizeof(*shmfd), M_SHMFD, M_WAITOK | M_ZERO); shmfd->shm_size = 0; @@ -555,6 +560,11 @@ vfs_timestamp(&shmfd->shm_birthtime); shmfd->shm_atime = shmfd->shm_mtime = shmfd->shm_ctime = shmfd->shm_birthtime; + ino = alloc_unr(shm_ino_unr); + if (ino == -1) + shmfd->shm_ino = 0; + else + shmfd->shm_ino = ino; refcount_init(&shmfd->shm_refs, 1); mtx_init(&shmfd->shm_mtx, "shmrl", NULL, MTX_DEF); rangelock_init(&shmfd->shm_rl); @@ -585,6 +595,8 @@ rangelock_destroy(&shmfd->shm_rl); mtx_destroy(&shmfd->shm_mtx); vm_object_deallocate(shmfd->shm_object); + if (shmfd->shm_ino != 0) + free_unr(shm_ino_unr, shmfd->shm_ino); free(shmfd, M_SHMFD); } } @@ -617,14 +629,18 @@ * the mappings in a hash table. */ static void -shm_dict_init(void *arg) +shm_init(void *arg) { mtx_init(&shm_timestamp_lock, "shm timestamps", NULL, MTX_DEF); sx_init(&shm_dict_lock, "shm dictionary"); shm_dictionary = hashinit(1024, M_SHMFD, &shm_hash); + shm_ino_unr = new_unrhdr(1, INT32_MAX, NULL); + KASSERT(shm_ino_unr != NULL, ("shm fake inodes not initialized")); + shm_dev_ino = devfs_alloc_cdp_inode(); + KASSERT(shm_dev_ino > 0, ("shm dev inode not initialized")); } -SYSINIT(shm_dict_init, SI_SUB_SYSV_SHM, SI_ORDER_ANY, shm_dict_init, NULL); +SYSINIT(shm_init, SI_SUB_SYSV_SHM, SI_ORDER_ANY, shm_init, NULL); static struct shmfd * shm_lookup(char *path, Fnv32_t fnv)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409080450.s884ordg026184>