[PATCH 07/10] Add relink_dir superblock field

Matt Helsley matthltc at us.ibm.com
Mon Feb 28 20:05:13 PST 2011


This patch adds the pointer for a relink mount(8) option which specifies a
path to a directory within the given filesystem where checkpoint/restart
may relink files. If the option is unset then checkpoint/restart tries
to use "lost+found".

A subsequent patch will enable userspace to set a relink=/foo/bar
option when mounting a filesystem.

Signed-off-by: Matt Helsley <matthltc at us.ibm.com>
---
 fs/namei.c         |    6 ++++--
 fs/namespace.c     |    6 ++++++
 include/linux/fs.h |    2 ++
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index 6dea3b1..fcf35b3 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2535,7 +2535,7 @@ SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname
 #ifdef CONFIG_CHECKPOINT
 
 /* Path relative to the mounted filesystem's root -- not a "global" root or even a namespace root. The unique_name_count is unique for the entire checkpoint. */
-#define CKPT_RELINKAT_FMT "lost+found/checkpoint-%d/relinked-%u"
+#define CKPT_RELINKAT_FMT "%s/checkpoint-%d/relinked-%u"
 
 static int checkpoint_fill_relink_fname(struct ckpt_ctx *ctx,
 					struct file *for_file,
@@ -2569,7 +2569,9 @@ static int checkpoint_fill_relink_fname(struct ckpt_ctx *ctx,
 		len++;
 	}
 	len += snprintf(tmp, PATH_MAX - len, CKPT_RELINKAT_FMT,
-			ctx->crid, ++ctx->unique_name_count);
+			relink_dir_path.mnt->mnt_sb->s_relink_dir ? relink_dir_path.mnt->mnt_sb->s_relink_dir : "lost+found",
+			ctx->crid,
+			 ++ctx->unique_name_count);
 	relink_dir_pathname[len] = '\0';
 	*lenp = len;
 	return 0;
diff --git a/fs/namespace.c b/fs/namespace.c
index 8c83cd3..31fe15f 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -810,6 +810,12 @@ static int show_sb_opts(struct seq_file *m, struct super_block *sb)
 		if (sb->s_flags & fs_infop->flag)
 			seq_puts(m, fs_infop->str);
 	}
+#ifdef CONFIG_CHECKPOINT
+	if (sb->s_relink_dir) {
+		seq_puts(m, ",relink=");
+		seq_puts(m, sb->s_relink_dir);
+	}
+#endif /* CONFIG_CHECKPOINT */
 
 	return security_sb_show_options(m, sb);
 }
diff --git a/include/linux/fs.h b/include/linux/fs.h
index af1cb0e..826df6f 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1426,6 +1426,8 @@ struct super_block {
 	 * generic_show_options()
 	 */
 	char __rcu *s_options;
+
+	char *s_relink_dir;
 };
 
 extern struct timespec current_fs_time(struct super_block *sb);
-- 
1.6.3.3



More information about the Containers mailing list