[Devel] [PATCH 3/3] Add support for checkpoint/restart of ramfs directories

Matt Helsley matthltc at us.ibm.com
Sat Aug 7 19:27:04 PDT 2010


We cannot set a .checkpoint op in simple_dir_operations because they get
used mostly for pseudo-filesystem interfaces. Those provide a userspace
interface to special kernel data structures which are difficult or
impossible to checkpoint reliably for some uses of checkpoint/restart.
Specifically they may be unreliable when migrating a checkpoint to a
different machine or even across boots of the same machine with the same
kernel.

However mounts of ramfs are capable of reliably supporting checkpoint/restart
because they can be backed-up from userspace. So we add a new set of dir
operations based on simple_dir_operations but which support checkpoint.

Signed-off-by: Matt Helsley <matthltc at us.ibm.com>
---
 fs/ramfs/inode.c    |   19 ++++++++++++++++++-
 fs/ramfs/internal.h |    1 -
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
index c948534..62d26c5 100644
--- a/fs/ramfs/inode.c
+++ b/fs/ramfs/inode.c
@@ -44,6 +44,23 @@
 static const struct super_operations ramfs_ops;
 static const struct inode_operations ramfs_dir_inode_operations;
 
+#ifdef CONFIG_CHECKPOINT
+static const struct file_operations ramfs_dir_operations = {
+	/* Just like simple_dir_operations except... */
+	.open		= dcache_dir_open,
+	.release	= dcache_dir_close,
+	.llseek		= dcache_dir_lseek,
+	.read		= generic_read_dir,
+	.readdir	= dcache_readdir,
+	.fsync		= simple_sync_file,
+
+	/* The checkpoint ops are unlike simple_dir_operations */
+	.checkpoint	= generic_file_checkpoint,
+};
+#else
+#define ramfs_dir_operations simple_dir_operations
+#endif
+
 static struct backing_dev_info ramfs_backing_dev_info = {
 	.name		= "ramfs",
 	.ra_pages	= 0,	/* No readahead */
@@ -75,7 +92,7 @@ struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev)
 			break;
 		case S_IFDIR:
 			inode->i_op = &ramfs_dir_inode_operations;
-			inode->i_fop = &simple_dir_operations;
+			inode->i_fop = &ramfs_dir_operations;
 
 			/* directory inodes start off with i_nlink == 2 (for "." entry) */
 			inc_nlink(inode);
diff --git a/fs/ramfs/internal.h b/fs/ramfs/internal.h
index 6b33063..9a11302 100644
--- a/fs/ramfs/internal.h
+++ b/fs/ramfs/internal.h
@@ -9,6 +9,5 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-
 extern const struct address_space_operations ramfs_aops;
 extern const struct inode_operations ramfs_file_inode_operations;
-- 
1.6.3.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