During umount mntput() is called. It uses delayed_mntput()
function, and it could take much time to finish. A block
device is occupied during delayed work.
[ 8753.941980] Lustre: server umount XXX complete
[ 8800.129136] sysrq: SysRq : Trigger a crash
PID: 319306 TASK:XXXX CPU: 2 COMMAND: "kworker/2:0"
#0 __schedule at
ffffffff9754e1d4
#1 preempt_schedule_common at
ffffffff9754e6fa
#2 _cond_resched at
ffffffff9754e72d
#3 invalidate_mapping_pages at
ffffffff96e72da5
#4 invalidate_bdev at
ffffffff96f5d13c
#5 ldiskfs_put_super at
ffffffffc1c82e34 [ldiskfs]
#6 generic_shutdown_super at
ffffffff96f1bdcc
#7 kill_block_super at
ffffffff96f1bed1
#8 deactivate_locked_super at
ffffffff96f1b784
#9 cleanup_mnt at
ffffffff96f3b86b
Let's use SB_KERNMOUNT flag during mount, it leads to
synchronous mntput().
It also calls flush_delayed_fput during umount to finish
delayed fput.
HPE-bug-id: LUS-11629
Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com>
Change-Id: Ia6729f6cbac85c3626562e946a4b96665a143714
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51731
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
#if !defined(SB_NODIRATIME) && defined(MS_NODIRATIME)
# define SB_NODIRATIME MS_NODIRATIME
#endif
+#if !defined(SB_KERNMOUNT) && defined(MS_KERNMOUNT)
+# define SB_KERNMOUNT MS_KERNMOUNT
+#endif
#ifndef HAVE_FILE_OPERATIONS_READ_WRITE_ITER
static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
RETURN(0);
}
+#ifdef HAVE_FLUSH_DELAYED_FPUT
+# define cfs_flush_delayed_fput() flush_delayed_fput()
+#else
+void (*cfs_flush_delayed_fput)(void);
+#endif /* HAVE_FLUSH_DELAYED_FPUT */
+
static void osd_umount(const struct lu_env *env, struct osd_device *o)
{
ENTRY;
o->od_mnt = NULL;
}
+ /* to be sure all delayed fput are finished */
+ cfs_flush_delayed_fput();
+
EXIT;
}
GOTO(out, rc = -ENODEV);
}
+ s_flags |= SB_KERNMOUNT;
o->od_mnt = vfs_kern_mount(type, s_flags, dev, options);
module_put(type->owner);
}
}
+#ifndef HAVE_FLUSH_DELAYED_FPUT
+ if (unlikely(cfs_flush_delayed_fput == NULL))
+ cfs_flush_delayed_fput =
+ cfs_kallsyms_lookup_name("flush_delayed_fput");
+#endif
+
return rc;
}