{
struct mds_obd *mds = &obd->u.mds;
ll_sbdev_type save_dev;
+ int must_relock = 0;
ENTRY;
if (mds->mds_sb == NULL)
}
mds_fs_cleanup(obd);
- unlock_kernel();
+ /* We can only unlock kernel if we are in the context of sys_ioctl,
+ otherwise we never called lock_kernel */
+ if (kernel_locked()) {
+ unlock_kernel();
+ must_relock++;
+ }
/* 2 seems normal on mds, (may_umount() also expects 2
fwiw), but we only see 1 at this point in obdfilter. */
ll_clear_rdonly(save_dev);
- lock_kernel();
+ if (must_relock)
+ lock_kernel();
+
fsfilt_put_ops(obd->obd_fsops);
LCONSOLE_INFO("MDT %s has stopped.\n", obd->obd_name);
sigfillset(¤t->blocked);
RECALC_SIGPENDING;
SIGNAL_MASK_UNLOCK(current, flags);
+ unlock_kernel();
obd = mlsi->mlsi_obd;
uuid = mlsi->mlsi_uuid;
{
struct filter_obd *filter = &obd->u.filter;
ll_sbdev_type save_dev;
+ int must_relock = 0;
ENTRY;
if (obd->obd_fail)
obd->obd_name, filter->fo_vfsmnt,
atomic_read(&filter->fo_vfsmnt->mnt_count));
- unlock_kernel();
+ /* We can only unlock kernel if we are in the context of sys_ioctl,
+ otherwise we never called lock_kernel */
+ if (kernel_locked()) {
+ unlock_kernel();
+ must_relock++;
+ }
+
mntput(filter->fo_vfsmnt);
//destroy_buffers(filter->fo_sb->s_dev);
filter->fo_sb = NULL;
ll_clear_rdonly(save_dev);
+ if (must_relock)
+ lock_kernel();
+
fsfilt_put_ops(obd->obd_fsops);
- lock_kernel();
LCONSOLE_INFO("OST %s has stopped.\n", obd->obd_name);