From add1417e6f95a63cd3ed90c968b7b0c260168ce4 Mon Sep 17 00:00:00 2001 From: Manisha Salve Date: Fri, 10 Jan 2014 11:25:50 -0500 Subject: [PATCH] LU-2880 ldiskfs: Added mount option to enable dirdata. Added the code to set mount option for enabling the dirdata in osd_mount(). This will set the dirdata option for lustre filesystems only. The dirdata mount option would be checked in get_dtype() to decide whether to pass dirdata flag as well while reading the file type. Signed-off-by: Manisha Salve Signed-off-by: James Simmons Change-Id: I07f430c5cd7ad92b81746085b05b53c1202dd725 Reviewed-on: http://review.whamcloud.com/6495 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Fan Yong --- .../patches/rhel6.3/ext4-data-in-dirent.patch | 48 ++++++++++++++++++++-- .../patches/sles11sp2/ext4-data-in-dirent.patch | 39 +++++++++++++++++- .../series/ldiskfs-2.6-sles11.series | 4 +- lustre/osd-ldiskfs/osd_handler.c | 7 +++- 4 files changed, 90 insertions(+), 8 deletions(-) diff --git a/ldiskfs/kernel_patches/patches/rhel6.3/ext4-data-in-dirent.patch b/ldiskfs/kernel_patches/patches/rhel6.3/ext4-data-in-dirent.patch index 72c2395..b5341621 100644 --- a/ldiskfs/kernel_patches/patches/rhel6.3/ext4-data-in-dirent.patch +++ b/ldiskfs/kernel_patches/patches/rhel6.3/ext4-data-in-dirent.patch @@ -21,7 +21,7 @@ changes in ext4_add_entry() interface required. return DT_UNKNOWN; - return (ext4_filetype_table[filetype]); -+ if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_DIRDATA)) ++ if (!test_opt(sb, DIRDATA)) + return (ext4_filetype_table[fl_index]); + + return (ext4_filetype_table[fl_index]) | @@ -81,9 +81,19 @@ changes in ext4_add_entry() interface required. new_fn->name[dirent->name_len] = 0; while (*p) { ---- a/fs/ext4/ext4.h -+++ b/fs/ext4/ext4.h -@@ -1294,6 +1294,7 @@ EXT4_INODE_BIT_FNS(state, state_flags) +Index: linux-stage/fs/ext4/ext4.h +=================================================================== +--- linux-stage.orig/fs/ext4/ext4.h ++++ linux-stage/fs/ext4/ext4.h +@@ -843,6 +843,7 @@ struct ext4_inode_info { + #define EXT4_MOUNT_ERRORS_PANIC 0x00040 /* Panic on errors */ + #define EXT4_MOUNT_MINIX_DF 0x00080 /* Mimics the Minix statfs */ + #define EXT4_MOUNT_NOLOAD 0x00100 /* Don't use existing journal*/ ++#define EXT4_MOUNT_DIRDATA 0x00200 /* Data in directory entries*/ + #define EXT4_MOUNT_DATA_FLAGS 0x00C00 /* Mode for data writes: */ + #define EXT4_MOUNT_JOURNAL_DATA 0x00400 /* Write data to journal */ + #define EXT4_MOUNT_ORDERED_DATA 0x00800 /* Flush data before commit */ +@@ -1294,6 +1295,7 @@ EXT4_INODE_BIT_FNS(state, state_flags) #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 #define EXT4_FEATURE_INCOMPAT_MMP 0x0100 #define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 @@ -496,3 +506,33 @@ changes in ext4_add_entry() interface required. !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { if (err) ext4_error(inode->i_sb, +diff -ur a/fs/ext4/super.c b/fs/ext4/super.c +--- a/fs/ext4/super.c 2014-01-02 11:40:34.000000000 -0500 ++++ b/fs/ext4/super.c 2014-01-02 11:46:45.000000000 -0500 +@@ -1191,7 +1191,7 @@ + Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, + Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota, + Opt_noquota, Opt_ignore, Opt_barrier, Opt_nobarrier, Opt_err, +- Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, ++ Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, Opt_dirdata, + Opt_resize, Opt_usrquota, Opt_grpquota, Opt_i_version, + Opt_stripe, Opt_delalloc, Opt_nodelalloc, + Opt_block_validity, Opt_noblock_validity, +@@ -1253,6 +1253,7 @@ + {Opt_iopen, "iopen"}, + {Opt_noiopen, "noiopen"}, + {Opt_iopen_nopriv, "iopen_nopriv"}, ++ {Opt_dirdata, "dirdata"}, + {Opt_barrier, "barrier=%u"}, + {Opt_barrier, "barrier"}, + {Opt_nobarrier, "nobarrier"}, +@@ -1631,6 +1632,9 @@ + case Opt_noiopen: + case Opt_iopen_nopriv: + break; ++ case Opt_dirdata: ++ set_opt(sbi->s_mount_opt, DIRDATA); ++ break; + case Opt_ignore: + break; + case Opt_resize: diff --git a/ldiskfs/kernel_patches/patches/sles11sp2/ext4-data-in-dirent.patch b/ldiskfs/kernel_patches/patches/sles11sp2/ext4-data-in-dirent.patch index 973ccad..ac76bf9 100644 --- a/ldiskfs/kernel_patches/patches/sles11sp2/ext4-data-in-dirent.patch +++ b/ldiskfs/kernel_patches/patches/sles11sp2/ext4-data-in-dirent.patch @@ -18,7 +18,7 @@ return DT_UNKNOWN; - return (ext4_filetype_table[filetype]); -+ if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_DIRDATA)) ++ if (!test_opt(sb, DIRDATA)) + return (ext4_filetype_table[fl_index]); + + return (ext4_filetype_table[fl_index]) | @@ -80,6 +80,14 @@ while (*p) { --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h +@@ -902,6 +902,7 @@ struct ext4_inode_info { + #define EXT4_MOUNT_ERRORS_PANIC 0x00040 /* Panic on errors */ + #define EXT4_MOUNT_MINIX_DF 0x00080 /* Mimics the Minix statfs */ + #define EXT4_MOUNT_NOLOAD 0x00100 /* Don't use existing journal*/ ++#define EXT4_MOUNT_DIRDATA 0x00200 /* Data in directory entries */ + #define EXT4_MOUNT_DATA_FLAGS 0x00C00 /* Mode for data writes: */ + #define EXT4_MOUNT_JOURNAL_DATA 0x00400 /* Write data to journal */ + #define EXT4_MOUNT_ORDERED_DATA 0x00800 /* Flush data before commit */ @@ -1414,7 +1414,9 @@ static inline void ext4_clear_state_flag EXT4_FEATURE_INCOMPAT_EXTENTS| \ EXT4_FEATURE_INCOMPAT_64BIT| \ @@ -476,3 +484,32 @@ !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { if (err) EXT4_ERROR_INODE(inode, +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1363,7 +1363,7 @@ enum { + Opt_data_err_abort, Opt_data_err_ignore, + Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, + Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota, +- Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, ++ Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, Opt_dirdata, + Opt_noquota, Opt_ignore, Opt_barrier, Opt_nobarrier, Opt_err, + Opt_resize, Opt_usrquota, Opt_grpquota, Opt_i_version, + Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_mblk_io_submit, +@@ -1427,6 +1427,7 @@ static const match_table_t tokens = { + {Opt_iopen, "iopen"}, + {Opt_noiopen, "noiopen"}, + {Opt_iopen_nopriv, "iopen_nopriv"}, ++ {Opt_dirdata, "dirdata"}, + {Opt_barrier, "barrier=%u"}, + {Opt_barrier, "barrier"}, + {Opt_nobarrier, "nobarrier"}, +@@ -1840,6 +1841,9 @@ set_qf_format: + case Opt_noiopen: + case Opt_iopen_nopriv: + break; ++ case Opt_dirdata: ++ set_opt(sb, DIRDATA); ++ break; + case Opt_ignore: + break; + case Opt_resize: diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series index 3157717..f75456b 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series @@ -29,7 +29,7 @@ rhel6.3/ext4-kill-dx_root.patch rhel6.3/ext4-extents-mount-option.patch rhel6.3/ext4-fiemap-2.6.patch rhel6.3/ext4-mballoc-pa_free-mismatch.patch -rhel6.3/ext4_data_in_dirent.patch +rhel6.3/ext4-data-in-dirent.patch rhel6.3/ext4-large-eas.patch rhel6.3/ext4-disable-mb-cache.patch rhel6.3/ext4-back-dquot-to.patch @@ -37,7 +37,7 @@ rhel6.3/ext4-nocmtime-2.6.patch rhel6.3/ext4-export-64bit-name-hash.patch rhel6.3/ext4-journal-callback.patch rhel6.3/ext4-store-tree-generation-at-find.patch -rhel6.3/ext4_pdirop.patch +rhel6.3/ext4-pdirop.patch rhel6.3/ext4-quota-force-block-alloc-quotaoff.patch rhel6.3/ext4-quota-dont-update-cmtime.patch rhel6.3/ext4-quota-first-class.patch diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 375d057..2288b64 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -5611,11 +5611,16 @@ static int osd_mount(const struct lu_env *env, #endif if (!LDISKFS_HAS_COMPAT_FEATURE(o->od_mnt->mnt_sb, - LDISKFS_FEATURE_COMPAT_HAS_JOURNAL)) { + LDISKFS_FEATURE_COMPAT_HAS_JOURNAL)) { CERROR("%s: device %s is mounted w/o journal\n", name, dev); GOTO(out_mnt, rc = -EINVAL); } +#ifdef LDISKFS_MOUNT_DIRDATA + if (LDISKFS_HAS_INCOMPAT_FEATURE(o->od_mnt->mnt_sb, + LDISKFS_FEATURE_INCOMPAT_DIRDATA)) + LDISKFS_SB(osd_sb(o))->s_mount_opt |= LDISKFS_MOUNT_DIRDATA; +#endif inode = osd_sb(o)->s_root->d_inode; ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI); lu_local_obj_fid(fid, OSD_FS_ROOT_OID); -- 1.8.3.1