From a079ade7913b923b795ea5c01df4e69bf1a87691 Mon Sep 17 00:00:00 2001 From: Hongchao Zhang Date: Sun, 29 May 2016 02:52:18 +0800 Subject: [PATCH] LU-7428 osd: set device read-only correctly 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 Signed-off-by: vinayakswami hariharmath Signed-off-by: Gu Zheng Signed-off-by: Hongchao Zhang Reviewed-on: http://review.whamcloud.com/20586 Reviewed-by: Wang Shilong Reviewed-by: Andreas Dilger Tested-by: Jenkins Tested-by: Maloo --- lustre/mdt/mdt_handler.c | 16 +++++++++------- lustre/mdt/mdt_internal.h | 16 ++++++++-------- lustre/osd-ldiskfs/osd_handler.c | 18 +++++++++++++++--- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 58bd624..d9cc115 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -5910,13 +5910,15 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len, 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; diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index dc5d990..9ec2f34 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -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) { - 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) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 681897f..60855df 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -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); + 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); @@ -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); -#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 + if (rc) + CERROR("%s: %lx CANNOT BE SET READONLY: rc = %d\n", + osd_dt_dev(d)->od_svname, (long)dev, rc); + RETURN(rc); } -- 1.8.3.1