[Devel] [PATCH 1/4] Revert "sysvipc-shm: correctly handle deleted (active) ipc shared memory"
Serge E. Hallyn
serue at us.ibm.com
Wed Apr 15 09:02:21 PDT 2009
( this patchset applies on top of v14-3-dev to turn the deferqueue into
a generic mechanism )
>From 274f58b8f265dc54e13728aa742c4852bde44ec1 Mon Sep 17 00:00:00 2001
From: Serge E. Hallyn <serue at us.ibm.com>
Date: Tue, 14 Apr 2009 16:06:41 -0700
Subject: [PATCH 1/4] Revert "sysvipc-shm: correctly handle deleted (active) ipc shared memory"
This reverts commit 373eb88b3d338edc5039d34a30a4574f9a9fdfba.
---
ipc/ckpt_shm.c | 44 ++++----------------------------------------
1 files changed, 4 insertions(+), 40 deletions(-)
diff --git a/ipc/ckpt_shm.c b/ipc/ckpt_shm.c
index c5b7f60..ee9b77a 100644
--- a/ipc/ckpt_shm.c
+++ b/ipc/ckpt_shm.c
@@ -145,25 +145,6 @@ int cr_write_ipc_shm(struct cr_ctx *ctx, struct ipc_namespace *ipcns)
* ipc restart
*/
-struct cr_dq_ipcshm_del {
- struct ipc_namespace *ipcns;
- int id;
-};
-
-static int cr_ipc_shm_delete(void *data)
-{
- struct cr_dq_ipcshm_del *dq = (struct cr_dq_ipcshm_del *) data;
- mm_segment_t old_fs;
- int ret;
-
- old_fs = get_fs();
- set_fs(get_ds());
- ret = shmctl_down(dq->ipcns, dq->id, IPC_RMID, NULL, 0);
- set_fs(old_fs);
-
- return ret;
-}
-
int cr_ipc_shm_attach(struct file *file,
unsigned long vm_addr,
unsigned long vm_flags)
@@ -243,25 +224,7 @@ static int cr_do_read_ipc_shm(struct cr_ctx *ctx)
if (hh->flags & SHM_HUGETLB) /* FIXME: support SHM_HUGETLB */
goto out;
- /*
- * SHM_DEST means that the shm is to be deleted after creation.
- * However, deleting before it's actually attached is quite silly.
- * Instead, we defer this task to until restart has succeeded.
- */
- if (hh->perms.mode & SHM_DEST) {
- struct cr_dq_ipcshm_del dq;
-
- /* to not confuse the rest of the code */
- hh->perms.mode &= ~SHM_DEST;
-
- dq.ipcns = current->nsproxy->ipc_ns;
- dq.id = hh->perms.id;
-
- ret = cr_deferqueue_add(ctx, cr_ipc_shm_delete,
- 0, &dq, sizeof(dq));
- if (ret < 0)
- goto out;
- }
+ /* FIXME: this will fail for deleted ipc shm segments */
shmflag = hh->flags | hh->perms.mode | IPC_CREAT | IPC_EXCL;
cr_debug("shm: do_shmget size %lld flag %#x id %d\n",
@@ -272,6 +235,7 @@ static int cr_do_read_ipc_shm(struct cr_ctx *ctx)
goto out;
down_write(&shm_ids->rw_mutex);
+
ret = -EIDRM;
perms = ipc_lock(shm_ids, hh->perms.id);
if (IS_ERR(perms)) { /* this should not happen .. but be safe */
@@ -297,9 +261,9 @@ static int cr_do_read_ipc_shm(struct cr_ctx *ctx)
/* deposit in objhash and read contents in */
ret = cr_obj_add_ref(ctx, file, hh->objref, CR_OBJ_FILE, 0);
if (ret < 0)
- goto fput;
+ goto file;
ret = cr_read_shmem_contents(ctx, file->f_dentry->d_inode);
- fput:
+ file:
fput(file);
out:
cr_hbuf_put(ctx, sizeof(*hh));
--
1.5.4.3
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list