Whamcloud - gitweb
LU-7428 osd: set device read-only correctly 86/20586/4
authorHongchao Zhang <hongchao.zhang@intel.com>
Sat, 28 May 2016 18:52:18 +0000 (02:52 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 14 Jun 2016 03:49:17 +0000 (03:49 +0000)
Freeze the journal before setting device read-only to prevent
starting a new handle or commit a transaction in that time.

Seagate-bug-id: MRP-2135

Some of the patch is from http://review.whamcloud.com/20535

Change-Id: Iadcb0a7ccf9189e8bb564aa4783bae9a2ef86a76
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@seagate.com>
Signed-off-by: vinayakswami hariharmath <vinayakswami.hariharmath@seagate.com>
Signed-off-by: Gu Zheng <gzheng@ddn.com>
Signed-off-by: Hongchao Zhang <hongchao.zhang@intel.com>
Reviewed-on: http://review.whamcloud.com/20586
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_internal.h
lustre/osd-ldiskfs/osd_handler.c

index 58bd624..d9cc115 100644 (file)
@@ -5910,13 +5910,15 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         if (rc)
                 RETURN(rc);
 
         if (rc)
                 RETURN(rc);
 
-        switch (cmd) {
-        case OBD_IOC_SYNC:
-                rc = mdt_device_sync(&env, mdt);
-                break;
-        case OBD_IOC_SET_READONLY:
-                rc = dt->dd_ops->dt_ro(&env, dt);
-                break;
+       switch (cmd) {
+       case OBD_IOC_SYNC:
+               rc = mdt_device_sync(&env, mdt);
+               break;
+       case OBD_IOC_SET_READONLY:
+               rc = dt_sync(&env, dt);
+               if (rc == 0)
+                       rc = dt_ro(&env, dt);
+               break;
        case OBD_IOC_ABORT_RECOVERY:
                CERROR("%s: Aborting recovery for device\n", mdt_obd_name(mdt));
                obd->obd_abort_recovery = 1;
        case OBD_IOC_ABORT_RECOVERY:
                CERROR("%s: Aborting recovery for device\n", mdt_obd_name(mdt));
                obd->obd_abort_recovery = 1;
index dc5d990..9ec2f34 100644 (file)
@@ -896,14 +896,14 @@ extern struct lu_context_key       mdt_thread_key;
 static inline int mdt_fail_write(const struct lu_env *env,
                                  struct dt_device *dd, int id)
 {
 static inline int mdt_fail_write(const struct lu_env *env,
                                  struct dt_device *dd, int id)
 {
-        if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) {
-                CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n",
-                       id);
-                return dd->dd_ops->dt_ro(env, dd);
-                /* We set FAIL_ONCE because we never "un-fail" a device */
-        }
-
-        return 0;
+       if (OBD_FAIL_CHECK_ORSET(id, OBD_FAIL_ONCE)) {
+               CERROR(LUSTRE_MDT_NAME": cfs_fail_loc=%x, fail write ops\n",
+                      id);
+               return dt_ro(env, dd);
+               /* We set FAIL_ONCE because we never "un-fail" a device */
+       }
+
+       return 0;
 }
 
 static inline struct mdt_export_data *mdt_req2med(struct ptlrpc_request *req)
 }
 
 static inline struct mdt_export_data *mdt_req2med(struct ptlrpc_request *req)
index 681897f..60855df 100644 (file)
@@ -1785,6 +1785,12 @@ static int osd_ro(const struct lu_env *env, struct dt_device *d)
 #ifdef HAVE_DEV_SET_RDONLY
        CERROR("*** setting %s read-only ***\n", osd_dt_dev(d)->od_svname);
 
 #ifdef HAVE_DEV_SET_RDONLY
        CERROR("*** setting %s read-only ***\n", osd_dt_dev(d)->od_svname);
 
+       if (sb->s_op->freeze_fs) {
+               rc = sb->s_op->freeze_fs(sb);
+               if (rc)
+                       goto out;
+       }
+
        if (jdev && (jdev != dev)) {
                CDEBUG(D_IOCTL | D_HA, "set journal dev %lx rdonly\n",
                       (long)jdev);
        if (jdev && (jdev != dev)) {
                CDEBUG(D_IOCTL | D_HA, "set journal dev %lx rdonly\n",
                       (long)jdev);
@@ -1792,10 +1798,16 @@ static int osd_ro(const struct lu_env *env, struct dt_device *d)
        }
        CDEBUG(D_IOCTL | D_HA, "set dev %lx rdonly\n", (long)dev);
        dev_set_rdonly(dev);
        }
        CDEBUG(D_IOCTL | D_HA, "set dev %lx rdonly\n", (long)dev);
        dev_set_rdonly(dev);
-#else
-       CERROR("%s: %lx CANNOT BE SET READONLY: rc = %d\n",
-              osd_dt_dev(d)->od_svname, (long)dev, rc);
+
+       if (sb->s_op->unfreeze_fs)
+               sb->s_op->unfreeze_fs(sb);
+
+out:
 #endif
 #endif
+       if (rc)
+               CERROR("%s: %lx CANNOT BE SET READONLY: rc = %d\n",
+                      osd_dt_dev(d)->od_svname, (long)dev, rc);
+
        RETURN(rc);
 }
 
        RETURN(rc);
 }