Commit c77bfa8f authored by Gioh Kim's avatar Gioh Kim Committed by Jens Axboe

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: default avatarGioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: default avatarMd Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: default avatarJack Wang <jinpu.wang@ionos.com>
Link: https://lore.kernel.org/r/20210419073722.15351-11-gi-oh.kim@ionos.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent b168e1d8
...@@ -147,10 +147,7 @@ static ssize_t rnbd_srv_dev_session_force_close_store(struct kobject *kobj, ...@@ -147,10 +147,7 @@ static ssize_t rnbd_srv_dev_session_force_close_store(struct kobject *kobj,
} }
rnbd_srv_info(sess_dev, "force close requested\n"); rnbd_srv_info(sess_dev, "force close requested\n");
rnbd_srv_sess_dev_force_close(sess_dev, attr);
/* first remove sysfs itself to avoid deadlock */
sysfs_remove_file_self(&sess_dev->kobj, &attr->attr);
rnbd_srv_sess_dev_force_close(sess_dev);
return count; return count;
} }
......
...@@ -329,7 +329,8 @@ static int rnbd_srv_link_ev(struct rtrs_srv *rtrs, ...@@ -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; 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) ...@@ -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. */ /* It is already started to close by client's close message. */
if (!mutex_trylock(&sess->lock)) if (!mutex_trylock(&sess->lock))
return; 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); rnbd_srv_destroy_dev_session_sysfs(sess_dev);
mutex_unlock(&sess->lock); mutex_unlock(&sess->lock);
} }
......
...@@ -64,7 +64,8 @@ struct rnbd_srv_sess_dev { ...@@ -64,7 +64,8 @@ struct rnbd_srv_sess_dev {
enum rnbd_access_mode access_mode; enum rnbd_access_mode access_mode;
}; };
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);
/* rnbd-srv-sysfs.c */ /* rnbd-srv-sysfs.c */
int rnbd_srv_create_dev_sysfs(struct rnbd_srv_dev *dev, int rnbd_srv_create_dev_sysfs(struct rnbd_srv_dev *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment