diff options
author | Mark Brown <broonie@linaro.org> | 2013-10-07 17:51:17 +0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-10-07 17:51:17 +0400 |
commit | 77445a14d6a3a1f920e3b031603541fc807f5f9b (patch) | |
tree | 17a6a75a83fc602345969b29fdf7199afe2df526 /ipc/shm.c | |
parent | 57841439b62e3ddb5ee50e765aa50330dde612d0 (diff) | |
parent | 702a4879ec337463f858c8ab467482cce260bf18 (diff) | |
download | linux-77445a14d6a3a1f920e3b031603541fc807f5f9b.tar.xz |
Merge remote-tracking branch 'spi/topic/bitbang' into HEAD
Diffstat (limited to 'ipc/shm.c')
-rw-r--r-- | ipc/shm.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/ipc/shm.c b/ipc/shm.c index 2821cdf93adb..d69739610fd4 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -167,6 +167,15 @@ static inline void shm_lock_by_ptr(struct shmid_kernel *ipcp) ipc_lock_object(&ipcp->shm_perm); } +static void shm_rcu_free(struct rcu_head *head) +{ + struct ipc_rcu *p = container_of(head, struct ipc_rcu, rcu); + struct shmid_kernel *shp = ipc_rcu_to_struct(p); + + security_shm_free(shp); + ipc_rcu_free(head); +} + static inline void shm_rmid(struct ipc_namespace *ns, struct shmid_kernel *s) { ipc_rmid(&shm_ids(ns), &s->shm_perm); @@ -208,8 +217,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) user_shm_unlock(file_inode(shp->shm_file)->i_size, shp->mlock_user); fput (shp->shm_file); - security_shm_free(shp); - ipc_rcu_putref(shp); + ipc_rcu_putref(shp, shm_rcu_free); } /* @@ -497,7 +505,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) shp->shm_perm.security = NULL; error = security_shm_alloc(shp); if (error) { - ipc_rcu_putref(shp); + ipc_rcu_putref(shp, ipc_rcu_free); return error; } @@ -566,8 +574,7 @@ no_id: user_shm_unlock(size, shp->mlock_user); fput(file); no_file: - security_shm_free(shp); - ipc_rcu_putref(shp); + ipc_rcu_putref(shp, shm_rcu_free); return error; } |