Whamcloud - gitweb
LU-2880 ldiskfs: Added mount option to enable dirdata. 95/6495/12
authorManisha Salve <msalve@ddn.com>
Fri, 10 Jan 2014 16:25:50 +0000 (11:25 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 18 Jan 2014 05:35:17 +0000 (05:35 +0000)
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 <msalve@ddn.com>
Signed-off-by: James Simmons <uja.ornl@gmail.com>
Change-Id: I07f430c5cd7ad92b81746085b05b53c1202dd725
Reviewed-on: http://review.whamcloud.com/6495
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
ldiskfs/kernel_patches/patches/rhel6.3/ext4-data-in-dirent.patch
ldiskfs/kernel_patches/patches/sles11sp2/ext4-data-in-dirent.patch
ldiskfs/kernel_patches/series/ldiskfs-2.6-sles11.series
lustre/osd-ldiskfs/osd_handler.c

index 72c2395..b534162 100644 (file)
@@ -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:
index 973ccad..ac76bf9 100644 (file)
@@ -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]) |
        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| \
            !(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:
index 3157717..f75456b 100644 (file)
@@ -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
index 375d057..2288b64 100644 (file)
@@ -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);