From: Vyacheslav Dubeyko <[email protected]>
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 <[email protected]>
CC: Ryusuke Konishi <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to