From: Fan Yong Date: Sun, 24 Apr 2016 06:28:02 +0000 (+0800) Subject: LU-8071 ldiskfs: handle system freeze protection X-Git-Tag: 2.8.54~18 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=bd40ca206881eefeeb6ad7586f93afd685bb8120 LU-8071 ldiskfs: handle system freeze protection For RHEL6 2.6.32, or kernel 3.6 or newer, it supports wrapped functions for filesystem freeze protection, such as sb_{start, stop}_write(). Usually, they are called by VFS. Since Lustre uses ldiskfs backend bypass VFS layer, it is the OSD's duty to handle filesystem freeze protection by calling related wrapped filesystem freeze protection functions. As for other kernel, such as 3.0.101, related logic has been handled inside ldiskfs via vfs_check_frozen(). Signed-off-by: Fan Yong Change-Id: Idb2b4ca02d569ec818a06b534e857b6ee44f89a2 Reviewed-on: http://review.whamcloud.com/20062 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Wang Shilong --- diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 670389e..074a3ee 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -1260,6 +1260,23 @@ inode_ops_atomic_open, [ ]) # LC_HAVE_IOP_ATOMIC_OPEN # +# LC_HAVE_SB_START_WRITE +# +# RHEL6 2.6.32, 3.6 or newer support wrapped FS freeze functions +# +AC_DEFUN([LC_HAVE_SB_START_WRITE], [ +LB_CHECK_COMPILE([if kernel supports wrapped FS freeze functions], +sb_start_write, [ + #include +],[ + sb_start_write(NULL); +],[ + AC_DEFINE(HAVE_SB_START_WRITE, 1, + [kernel supports wrapped FS freeze functions]) +]) +]) # LC_HAVE_SB_START_WRITE + +# # LC_HAVE_POSIXACL_USER_NS # # 3.7 posix_acl_{to,from}_xattr take struct user_namespace @@ -2135,6 +2152,7 @@ AC_DEFUN([LC_PROG_LINUX], [ LC_DATA_FOR_LLITE_IS_LIST LC_DENTRY_OPEN_USE_PATH LC_HAVE_IOP_ATOMIC_OPEN + LC_HAVE_SB_START_WRITE # 3.7 LC_HAVE_POSIXACL_USER_NS diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index af861fd..c7c8ecf 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -1213,6 +1213,11 @@ static void osd_trans_commit_cb(struct super_block *sb, OBD_FREE_PTR(oh); } +#ifndef HAVE_SB_START_WRITE +# define sb_start_write(sb) do {} while (0) +# define sb_end_write(sb) do {} while (0) +#endif + static struct thandle *osd_trans_create(const struct lu_env *env, struct dt_device *d) { @@ -1225,7 +1230,8 @@ static struct thandle *osd_trans_create(const struct lu_env *env, /* on pending IO in this thread should left from prev. request */ LASSERT(atomic_read(&iobuf->dr_numreqs) == 0); - th = ERR_PTR(-ENOMEM); + sb_start_write(osd_sb(osd_dt_dev(d))); + OBD_ALLOC_GFP(oh, sizeof *oh, GFP_NOFS); if (oh != NULL) { oh->ot_quota_trans = &oti->oti_quota_trans; @@ -1245,6 +1251,9 @@ static struct thandle *osd_trans_create(const struct lu_env *env, sizeof(oti->oti_declare_ops_cred)); memset(oti->oti_declare_ops_used, 0, sizeof(oti->oti_declare_ops_used)); + } else { + sb_end_write(osd_sb(osd_dt_dev(d))); + th = ERR_PTR(-ENOMEM); } RETURN(th); } @@ -1486,6 +1495,8 @@ static int osd_trans_stop(const struct lu_env *env, struct dt_device *dt, if (unlikely(remove_agents != 0)) osd_process_scheduled_agent_removals(env, osd); + sb_end_write(osd_sb(osd)); + RETURN(rc); }