Linux Container Development
 help / color / mirror / Atom feed
From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
To: Dave Hansen <dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Cc: containers
	<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
	"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org,
	Ingo Molnar <mingo-X9Un+BFzKDI@public.gmane.org>,
	Alexey Dobriyan
	<adobriyan-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: Re: [RFC][PATCH 5/8] add f_op for checkpointability
Date: Fri, 27 Feb 2009 18:14:12 -0800	[thread overview]
Message-ID: <20090228021412.GD19872@us.ibm.com> (raw)
In-Reply-To: <20090227203431.D1E697CB@kernel>

Dave Hansen [dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org] wrote:
| 
| We have set up sane defaults for how filesystems should
| be checkpointed.  However, as usual in the VFS, there
| are specialized places that will always need an ability
| to override these defaults.
| 
| This adds a new 'file_operations' function for
| checkpointing a file.  I did this under the assumption
| that we should have a dirt-simple way to make something
| (un)checkpointable that fits in with current code.
| 
| As you can see in the /dev/null patch in a second, all
| that we have to do to make something like /dev/null
| supported is add a single "generic" f_op entry.
| 
| Signed-off-by: Dave Hansen <dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
| ---
| 
|  linux-2.6.git-dave/checkpoint/ckpt_file.c     |   77 ++++++++++++++++----------
|  linux-2.6.git-dave/include/linux/checkpoint.h |    6 ++
|  linux-2.6.git-dave/include/linux/fs.h         |    4 +
|  3 files changed, 60 insertions(+), 27 deletions(-)
| 
| diff -puN checkpoint/ckpt_file.c~f_op-for-checkpointability checkpoint/ckpt_file.c
| --- linux-2.6.git/checkpoint/ckpt_file.c~f_op-for-checkpointability	2009-02-27 12:07:39.000000000 -0800
| +++ linux-2.6.git-dave/checkpoint/ckpt_file.c	2009-02-27 12:07:39.000000000 -0800
| @@ -104,56 +104,79 @@ int cr_explain_file(struct file *file, c
|  	return 0;
|  }
| 
| -int cr_file_supported(struct file *file)
| +typedef int (do_checkpoint_t)(struct file *, struct cr_ctx *,
| +			      struct cr_hdr_fd *);
| +
| +int generic_file_checkpoint(struct file *file, struct cr_ctx *ctx,
| +			 struct cr_hdr_fd *hh)
| +{
| +	/*
| +	 * A NULL hh means to make a trial run not
| +	 * actually writing data.  Just determine
| +	 * if the file is checkpointable.
| +	 */
| +	if (!hh)
| +		return 0;
| +
| +	hh->f_flags = file->f_flags;
| +	hh->f_mode = file->f_mode;
| +	hh->f_pos = file->f_pos;
| +	hh->f_version = file->f_version;
| +	/* FIX: need also file->uid, file->gid, file->f_owner, etc */
| +
| +	return 0;
| +}
| +
| +do_checkpoint_t *cr_file_get_func(struct file *file)
|  {

Do we really need this helper ? IOW do callers need this function pointer
itself ? Or can we have a more generic helper that callers can use both
check if checkpoint is possible (pass NULL in ctx and hh) and to actually
checkpoint. Something like:

	int cr_file_checkpoint(file, ctx, hh)
	{
		int rc = -1;

		if (!cr_fs_checkpointable(fstype))
			return rc;
		
		if (!cr_file_checkpointable(file))
			return rc;

		if (special_file(file))
			return rc;

		op = file->f_op->checkpoint;
		if (!op)
			op = generic_file_checkpoint;

		return (*op)(file, ctx, hh);
	}



|  	struct inode *inode = file->f_dentry->d_inode;
|  	struct file_system_type *fs_type = inode->i_sb->s_type;
| 
| -	if (fs_is_cr_able(fs_type))
| -		return 0;
| +	if (file->f_op->checkpoint)
| +		return file->f_op->checkpoint;
| +
| +	if (!fs_is_cr_able(fs_type))
| +		return NULL;
| 
|  	if (special_file(inode->i_mode))
| -		return 0;
| +		return NULL;
| 
| -	return 1;
| +	return generic_file_checkpoint;
| +}
| +
| +int cr_file_supported(struct file *file)
| +{
| +	do_checkpoint_t *func = cr_file_get_func(file);
| +
| +	if (func)
| +		return !func(file, NULL, NULL);
| +
| +	return 0;
|  }
| 
|  /* cr_write_fd_data - dump the state of a given file pointer */
|  static int cr_write_fd_data(struct cr_ctx *ctx, struct file *file, int parent)
|  {
| +	do_checkpoint_t *ckpt_func;
|  	struct cr_hdr h;
|  	struct cr_hdr_fd *hh = cr_hbuf_get(ctx, sizeof(*hh));
| -	struct dentry *dent = file->f_dentry;
| -	struct inode *inode = dent->d_inode;
| -	enum fd_type fd_type;
|  	int ret;
| 
|  	h.type = CR_HDR_FD_DATA;
|  	h.len = sizeof(*hh);
|  	h.parent = parent;
| 
| -	hh->f_flags = file->f_flags;
| -	hh->f_mode = file->f_mode;
| -	hh->f_pos = file->f_pos;
| -	hh->f_version = file->f_version;
| -	/* FIX: need also file->uid, file->gid, file->f_owner, etc */
| -
| -	switch (inode->i_mode & S_IFMT) {
| -	case S_IFREG:
| -		fd_type = CR_FD_FILE;
| -		break;
| -	case S_IFDIR:
| -		fd_type = CR_FD_DIR;
| -		break;
| -	default:
| -		cr_hbuf_put(ctx, sizeof(*hh));
| -		return -EBADF;
| -	}
| +	ckpt_func = cr_file_get_func(file);
| +	ret = -EBADF;
| +	if (!ckpt_func)
| +		goto out;
| 
| -	/* FIX: check if the file/dir/link is unlinked */
| -	hh->fd_type = fd_type;
| +	ret = ckpt_func(file, ctx, hh);
| +	if (ret)
| +		goto out;

So we can combine these two steps into just one ?

	ret = -EBADF;
	hh->fd_type = fd_type;
	if (cr_file_checkpoint(file, ctx, hh))
		goto out;

| 
|  	ret = cr_write_obj(ctx, &h, hh);
| +out:
|  	cr_hbuf_put(ctx, sizeof(*hh));
|  	if (ret < 0)
|  		return ret;

Sukadev

  reply	other threads:[~2009-02-28  2:14 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20090227203425.F3B51176@kernel>
2009-02-27 20:34 ` [RFC][PATCH 2/8] breakout fdinfo sprintf() into its own function Dave Hansen
2009-02-27 20:56   ` Vegard Nossum
     [not found]   ` <19f34abd0902271256r49a06336rcba56234c06645a7@mail.gmail.com>
     [not found]     ` <19f34abd0902271256r49a06336rcba56234c06645a7-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-02-27 21:23       ` Dave Hansen
2009-02-27 20:34 ` [RFC][PATCH 3/8] create fs flags to mark c/r supported fs's Dave Hansen
2009-02-27 21:16   ` Alexey Dobriyan
     [not found]     ` <20090227211620.GA3326-2ev+ksY9ol182hYKe6nXyg@public.gmane.org>
2009-02-27 21:20       ` Dave Hansen
2009-02-27 20:34 ` [RFC][PATCH 4/8] file c/r: expose functions to query fs support Dave Hansen
2009-02-27 21:14   ` Sukadev Bhattiprolu
     [not found]   ` <20090227211408.GB19872@us.ibm.com>
     [not found]     ` <20090227211408.GB19872-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-27 21:24       ` Dave Hansen
     [not found]     ` <1235769880.26788.394.camel@nimitz>
2009-02-27 21:32       ` Dave Hansen
2009-02-28  1:33   ` Sukadev Bhattiprolu
2009-02-27 20:34 ` [RFC][PATCH 5/8] add f_op for checkpointability Dave Hansen
2009-02-28  2:14   ` Sukadev Bhattiprolu [this message]
     [not found]     ` <20090228021412.GD19872-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-28  2:51       ` Dave Hansen
2009-02-28 20:53   ` Christoph Hellwig
     [not found]   ` <20090228205329.GB4254@infradead.org>
     [not found]     ` <20090228205329.GB4254-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2009-02-28 21:37       ` Dave Hansen
2009-03-02 17:05       ` Dave Hansen
     [not found]     ` <1235857026.26788.421.camel@nimitz>
2009-03-01 15:19       ` Serge E. Hallyn
     [not found]     ` <1236013556.26788.466.camel@nimitz>
2009-03-03 13:15       ` Christoph Hellwig
     [not found]       ` <20090303131528.GB10931@infradead.org>
     [not found]         ` <20090303131528.GB10931-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2009-03-20 21:13           ` Dave Hansen
     [not found]         ` <1237583604.8286.294.camel@nimitz>
2009-03-20 21:30           ` Oren Laadan
2009-02-27 20:34 ` [RFC][PATCH 6/8] mark /dev/null and zero as checkpointable Dave Hansen
2009-02-27 20:34 ` [RFC][PATCH 7/8] add c/r info to fdinfo Dave Hansen
2009-02-27 20:34 ` [RFC][PATCH 8/8] check files for checkpointability Dave Hansen
2009-02-28  2:57   ` Sukadev Bhattiprolu
     [not found]   ` <20090228025743.GA22451@us.ibm.com>
     [not found]     ` <20090228025743.GA22451-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-03-01 17:00       ` Serge E. Hallyn
2009-03-04 23:41       ` Dave Hansen
2009-03-01 19:43   ` Serge E. Hallyn
2009-03-02 13:37   ` Serge E. Hallyn
     [not found]   ` <20090302133754.GA8033@us.ibm.com>
     [not found]     ` <20090302133754.GA8033-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-03-02 15:56       ` Dave Hansen
2009-03-02 15:59       ` Nathan Lynch
     [not found]     ` <20090302095917.6cfeda55@thinkcentre.lan>
     [not found]       ` <20090302095917.6cfeda55-4v5LP+xe+1byhTdZtsIeww@public.gmane.org>
2009-03-02 16:27         ` Dave Hansen
2009-03-02 16:28         ` Serge E. Hallyn
     [not found]       ` <1236011251.26788.450.camel@nimitz>
2009-03-02 17:22         ` Nathan Lynch
     [not found]         ` <20090302112247.76bb3662@thinkcentre.lan>
     [not found]           ` <20090302112247.76bb3662-4v5LP+xe+1byhTdZtsIeww@public.gmane.org>
2009-03-02 17:30             ` Dave Hansen
     [not found]           ` <1236015052.26788.471.camel@nimitz>
2009-03-02 17:44             ` Serge E. Hallyn
     [not found]             ` <20090302174433.GA12708@us.ibm.com>
     [not found]               ` <20090302174433.GA12708-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-03-02 17:58                 ` Dave Hansen
2009-03-02 18:13                 ` Dave Hansen
2009-03-02 18:35                   ` Serge E. Hallyn
2009-03-05  8:20                   ` Cedric Le Goater

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090228021412.GD19872@us.ibm.com \
    --to=sukadev-23vcf4htsmix0ybbhkvfkdbpr1lh4cv8@public.gmane.org \
    --cc=adobriyan-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
    --cc=hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mingo-X9Un+BFzKDI@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox