Skip to content

Commit

Permalink
block/rnbd-srv: Remove force_close file after holding a lock
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Gioh Kim authored and Jens Axboe committed Apr 20, 2021
1 parent b168e1d commit c77bfa8
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 6 deletions.
5 changes: 1 addition & 4 deletions drivers/block/rnbd/rnbd-srv-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

/* first remove sysfs itself to avoid deadlock */
sysfs_remove_file_self(&sess_dev->kobj, &attr->attr);
rnbd_srv_sess_dev_force_close(sess_dev);
rnbd_srv_sess_dev_force_close(sess_dev, attr);

return count;
}
Expand Down
5 changes: 4 additions & 1 deletion drivers/block/rnbd/rnbd-srv.c
Original file line number Diff line number Diff line change
Expand Up @@ -329,14 +329,17 @@ 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;

sess_dev->keep_id = true;
/* 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);
}
Expand Down
3 changes: 2 additions & 1 deletion drivers/block/rnbd/rnbd-srv.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ struct rnbd_srv_sess_dev {
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 */

int rnbd_srv_create_dev_sysfs(struct rnbd_srv_dev *dev,
Expand Down

0 comments on commit c77bfa8

Please sign in to comment.