Add check for journal presence during ldiskfs mount
Xyratex-Bug-Id: MRP-118
Change-Id: If26005f7b597ed8815991fac7cda80e1df2f36e9
Signed-off-by: Andriy Skulysh <Andriy_Skulysh@xyratex.com>
Reviewed-by: Alexey Lyashkov <alexey_lyashkov@xyratex.com>
Reviewed-by: Andrew Perepechko <andrew_perepechko@xyratex.com>
Reviewed-on: http://review.whamcloud.com/1687
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
sbi->dx_unlock = fsfilt_ext3_dx_unlock;
#endif
#endif
sbi->dx_unlock = fsfilt_ext3_dx_unlock;
#endif
#endif
+ if (!EXT3_HAS_COMPAT_FEATURE(sb,
+ EXT3_FEATURE_COMPAT_HAS_JOURNAL)) {
+ CERROR("ext3 mounted without journal\n");
+ return -EINVAL;
+ }
+
#ifdef S_PDIROPS
CWARN("Enabling PDIROPS\n");
set_opt(sbi->s_mount_opt, PDIROPS);
#ifdef S_PDIROPS
CWARN("Enabling PDIROPS\n");
set_opt(sbi->s_mount_opt, PDIROPS);
l_fid2dentry: mds_lvfs_fid2dentry,
};
l_fid2dentry: mds_lvfs_fid2dentry,
};
-static void mds_init_ctxt(struct obd_device *obd, struct vfsmount *mnt)
+static int mds_init_ctxt(struct obd_device *obd, struct vfsmount *mnt)
{
struct mds_obd *mds = &obd->u.mds;
{
struct mds_obd *mds = &obd->u.mds;
mds->mds_obt.obt_vfsmnt = mnt;
/* why not mnt->mnt_sb instead of mnt->mnt_root->d_inode->i_sb? */
obd->u.obt.obt_sb = mnt->mnt_root->d_inode->i_sb;
obd->u.obt.obt_magic = OBT_MAGIC;
mds->mds_obt.obt_vfsmnt = mnt;
/* why not mnt->mnt_sb instead of mnt->mnt_root->d_inode->i_sb? */
obd->u.obt.obt_sb = mnt->mnt_root->d_inode->i_sb;
obd->u.obt.obt_magic = OBT_MAGIC;
- fsfilt_setup(obd, obd->u.obt.obt_sb);
+ rc = fsfilt_setup(obd, obd->u.obt.obt_sb);
+ if (rc)
+ return rc;
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
obd->obd_lvfs_ctxt.pwd = mnt->mnt_root;
obd->obd_lvfs_ctxt.fs = get_ds();
obd->obd_lvfs_ctxt.cb_ops = mds_lvfs_ops;
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
obd->obd_lvfs_ctxt.pwd = mnt->mnt_root;
obd->obd_lvfs_ctxt.fs = get_ds();
obd->obd_lvfs_ctxt.cb_ops = mds_lvfs_ops;
}
/*mds still need lov setup here*/
}
/*mds still need lov setup here*/
cfs_init_rwsem(&mds->mds_notify_lock);
obd->obd_fsops = fsfilt_get_ops(MT_STR(lsi->lsi_ldd));
cfs_init_rwsem(&mds->mds_notify_lock);
obd->obd_fsops = fsfilt_get_ops(MT_STR(lsi->lsi_ldd));
- mds_init_ctxt(obd, mnt);
+ rc = mds_init_ctxt(obd, mnt);
+ if (rc)
+ GOTO(err_putfs, rc);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, "OBJECTS", 0777, 1);
if (IS_ERR(dentry)) {
rc = PTR_ERR(dentry);
CERROR("cannot create OBJECTS directory: rc = %d\n", rc);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, "OBJECTS", 0777, 1);
if (IS_ERR(dentry)) {
rc = PTR_ERR(dentry);
CERROR("cannot create OBJECTS directory: rc = %d\n", rc);
}
mds->mds_objects_dir = dentry;
}
mds->mds_objects_dir = dentry;
if (rc)
GOTO(err_objects, rc);
if (rc)
GOTO(err_objects, rc);
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
err_objects:
dput(mds->mds_objects_dir);
err_objects:
dput(mds->mds_objects_dir);
+err_pop:
+ pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
err_putfs:
fsfilt_put_ops(obd->obd_fsops);
err_putfs:
fsfilt_put_ops(obd->obd_fsops);
}
static int mds_cmd_cleanup(struct obd_device *obd)
}
static int mds_cmd_cleanup(struct obd_device *obd)
}
cli->cl_mgc_vfsmnt = mnt;
}
cli->cl_mgc_vfsmnt = mnt;
- fsfilt_setup(obd, mnt->mnt_sb);
+ err = fsfilt_setup(obd, mnt->mnt_sb);
+ if (err)
+ GOTO(err_ops, err);
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
mgs->mgs_vfsmnt = mnt;
mgs->mgs_sb = mnt->mnt_root->d_inode->i_sb;
mgs->mgs_vfsmnt = mnt;
mgs->mgs_sb = mnt->mnt_root->d_inode->i_sb;
- fsfilt_setup(obd, mgs->mgs_sb);
+ rc = fsfilt_setup(obd, mgs->mgs_sb);
+ if (rc)
+ RETURN(rc);
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
filter->fo_fstype = mnt->mnt_sb->s_type->name;
CDEBUG(D_SUPER, "%s: mnt = %p\n", filter->fo_fstype, mnt);
filter->fo_fstype = mnt->mnt_sb->s_type->name;
CDEBUG(D_SUPER, "%s: mnt = %p\n", filter->fo_fstype, mnt);
- fsfilt_setup(obd, obd->u.obt.obt_sb);
+ rc = fsfilt_setup(obd, obd->u.obt.obt_sb);
+ if (rc)
+ GOTO(err_ops, rc);
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
obd->obd_lvfs_ctxt.pwdmnt = mnt;
}
run_test 61 "large xattr"
}
run_test 61 "large xattr"
+test_62() {
+ # MRP-118
+ local mdsdev=$(mdsdevname 1)
+ local ostdev=$(ostdevname 1)
+
+ echo "disable journal for mds"
+ do_facet mds tune2fs -O ^has_journal $mdsdev || error "tune2fs failed"
+ start_mds && error "MDT start should fail"
+ echo "disable journal for ost"
+ do_facet ost1 tune2fs -O ^has_journal $ostdev || error "tune2fs failed"
+ start_ost && error "OST start should fail"
+ cleanup || return $?
+ reformat_and_config
+}
+run_test 62 "start with disabled journal"
+
if ! combined_mgs_mds ; then
stop mgs
fi
if ! combined_mgs_mds ; then
stop mgs
fi