[RFC][STEP 1][PATCH 3/4] nilfs-utils: mkfs: implement creation empty xafile functionality

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
Subject: [RFC][STEP 1][PATCH 3/4] nilfs-utils: mkfs: implement creation empty xafile functionality

This patch implements functionality of creation empty
xafile on mkfs phase.

Signed-off-by: Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
CC: Ryusuke Konishi <konishi.ryusuke@xxxxxxxxxxxxx>
---
 man/mkfs.nilfs2.8 |    9 +++++++++
 sbin/mkfs/mkfs.c  |   55 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/man/mkfs.nilfs2.8 b/man/mkfs.nilfs2.8
index a42d5b4..f63b0c5 100644
--- a/man/mkfs.nilfs2.8
+++ b/man/mkfs.nilfs2.8
@@ -50,6 +50,9 @@ mkfs.nilfs2 \- create a NILFS2 filesystem
 [
 .B \-V
 ]
+[
+.B \-x
+]
 .I device
 .sp
 .B mkfs.nilfs2
@@ -97,6 +100,9 @@ mkfs.nilfs2 \- create a NILFS2 filesystem
 [
 .B \-V
 ]
+[
+.B \-x
+]
 .I device
 .SH DESCRIPTION
 .B mkfs.nilfs2
@@ -182,6 +188,9 @@ Verbose execution.
 Print the version number of
 .B mkfs.nilfs2
 and exit.
+.TP
+.B \-x
+Create empty xafile on NILFS volume.
 .SH AUTHOR
 This version of
 .B mkfs.nilfs2
diff --git a/sbin/mkfs/mkfs.c b/sbin/mkfs/mkfs.c
index 8eb00bf..bccabf1 100644
--- a/sbin/mkfs/mkfs.c
+++ b/sbin/mkfs/mkfs.c
@@ -134,6 +134,7 @@ static __u64 compat_array[NILFS_MAX_FEATURE_TYPES] = {
 	/* Incompat */
 	0
 };
+static int create_xafile = 0;
 
 static void parse_options(int argc, char *argv[]);
 
@@ -420,6 +421,16 @@ static unsigned count_dat_blocks(unsigned nr_dat_entries)
 	return nblocks;
 }
 
+static unsigned count_xafile_blocks(void)
+{
+	unsigned nblocks;
+
+	nblocks = count_blockgrouped_file_blocks(blocksize, 0);
+	if (nblocks > NILFS_MAX_BMAP_ROOT_PTRS)
+		perr("Internal error: too many xanodes");
+	return nblocks;
+}
+
 static __attribute__((used)) void nilfs_check_ondisk_sizes(void)
 {
 	BUILD_BUG_ON(sizeof(struct nilfs_inode) > NILFS_MIN_BLOCKSIZE);
@@ -566,7 +577,8 @@ static void fix_disk_layout(struct nilfs_disk_info *di)
 
 			if (fi->ino != NILFS_DAT_INO &&
 			    fi->ino != NILFS_SUFILE_INO &&
-			    fi->ino != NILFS_CPFILE_INO)
+			    fi->ino != NILFS_CPFILE_INO &&
+			    fi->ino != NILFS_XATTR_INO)
 				di->nblocks_used += fi->nblocks;
 		}
 		if (di->nblocks_to_write < si->start + si->nblocks)
@@ -633,7 +645,12 @@ int main(int argc, char *argv[])
 	add_file(si, NILFS_NILFS_INO, 0, 0);
 	add_file(si, NILFS_ATIME_INO, 0, 0);
 	add_file(si, 1, 0, 0);
-	add_file(si, 8, 0, 0);
+
+	if (create_xafile)
+		add_file(si, NILFS_XATTR_INO, count_xafile_blocks(), 0);
+	else
+		add_file(si, 8, 0, 0);
+
 	add_file(si, 9, 0, 0);
 	add_file(si, 10, 0, 0);
 	add_file(si, NILFS_IFILE_INO, count_ifile_blocks(), 0);
@@ -1087,7 +1104,7 @@ static void parse_options(int argc, char *argv[])
 	int c, show_version_only = 0;
 	char *fs_features = NULL;
 
-	while ((c = getopt(argc, argv, "b:B:cfhKL:m:nqvO:P:V")) != EOF) {
+	while ((c = getopt(argc, argv, "b:B:cfhKL:m:nqvO:P:Vx")) != EOF) {
 		switch (c) {
 		case 'b':
 			blocksize = atol(optarg);
@@ -1133,6 +1150,9 @@ static void parse_options(int argc, char *argv[])
 		case 'V':
 			show_version_only = 1;
 			break;
+		case 'x':
+			create_xafile = 1;
+			break;
 		default:
 			usage();
 			exit(EXIT_FAILURE);
@@ -1175,7 +1195,7 @@ static void usage(void)
 		"Usage: %s [-b block-size] [-B blocks-per-segment] [-c] [-f] \n"
 		"       [-L volume-label] [-m reserved-segments-percentage] \n"
 		"       [-O feature[,...]] \n"
-		"       [-hnqvKV] device\n",
+		"       [-hnqvxKV] device\n",
 		progname);
 }
 
@@ -1319,7 +1339,10 @@ static void nilfs_mkfs_make_reserved_files(void)
 {
 	init_inode(NILFS_ATIME_INO, DT_REG, 0, 0);
 	init_inode(1, DT_REG, 0, 0);
-	init_inode(8, DT_REG, 0, 0);
+
+	if (!create_xafile)
+		init_inode(8, DT_REG, 0, 0);
+
 	init_inode(9, DT_REG, 0, 0);
 	init_inode(10, DT_REG, 0, 0);
 }
@@ -1564,6 +1587,19 @@ static void commit_sufile(void)
 	su->su_nblocks = cpu_to_le32(nilfs.current_segment->nblocks);
 }
 
+static void prepare_xafile(void)
+{
+	struct nilfs_file_info *fi = nilfs.files[NILFS_XATTR_INO];
+	blocknr_t blocknr = fi->start;
+
+	prepare_blockgrouped_file(blocknr);
+
+	/* Reserve block for invalid xanode number */
+	alloc_blockgrouped_file_entry(blocknr, 0);
+
+	init_inode(NILFS_XATTR_INO, DT_REG, 0, 0);
+}
+
 static void prepare_dat(void)
 {
 	struct nilfs_file_info *fi = nilfs.files[NILFS_DAT_INO];
@@ -1651,11 +1687,15 @@ static void prepare_segment(struct nilfs_segment_info *si)
 
 	nilfs.files[NILFS_CPFILE_INO]->raw_inode = &sr->sr_cpfile;
 	nilfs.files[NILFS_SUFILE_INO]->raw_inode = &sr->sr_sufile;
+	if (create_xafile)
+		nilfs.files[NILFS_XATTR_INO]->raw_inode = &sr->sr_xafile;
 	nilfs.files[NILFS_DAT_INO]->raw_inode = &sr->sr_dat;
 
 	prepare_dat();
 	prepare_sufile();
 	prepare_cpfile();
+	if (create_xafile)
+		prepare_xafile();
 	prepare_ifile();
 }
 
@@ -1771,6 +1811,11 @@ static void prepare_super_block(struct nilfs_disk_info *di)
 
 	raw_sb->s_feature_compat =
 		cpu_to_le64(compat_array[NILFS_FEATURE_TYPE_COMPAT]);
+
+	if (create_xafile) {
+		compat_array[NILFS_FEATURE_TYPE_COMPAT_RO] |=
+					NILFS_FEATURE_COMPAT_RO_XAFILE;
+	}
 	raw_sb->s_feature_compat_ro =
 		cpu_to_le64(compat_array[NILFS_FEATURE_TYPE_COMPAT_RO]);
 	raw_sb->s_feature_incompat =
-- 
1.7.9.5



--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux BTRFS]     [Linux CIFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux