[Devel] Re: [RFC v14-rc2][PATCH 10/29] actually use f_op in checkpoint code

Serge E. Hallyn serue at us.ibm.com
Wed Apr 1 11:54:22 PDT 2009


Quoting Oren Laadan (orenl at cs.columbia.edu):
> From: Dave Hansen <dave at linux.vnet.ibm.com>
> 
> Right now, we assume all normal files and directories
> can be checkpointed.  However, as usual in the VFS, there
> are specialized places that will always need an ability
> to override these defaults.  We could do this completely
> in the checkpoint code, but that would bitrot quickly.
> 
> 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 ext[234] and /proc patches, all
> that we have to do to make something simple be
> supported is add a single "generic" f_op entry.
> 
> Signed-off-by: Dave Hansen <dave at linux.vnet.ibm.com>

Oooh, I see - for some reason I was convinced you'd put this patch
further back in the stack.

Acked-by: Serge Hallyn <serue at us.ibm.com>

(of course that is assymetric with restart)

> ---
>  checkpoint/ckpt_file.c |   31 +++++++++++++++----------------
>  include/linux/fs.h     |   11 +++++++++++
>  2 files changed, 26 insertions(+), 16 deletions(-)
> 
> diff --git a/checkpoint/ckpt_file.c b/checkpoint/ckpt_file.c
> index 9c344c7..0fe68bf 100644
> --- a/checkpoint/ckpt_file.c
> +++ b/checkpoint/ckpt_file.c
> @@ -91,6 +91,11 @@ static int cr_write_file_generic(struct cr_ctx *ctx, struct file *file,
> 
>  	hh->fd_type = CR_FD_GENERIC;
> 
> +	/*
> +	 * FIXME: when we'll add support for unlinked files/dirs, we'll
> +	 * need to distinguish between unlinked filed and unlinked dirs.
> +	 */
> +
>  	ret = cr_write_obj(ctx, &h, hh);
>  	if (ret < 0)
>  		return ret;
> @@ -98,12 +103,16 @@ static int cr_write_file_generic(struct cr_ctx *ctx, struct file *file,
>  	return cr_write_fname(ctx, &file->f_path, &ctx->fs_mnt);
>  }
> 
> +int generic_file_checkpoint(struct cr_ctx *ctx, struct file *file,
> +			    struct cr_hdr_file *hh)
> +{
> +	return cr_write_file_generic(ctx, file, hh);
> +}
> +
>  /* cr_write_file - dump the state of a given file pointer */
>  static int cr_write_file(struct cr_ctx *ctx, struct file *file)
>  {
>  	struct cr_hdr_file *hh;
> -	struct dentry *dent = file->f_dentry;
> -	struct inode *inode = dent->d_inode;
>  	int ret;
> 
>  	hh = cr_hbuf_get(ctx, sizeof(*hh));
> @@ -116,21 +125,11 @@ static int cr_write_file(struct cr_ctx *ctx, struct file *file)
>  	hh->f_version = file->f_version;
>  	/* FIX: need also file->uid, file->gid, file->f_owner, etc */
> 
> -	/*
> -	 * FIXME: when we'll add support for unlinked files/dirs, we'll
> -	 * need to distinguish between unlinked filed and unlinked dirs.
> -	 */
> -	switch (inode->i_mode & S_IFMT) {
> -	case S_IFREG:
> -	case S_IFDIR:
> -		ret = cr_write_file_generic(ctx, file, hh);
> -		break;
> -	default:
> -		ret = -EBADF;
> -		break;
> -	}
> -	cr_hbuf_put(ctx, sizeof(*hh));
> +	ret = -EBADF;
> +	if (file->f_op->checkpoint)
> +		ret = file->f_op->checkpoint(ctx, file, hh);
> 
> +	cr_hbuf_put(ctx, sizeof(*hh));
>  	return ret;
>  }
> 
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 3bf5057..835ee9e 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1296,6 +1296,14 @@ int generic_osync_inode(struct inode *, struct address_space *, int);
>  typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
>  struct block_device_operations;
> 
> +#ifdef CONFIG_CHECKPOINT
> +struct cr_ctx;
> +struct cr_hdr_file;
> +int generic_file_checkpoint(struct cr_ctx *, struct file *, struct cr_hdr_file *);
> +#else
> +#define generic_file_checkpoint NULL
> +#endif
> +
>  /* These macros are for out of kernel modules to test that
>   * the kernel supports the unlocked_ioctl and compat_ioctl
>   * fields in struct file_operations. */
> @@ -1334,6 +1342,9 @@ struct file_operations {
>  	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
>  	ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
>  	int (*setlease)(struct file *, long, struct file_lock **);
> +#ifdef CONFIG_CHECKPOINT
> +	int (*checkpoint)(struct cr_ctx *, struct file *file, struct cr_hdr_file *);
> +#endif
>  };
> 
>  struct inode_operations {
> -- 
> 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