[PATCH 01/11] drbd_nl: dont allow detating to be inttrupted in waiting D_DETACHING to DISKLESS
"zhengbing.huang" <[email protected]>
| Newsgroups | dev.linux.lists.drbd-dev |
|---|---|
| Message-ID | <[email protected]> |
From: Dongsheng Yang <[email protected]> In our network failure and drbd down testing, we found warning in dmesg and drbd down process into D state: "kernel: drbd /unregistered/ramtest3/0 drbd103: ASSERTION device->disk_state[NOW] == D_FAILED || device->disk_state[NOW] == D_DETACHING FAILED in go_diskless" the problem is the wait_event is inttruptable, it could be intrupted by signal and call drbd_cleanup_device before go_diskless() Signed-off-by: Dongsheng Yang <[email protected]> --- drbd/drbd_nl.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c index 530334e61..7b4539431 100644 --- a/drbd/drbd_nl.c +++ b/drbd/drbd_nl.c @@ -3676,7 +3676,7 @@ static int adm_detach(struct drbd_device *device, bool force, bool intentional_d const char *tag, struct sk_buff *reply_skb) { const char *err_str = NULL; - int ret, retcode; + int retcode; device->device_conf.intentional_diskless = intentional_diskless; if (force) { @@ -3692,19 +3692,16 @@ static int adm_detach(struct drbd_device *device, bool force, bool intentional_d CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, tag, &err_str)); /* D_DETACHING will transition to DISKLESS. */ drbd_resume_io(device); - ret = wait_event_interruptible(device->misc_wait, - get_disk_state(device) != D_DETACHING); + wait_event(device->misc_wait, get_disk_state(device) != D_DETACHING); if (retcode >= SS_SUCCESS) { /* wait for completion of drbd_ldev_destroy() */ - wait_event_interruptible(device->misc_wait, !test_bit(GOING_DISKLESS, &device->flags)); + wait_event(device->misc_wait, !test_bit(GOING_DISKLESS, &device->flags)); drbd_cleanup_device(device); } else device->device_conf.intentional_diskless = false; if (retcode == SS_IS_DISKLESS) retcode = SS_NOTHING_TO_DO; - if (ret) - retcode = ERR_INTR; out: if (err_str) { drbd_msg_put_info(reply_skb, err_str); -- 2.27.0