mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
freezer: Add unsafe versions of freezable_schedule_timeout_interruptible for NFS
commit0688e64bc6
("NFS: Allow signal interruption of NFS4ERR_DELAYed operations") introduces nfs4_delay_interruptible which also needs an _unsafe version to avoid the following call trace for the same reason explained in commit416ad3c9c0
("freezer: add unsafe versions of freezable helpers for NFS") CPU: 4 PID: 3968 Comm: rm Tainted: G W 5.8.0-rc4 #1 Hardware name: Marvell OcteonTX CN96XX board (DT) Call trace: dump_backtrace+0x0/0x1dc show_stack+0x20/0x30 dump_stack+0xdc/0x150 debug_check_no_locks_held+0x98/0xa0 nfs4_delay_interruptible+0xd8/0x120 nfs4_handle_exception+0x130/0x170 nfs4_proc_rmdir+0x8c/0x220 nfs_rmdir+0xa4/0x360 vfs_rmdir.part.0+0x6c/0x1b0 do_rmdir+0x18c/0x210 __arm64_sys_unlinkat+0x64/0x7c el0_svc_common.constprop.0+0x7c/0x110 do_el0_svc+0x24/0xa0 el0_sync_handler+0x13c/0x1b8 el0_sync+0x158/0x180 Signed-off-by: He Zhe <zhe.he@windriver.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
4a400f0d08
commit
ab91e7a6da
@ -416,7 +416,7 @@ static int nfs4_delay_interruptible(long *timeout)
|
|||||||
{
|
{
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
freezable_schedule_timeout_interruptible(nfs4_update_delay(timeout));
|
freezable_schedule_timeout_interruptible_unsafe(nfs4_update_delay(timeout));
|
||||||
if (!signal_pending(current))
|
if (!signal_pending(current))
|
||||||
return 0;
|
return 0;
|
||||||
return __fatal_signal_pending(current) ? -EINTR :-ERESTARTSYS;
|
return __fatal_signal_pending(current) ? -EINTR :-ERESTARTSYS;
|
||||||
|
@ -207,6 +207,17 @@ static inline long freezable_schedule_timeout_interruptible(long timeout)
|
|||||||
return __retval;
|
return __retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION */
|
||||||
|
static inline long freezable_schedule_timeout_interruptible_unsafe(long timeout)
|
||||||
|
{
|
||||||
|
long __retval;
|
||||||
|
|
||||||
|
freezer_do_not_count();
|
||||||
|
__retval = schedule_timeout_interruptible(timeout);
|
||||||
|
freezer_count_unsafe();
|
||||||
|
return __retval;
|
||||||
|
}
|
||||||
|
|
||||||
/* Like schedule_timeout_killable(), but should not block the freezer. */
|
/* Like schedule_timeout_killable(), but should not block the freezer. */
|
||||||
static inline long freezable_schedule_timeout_killable(long timeout)
|
static inline long freezable_schedule_timeout_killable(long timeout)
|
||||||
{
|
{
|
||||||
@ -285,6 +296,9 @@ static inline void set_freezable(void) {}
|
|||||||
#define freezable_schedule_timeout_interruptible(timeout) \
|
#define freezable_schedule_timeout_interruptible(timeout) \
|
||||||
schedule_timeout_interruptible(timeout)
|
schedule_timeout_interruptible(timeout)
|
||||||
|
|
||||||
|
#define freezable_schedule_timeout_interruptible_unsafe(timeout) \
|
||||||
|
schedule_timeout_interruptible(timeout)
|
||||||
|
|
||||||
#define freezable_schedule_timeout_killable(timeout) \
|
#define freezable_schedule_timeout_killable(timeout) \
|
||||||
schedule_timeout_killable(timeout)
|
schedule_timeout_killable(timeout)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user