From f5967b06aac5bb7c065e526358995ad127c47cb8 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Sat, 5 Jun 2021 02:34:15 -0600 Subject: [PATCH] LU-14734 osd-ldiskfs: enable large_dir automatically Enable the large_dir feature automatically at mount time for filesystems that do not have it enabled already. Otherwise, the REMOTE_PARENT_DIR may overflow if there are many remote entries created, or for object directories on very large OSTs. It isn't really needed on a dedicated MGS filesystem. Signed-off-by: Andreas Dilger Change-Id: I1c4ead26b09d60567ad12945d7b366b53475cebb Reviewed-on: https://review.whamcloud.com/43931 Tested-by: jenkins Tested-by: Maloo Reviewed-by: John L. Hammond Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- lustre/osd-ldiskfs/osd_handler.c | 24 ++++++++++++++++++++++++ lustre/osd-ldiskfs/osd_internal.h | 6 ++++++ 2 files changed, 30 insertions(+) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 071ae6b..3b46322 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -7756,6 +7756,20 @@ static void osd_umount(const struct lu_env *env, struct osd_device *o) EXIT; } +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 2, 53, 0) +# ifndef LDISKFS_HAS_INCOMPAT_FEATURE +/* Newer kernels provide the ldiskfs_set_feature_largedir() wrapper already, + * which calls ldiskfs_update_dynamic_rev() to update ancient filesystems. + * All ldiskfs filesystems are already v2, so it is a no-op and unnecessary. + * This avoids maintaining patches to export this otherwise-useless function. + */ +void ldiskfs_update_dynamic_rev(struct super_block *sb) +{ + /* do nothing */ +} +# endif +#endif + static int osd_mount(const struct lu_env *env, struct osd_device *o, struct lustre_cfg *cfg) { @@ -7900,6 +7914,7 @@ static int osd_mount(const struct lu_env *env, GOTO(out_mnt, rc = -EINVAL); } +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 2, 53, 0) #ifdef LDISKFS_MOUNT_DIRDATA if (ldiskfs_has_feature_dirdata(o->od_mnt->mnt_sb)) LDISKFS_SB(osd_sb(o))->s_mount_opt |= LDISKFS_MOUNT_DIRDATA; @@ -7909,6 +7924,15 @@ static int osd_mount(const struct lu_env *env, "downgrade to Lustre-1.x again, you can enable it via " "'tune2fs -O dirdata device'\n", name, dev); #endif + /* enable large_dir on MDTs to avoid REMOTE_PARENT_DIR overflow, + * and on very large OSTs to avoid object directory overflow */ + if (unlikely(!ldiskfs_has_feature_largedir(o->od_mnt->mnt_sb) && + !strstr(name, "MGS"))) { + ldiskfs_set_feature_largedir(o->od_mnt->mnt_sb); + LCONSOLE_INFO("%s: enable 'large_dir' feature on device '%s'\n", + name, dev); + } +#endif inode = osd_sb(o)->s_root->d_inode; lu_local_obj_fid(fid, OSD_FS_ROOT_OID); rc = osd_ea_fid_set(info, inode, fid, LMAC_NOT_IN_OI, 0); diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 11f8a6e..81393cf 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -1549,6 +1549,12 @@ osd_index_backup(const struct lu_env *env, struct osd_device *osd, bool backup) # define ldiskfs_has_feature_dirdata(sb) \ LDISKFS_HAS_INCOMPAT_FEATURE(sb, LDISKFS_FEATURE_INCOMPAT_DIRDATA) # endif +# ifdef LDISKFS_FEATURE_INCOMPAT_LARGEDIR +# define ldiskfs_has_feature_largedir(sb) \ + LDISKFS_HAS_INCOMPAT_FEATURE(sb, LDISKFS_FEATURE_INCOMPAT_LARGEDIR) +# define ldiskfs_set_feature_largedir(sb) \ + LDISKFS_SET_INCOMPAT_FEATURE(sb, LDISKFS_FEATURE_INCOMPAT_LARGEDIR) +# endif # ifdef LDISKFS_FEATURE_COMPAT_HAS_JOURNAL # define ldiskfs_has_feature_journal(sb) \ LDISKFS_HAS_COMPAT_FEATURE(sb, LDISKFS_FEATURE_COMPAT_HAS_JOURNAL) -- 1.8.3.1