Whamcloud - gitweb
LU-8071 ldiskfs: handle system freeze protection 62/20062/8
authorFan Yong <fan.yong@intel.com>
Sun, 24 Apr 2016 06:28:02 +0000 (14:28 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 2 Jun 2016 04:40:43 +0000 (04:40 +0000)
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 <fan.yong@intel.com>
Change-Id: Idb2b4ca02d569ec818a06b534e857b6ee44f89a2
Reviewed-on: http://review.whamcloud.com/20062
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
lustre/autoconf/lustre-core.m4
lustre/osd-ldiskfs/osd_handler.c

index 670389e..074a3ee 100644 (file)
@@ -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 <linux/fs.h>
+],[
+       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
index af861fd..c7c8ecf 100644 (file)
@@ -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);
 }