On Fri, May 22, 2015 at 01:28:57PM +0200, Jan Kara wrote: > Signed-off-by: Jan Kara <jack@xxxxxxx> > --- > misc/tune2fs.8.in | 5 ++++ > misc/tune2fs.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 2 files changed, 84 insertions(+), 2 deletions(-) > > diff --git a/misc/tune2fs.8.in b/misc/tune2fs.8.in > index 9d1df8242baa..c2355da5a7aa 100644 > --- a/misc/tune2fs.8.in > +++ b/misc/tune2fs.8.in > @@ -232,6 +232,11 @@ program. > This superblock setting is only honored in 2.6.35+ kernels; > and not at all by the ext2 and ext3 file system drivers. > .TP > +.BI orphan_file_size= size > +Set size of the file for tracking unlinked but still open inodes and inodes > +with truncate in progress. Larger file allows for better scalability, reserving > +a few blocks per cpu is ideal. > +.TP > .B test_fs > Set a flag in the filesystem superblock indicating that it may be > mounted using experimental kernel code, such as the ext4dev filesystem. > diff --git a/misc/tune2fs.c b/misc/tune2fs.c > index f930df2f6683..672efd5872f8 100644 > --- a/misc/tune2fs.c > +++ b/misc/tune2fs.c > @@ -103,6 +103,7 @@ static int fsck_requested; > int journal_size, journal_flags; > char *journal_device; > static blk64_t journal_location = ~0LL; > +static e2_blkcnt_t orphan_file_blocks; > > static struct list_head blk_move_list; > > @@ -143,7 +144,8 @@ static void usage(void) > static __u32 ok_features[3] = { > /* Compat */ > EXT3_FEATURE_COMPAT_HAS_JOURNAL | > - EXT2_FEATURE_COMPAT_DIR_INDEX, > + EXT2_FEATURE_COMPAT_DIR_INDEX | > + EXT4_FEATURE_COMPAT_ORPHAN_FILE, > /* Incompat */ > EXT2_FEATURE_INCOMPAT_FILETYPE | > EXT3_FEATURE_INCOMPAT_EXTENTS | > @@ -169,7 +171,8 @@ static __u32 clear_ok_features[3] = { > /* Compat */ > EXT3_FEATURE_COMPAT_HAS_JOURNAL | > EXT2_FEATURE_COMPAT_RESIZE_INODE | > - EXT2_FEATURE_COMPAT_DIR_INDEX, > + EXT2_FEATURE_COMPAT_DIR_INDEX | > + EXT4_FEATURE_COMPAT_ORPHAN_FILE, > /* Incompat */ > EXT2_FEATURE_INCOMPAT_FILETYPE | > EXT4_FEATURE_INCOMPAT_FLEX_BG | > @@ -1025,6 +1028,44 @@ static int update_feature_set(ext2_filsys fs, char *features) > } > } > > + if (FEATURE_OFF(E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_ORPHAN_FILE)) { > + if (mount_flags & EXT2_MF_MOUNTED) { > + fputs(_("The orphan_file feature may only be cleared " > + "when the filesystem is unmounted.\n"), stderr); > + return 1; > + } > + if ((sb->s_feature_ro_compat & > + EXT4_FEATURE_RO_COMPAT_ORPHAN_PRESENT) && > + f_flag < 2) { > + fputs(_("The orphan_present flag is set. Please run " > + "e2fsck before clearing orphan_file flag.\n"), > + stderr); > + return 1; > + } > + err = ext2fs_truncate_orphan_file(fs); > + if (err) { > + com_err(program_name, err, > + _("\n\twhile trying to truncate orhan file\n")); "orphan" > + return 1; > + } > + } > + > + if (FEATURE_ON(E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_ORPHAN_FILE)) { > + if (!(sb->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL)) { > + fputs(_("orphan_file flag can be set only for " > + "filesystems with journal.\n"), stderr); > + return 1; > + } > + /* > + * If adding an orphan file, let the create orphan file > + * code below handle setting the flag and creating it. > + * We supply a default size if necessary. > + */ > + orphan_file_blocks = ext2fs_default_orphan_file_blocks( > + ext2fs_blocks_count(fs->super)); > + sb->s_feature_compat &= ~EXT4_FEATURE_COMPAT_ORPHAN_FILE; > + } > + > if (FEATURE_ON(E2P_FEATURE_RO_INCOMPAT, > EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) { > if (sb->s_feature_incompat & > @@ -1970,6 +2011,31 @@ static int parse_extended_opts(ext2_filsys fs, const char *opts) > continue; > } > ext_mount_opts = strdup(arg); > + } else if (!strcmp(token, "orphan_file_size")) { > + __u64 size; > + > + if (!arg) { > + r_usage++; > + continue; > + } > + size = strtoul(arg, &p, 0); Would be nice if I could supply units, e.g. orphan_file_size = 128K here. > + if (*p) { > + fprintf(stderr, > + _("Invalid size of orphan file %s\n"), > + arg); > + r_usage++; > + continue; > + } > + if (size < EXT4_MIN_ORPHAN_FILE_SIZE) { > + fprintf(stderr, > + _("Orphan file is too small. Minimum " > + "size is %u\n"), > + EXT4_MIN_ORPHAN_FILE_SIZE); > + r_usage++; > + continue; > + } > + orphan_file_blocks = (size + fs->blocksize - 1) / > + fs->blocksize; > } else > r_usage++; > } > @@ -2921,6 +2987,17 @@ retry_open: > if (rc) > goto closefs; > } > + if (orphan_file_blocks) { If someone specifies -E orphan_file_size=NNN -O ^orphan_file, does this have the effect of erasing and recreating the orphan file? --D > + errcode_t err; > + > + err = ext2fs_create_orphan_file(fs, orphan_file_blocks); > + if (err) { > + com_err(program_name, err, "%s", > + _("while creating orphan file")); > + rc = 1; > + goto closefs; > + } > + } > > if (Q_flag) { > if (mount_flags & EXT2_MF_MOUNTED) { > -- > 2.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html