This pair of functions will check to see whether a given 'struct file' can be checkpointed. If it can't be, the "explain" function can also give a description why. Note that we assume the presence of an f_op->checkpoint implies that a file is always checkpointable. That may have to change in the future, but it is a fixed rule for now. Signed-off-by: Dave Hansen <dave@xxxxxxxxxxxxxxxxxx> --- linux-2.6.git-dave/checkpoint/ckpt_file.c | 26 ++++++++++++++++++++++++++ linux-2.6.git-dave/include/linux/checkpoint.h | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+) diff -puN checkpoint/ckpt_file.c~cfcc333a1e665c38185a12ba119c32cf796dbd85 checkpoint/ckpt_file.c --- linux-2.6.git/checkpoint/ckpt_file.c~cfcc333a1e665c38185a12ba119c32cf796dbd85 2009-03-05 08:37:03.000000000 -0800 +++ linux-2.6.git-dave/checkpoint/ckpt_file.c 2009-03-05 08:37:03.000000000 -0800 @@ -93,6 +93,32 @@ int generic_file_checkpoint(struct file return 0; } +int cr_explain_file(struct file *file, char *explain, int left) +{ + struct inode *inode = file->f_dentry->d_inode; + + if (!file->f_op->checkpoint) + return scnprintf(explain, left, " (no checkpoint handler)"); + + if (special_file(inode->i_mode)) + return scnprintf(explain, left, " (special file)"); + + return 0; +} + +int cr_file_supported(struct file *file) +{ + struct inode *inode = file->f_dentry->d_inode; + + if (!file->f_op->checkpoint) + return 0; + + if (special_file(inode->i_mode)) + return 0; + + return 1; +} + /* 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) { diff -puN include/linux/checkpoint.h~cfcc333a1e665c38185a12ba119c32cf796dbd85 include/linux/checkpoint.h --- linux-2.6.git/include/linux/checkpoint.h~cfcc333a1e665c38185a12ba119c32cf796dbd85 2009-03-05 08:37:03.000000000 -0800 +++ linux-2.6.git-dave/include/linux/checkpoint.h 2009-03-05 08:37:03.000000000 -0800 @@ -13,6 +13,8 @@ #include <linux/path.h> #include <linux/fs.h> +#ifdef CONFIG_CHECKPOINT_RESTART + #define CR_VERSION 2 struct cr_ctx { @@ -99,4 +101,20 @@ extern int cr_read_files(struct cr_ctx * #define pr_fmt(fmt) "[%d:c/r:%s] " fmt, task_pid_vnr(current), __func__ +int cr_explain_file(struct file *file, char *explain, int left); +int cr_file_supported(struct file *file); + +#else /* !CONFIG_CHECKPOINT_RESTART */ + +static inline int cr_explain_file(struct file *file, char *explain, int left) +{ + return 0; +} + +static inline int cr_file_supported(struct file *file) +{ + return 0; +} + +#endif /* CONFIG_CHECKPOINT_RESTART */ #endif /* _CHECKPOINT_CKPT_H_ */ _ _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers