summaryrefslogtreecommitdiffstats
path: root/drivers/block/rnbd/rnbd-srv.c
diff options
context:
space:
mode:
authorGioh Kim <gi-oh.kim@cloud.ionos.com>2021-04-19 09:37:13 +0200
committerJens Axboe <axboe@kernel.dk>2021-04-20 08:59:04 -0600
commitc77bfa8f5dbd3f8bbb99a751bab00ebcc229a5c5 (patch)
treed510b6fca467acbe0e828f25d8a01aaa3c293044 /drivers/block/rnbd/rnbd-srv.c
parentb168e1d85cf3201663698dd9dcb3d46c7e67f621 (diff)
downloadlinux-stable-c77bfa8f5dbd3f8bbb99a751bab00ebcc229a5c5.tar.gz
linux-stable-c77bfa8f5dbd3f8bbb99a751bab00ebcc229a5c5.tar.bz2
linux-stable-c77bfa8f5dbd3f8bbb99a751bab00ebcc229a5c5.zip
block/rnbd-srv: Remove force_close file after holding a lock
We changed the rnbd_srv_sess_dev_force_close to use try-lock because rnbd_srv_sess_dev_force_close and process_msg_close can generate a deadlock. Now rnbd_srv_sess_dev_force_close would do nothing if it fails to get the lock. So removing the force_close file should be moved to after the lock. Or the force_close file is removed but the others are not removed. Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com> Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com> Signed-off-by: Jack Wang <jinpu.wang@ionos.com> Link: https://lore.kernel.org/r/20210419073722.15351-11-gi-oh.kim@ionos.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block/rnbd/rnbd-srv.c')
-rw-r--r--drivers/block/rnbd/rnbd-srv.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c
index 1549a6361630..a9bb414f7442 100644
--- a/drivers/block/rnbd/rnbd-srv.c
+++ b/drivers/block/rnbd/rnbd-srv.c
@@ -329,7 +329,8 @@ static int rnbd_srv_link_ev(struct rtrs_srv *rtrs,
}
}
-void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev)
+void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev,
+ struct kobj_attribute *attr)
{
struct rnbd_srv_session *sess = sess_dev->sess;
@@ -337,6 +338,8 @@ void rnbd_srv_sess_dev_force_close(struct rnbd_srv_sess_dev *sess_dev)
/* It is already started to close by client's close message. */
if (!mutex_trylock(&sess->lock))
return;
+ /* first remove sysfs itself to avoid deadlock */
+ sysfs_remove_file_self(&sess_dev->kobj, &attr->attr);
rnbd_srv_destroy_dev_session_sysfs(sess_dev);
mutex_unlock(&sess->lock);
}