Commit df963ea8 authored by Jeff Layton's avatar Jeff Layton Committed by Ilya Dryomov

ceph: remove req from unsafe list when unregistering it

There's no reason a request should ever be on a s_unsafe list but not
in the request tree.

Cc: stable@vger.kernel.org
Link: http://tracker.ceph.com/issues/18474Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Reviewed-by: default avatarYan, Zheng <zyan@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent b9942bc9
...@@ -628,6 +628,9 @@ static void __unregister_request(struct ceph_mds_client *mdsc, ...@@ -628,6 +628,9 @@ static void __unregister_request(struct ceph_mds_client *mdsc,
{ {
dout("__unregister_request %p tid %lld\n", req, req->r_tid); dout("__unregister_request %p tid %lld\n", req, req->r_tid);
/* Never leave an unregistered request on an unsafe list! */
list_del_init(&req->r_unsafe_item);
if (req->r_tid == mdsc->oldest_tid) { if (req->r_tid == mdsc->oldest_tid) {
struct rb_node *p = rb_next(&req->r_node); struct rb_node *p = rb_next(&req->r_node);
mdsc->oldest_tid = 0; mdsc->oldest_tid = 0;
...@@ -1058,7 +1061,6 @@ static void cleanup_session_requests(struct ceph_mds_client *mdsc, ...@@ -1058,7 +1061,6 @@ static void cleanup_session_requests(struct ceph_mds_client *mdsc,
while (!list_empty(&session->s_unsafe)) { while (!list_empty(&session->s_unsafe)) {
req = list_first_entry(&session->s_unsafe, req = list_first_entry(&session->s_unsafe,
struct ceph_mds_request, r_unsafe_item); struct ceph_mds_request, r_unsafe_item);
list_del_init(&req->r_unsafe_item);
pr_warn_ratelimited(" dropping unsafe request %llu\n", pr_warn_ratelimited(" dropping unsafe request %llu\n",
req->r_tid); req->r_tid);
__unregister_request(mdsc, req); __unregister_request(mdsc, req);
...@@ -2469,7 +2471,6 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) ...@@ -2469,7 +2471,6 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
* useful we could do with a revised return value. * useful we could do with a revised return value.
*/ */
dout("got safe reply %llu, mds%d\n", tid, mds); dout("got safe reply %llu, mds%d\n", tid, mds);
list_del_init(&req->r_unsafe_item);
/* last unsafe request during umount? */ /* last unsafe request during umount? */
if (mdsc->stopping && !__get_oldest_req(mdsc)) if (mdsc->stopping && !__get_oldest_req(mdsc))
......
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