From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sukadev Bhattiprolu Subject: [PATCH 3/9][cr][v2]: Checkpoint file-owner information Date: Tue, 18 May 2010 20:07:26 -0700 Message-ID: <1274238452-15382-4-git-send-email-sukadev@linux.vnet.ibm.com> References: <1274238452-15382-1-git-send-email-sukadev@linux.vnet.ibm.com> Cc: serue@us.ibm.com, Matt Helsley , matthew@wil.cx, , Containers To: Oren Laadan Return-path: Received: from e8.ny.us.ibm.com ([32.97.182.138]:47045 "EHLO e8.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753766Ab0ESDBZ (ORCPT ); Tue, 18 May 2010 23:01:25 -0400 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e8.ny.us.ibm.com (8.14.3/8.13.1) with ESMTP id o4J2orYs019833 for ; Tue, 18 May 2010 22:50:53 -0400 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o4J31OFR165526 for ; Tue, 18 May 2010 23:01:24 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o4J31OTq011656 for ; Tue, 18 May 2010 23:01:24 -0400 In-Reply-To: <1274238452-15382-1-git-send-email-sukadev@linux.vnet.ibm.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Checkpoint the file->f_owner information for an open file. This information will be used to restore the file-owner information when the application is restarted from the checkpoint. The file->f_owner information is "private" to each 'struct file' i.e. fown_struct is not an external object shared with other file structures. So the information can directly be added to the 'ckpt_hdr_file' object. Signed-off-by: Sukadev Bhattiprolu --- fs/checkpoint.c | 27 +++++++++++---------------- include/linux/checkpoint_hdr.h | 5 +++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fs/checkpoint.c b/fs/checkpoint.c index e036a7a..0fa4ce8 100644 --- a/fs/checkpoint.c +++ b/fs/checkpoint.c @@ -168,12 +168,19 @@ int checkpoint_file_common(struct ckpt_ctx *ctx, struct file *file, struct ckpt_hdr_file *h) { struct cred *f_cred = (struct cred *) file->f_cred; + struct pid *pid = file->f_owner.pid; h->f_flags = file->f_flags; h->f_mode = file->f_mode; h->f_pos = file->f_pos; h->f_version = file->f_version; + h->f_owner_pid = pid_nr_ns(pid, ns_of_pid(pid)); + h->f_owner_pid_type = file->f_owner.pid_type; + h->f_owner_uid = file->f_owner.uid; + h->f_owner_euid = file->f_owner.euid; + h->f_owner_signum = file->f_owner.signum; + h->f_credref = checkpoint_obj(ctx, f_cred, CKPT_OBJ_CRED); if (h->f_credref < 0) return h->f_credref; @@ -184,10 +191,10 @@ int checkpoint_file_common(struct ckpt_ctx *ctx, struct file *file, return h->f_secref; } - ckpt_debug("file %s credref %d secref %d\n", - file->f_dentry->d_name.name, h->f_credref, h->f_secref); - - /* FIX: need also file->f_owner, etc */ + ckpt_debug("file %s credref %d secref %d, fowner-pid %d, type %d, " + "fowner-signum %d\n", file->f_dentry->d_name.name, + h->f_credref, h->f_secref, h->f_owner_pid, + h->f_owner_pid_type, h->f_owner_signum); return 0; } @@ -267,7 +274,6 @@ static int checkpoint_file_desc(struct ckpt_ctx *ctx, struct fdtable *fdt; int objref, ret; int coe = 0; /* avoid gcc warning */ - pid_t pid; h = ckpt_hdr_get_type(ctx, sizeof(*h), CKPT_HDR_FILE_DESC); if (!h) @@ -302,17 +308,6 @@ static int checkpoint_file_desc(struct ckpt_ctx *ctx, } /* - * TODO: Implement c/r of fowner and f_sigio. Should be - * trivial, but for now we just refuse its checkpoint - */ - pid = f_getown(file); - if (pid) { - ret = -EBUSY; - ckpt_err(ctx, ret, "%(T)fd %d has an owner (%d)\n", fd); - goto out; - } - - /* * if seen first time, this will add 'file' to the objhash, keep * a reference to it, dump its state while at it. */ diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h index 790214f..44e2a0d 100644 --- a/include/linux/checkpoint_hdr.h +++ b/include/linux/checkpoint_hdr.h @@ -570,6 +570,11 @@ struct ckpt_hdr_file { __u64 f_pos; __u64 f_version; __s32 f_secref; + __s32 f_owner_pid; + __u32 f_owner_pid_type; + __u32 f_owner_uid; + __u32 f_owner_euid; + __s32 f_owner_signum; } __attribute__((aligned(8))); struct ckpt_hdr_file_generic { -- 1.6.0.4