Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
MRP-2135 osd: set rdonly correctly.
freeze a journal before set read-only to prevent ability
to start new hanlde or commit a transaction in that time.

Signed-off-by: Alexey Lyashkov <alexey.lyashkov@seagate.com>
Change-Id: I32d5919e2a432e7a5bdb922da58af2600b368365
Signed-off-by: vinayakswami hariharmath <vinayakswami.hariharmath@seagate.com>
Reviewed-on: http://es-gerrit.xyus.xyratex.com:8080/6214
Tested-by: Jenkins
Reviewed-by: Andrew Perepechko <andrew.perepechko@seagate.com>
Reviewed-by: Rahul Deshmukh <rahul.deshmukh@seagate.com>
Tested-by: Vitaly Fertman <vitaly.fertman@seagate.com>
  • Loading branch information
MorpheusTeam authored and Vitaly Fertman committed Oct 6, 2015
1 parent fc5840a commit 6197a27
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 10 deletions.
39 changes: 39 additions & 0 deletions ldiskfs/kernel_patches/patches/rhel6.5/export-write-super.patch
@@ -0,0 +1,39 @@
--- linux-stage.orig/fs/ext4/ext4.h 2015-08-25 13:34:34.492894882 +0530
+++ linux-stage/fs/ext4/ext4.h 2015-08-25 13:23:08.211892985 +0530
@@ -1992,6 +1992,8 @@ extern int ext4_group_extend(struct supe
ext4_fsblk_t n_blocks_count);

/* super.c */
+#define HAVE_EXT4_COMMIT_SUPER
+extern int ext4_commit_super(struct super_block *sb, int sync);
extern void *ext4_kvmalloc(size_t size, gfp_t flags);
extern void *ext4_kvzalloc(size_t size, gfp_t flags);
extern void ext4_kvfree(void *ptr);
--- linux-stage.orig/fs/ext4/super.c 2015-08-25 13:34:34.491894938 +0530
+++ linux-stage/fs/ext4/super.c 2015-08-25 13:28:42.279894767 +0530
@@ -63,7 +63,6 @@ static struct ext4_features *ext4_feat;

static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
unsigned long journal_devnum);
-static int ext4_commit_super(struct super_block *sb, int sync);
static void ext4_mark_recovery_complete(struct super_block *sb,
struct ext4_super_block *es);
static void ext4_clear_journal_err(struct super_block *sb,
@@ -4074,7 +4073,7 @@ static int ext4_load_journal(struct supe
return 0;
}

-static int ext4_commit_super(struct super_block *sb, int sync)
+int ext4_commit_super(struct super_block *sb, int sync)
{
struct ext4_super_block *es = EXT4_SB(sb)->s_es;
struct buffer_head *sbh = EXT4_SB(sb)->s_sbh;
@@ -4141,7 +4140,7 @@ static int ext4_commit_super(struct supe
}
return error;
}
-
+EXPORT_SYMBOL(ext4_commit_super);
/*
* Have we just finished recovery? If so, and if we are mounting (or
* remounting) the filesystem readonly, then we will end up with a
1 change: 1 addition & 0 deletions ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel6.5.series
Expand Up @@ -51,3 +51,4 @@ rhel6.3/ext4-dont-check-in-ro.patch
rhel6.5/ext4-bitmap-hold.patch
rhel6.3/ext4-speed-up-releasing-blocks-on-commit.patch
rhel6.3/ext4-notalloc_under_idatasem.patch
rhel6.5/export-write-super.patch
4 changes: 3 additions & 1 deletion lustre/mdt/mdt_handler.c
Expand Up @@ -5487,7 +5487,9 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
rc = mdt_device_sync(&env, mdt);
break;
case OBD_IOC_SET_READONLY:
rc = dt->dd_ops->dt_ro(&env, dt);
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));
Expand Down
2 changes: 1 addition & 1 deletion lustre/mdt/mdt_internal.h
Expand Up @@ -926,7 +926,7 @@ static inline int mdt_fail_write(const struct lu_env *env,
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);
return dt_ro(env, dd);
/* We set FAIL_ONCE because we never "un-fail" a device */
}

Expand Down
26 changes: 18 additions & 8 deletions lustre/osd-ldiskfs/osd_handler.c
Expand Up @@ -1369,6 +1369,7 @@ static int osd_ro(const struct lu_env *env, struct dt_device *d)
struct block_device *dev = sb->s_bdev;
#ifdef HAVE_DEV_SET_RDONLY
struct block_device *jdev = LDISKFS_SB(sb)->journal_bdev;
journal_t *journal = LDISKFS_SB(sb)->s_journal;
int rc = 0;
#else
int rc = -EOPNOTSUPP;
Expand All @@ -1377,20 +1378,29 @@ 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);

CDEBUG(D_IOCTL | D_HA, "set dev %lx rdonly\n", (long)dev);
dev_set_rdonly(dev);
/* we need to be sure all fs modification exist on journal
* and later may restored */
/* freeze a fs - code based on ext4_freeze function */
jbd2_journal_lock_updates(journal);
rc = jbd2_journal_flush(journal);
if (rc < 0)
goto out;
#ifdef HAVE_LDISKFS_COMMIT_SUPER
rc = ldiskfs_commit_super(sb, 1);
if (rc < 0)
goto out;
#endif
if (jdev && (jdev != dev)) {
CDEBUG(D_IOCTL | D_HA, "set journal dev %lx rdonly\n",
(long)jdev);
dev_set_rdonly(jdev);
}
#else
CERROR("%s: %lx CANNOT BE SET READONLY: rc = %d\n",
osd_dt_dev(d)->od_svname, (long)dev, rc);
CDEBUG(D_IOCTL | D_HA, "set dev %lx rdonly\n", (long)dev);
dev_set_rdonly(dev);
out:
jbd2_journal_unlock_updates(journal);
#endif
if (rc)
CERROR("%s: %lx CANNOT BE SET READONLY: rc = %d\n",
osd_dt_dev(d)->od_svname, (long)dev, rc);
RETURN(rc);
}

Expand Down

0 comments on commit 6197a27

Please sign in to comment.