diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2014-07-30 10:12:47 +0800 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2015-11-14 18:57:13 +0100 |
commit | 79f4fd24076c15fa1d59cc5dfa4646d550c3432b (patch) | |
tree | 9f08c1c42f4af90aef409bdf9ae083ebc78f0e2a /fs | |
parent | 3057240acb6d1cc2f41d27f80f4a35bc85d949ae (diff) |
ceph: fix kick_requests()
commit 282c105225ec3229f344c5fced795b9e1e634440 upstream.
__do_request() may unregister the request. So we should update
iterator 'p' before calling __do_request()
Signed-off-by: "Yan, Zheng" <zheng.z.yan@intel.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ceph/mds_client.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 16c7e4ab94f0..5ef4c6ca5cb5 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -1975,11 +1975,12 @@ static void __wake_requests(struct ceph_mds_client *mdsc, static void kick_requests(struct ceph_mds_client *mdsc, int mds) { struct ceph_mds_request *req; - struct rb_node *p; + struct rb_node *p = rb_first(&mdsc->request_tree); dout("kick_requests mds%d\n", mds); - for (p = rb_first(&mdsc->request_tree); p; p = rb_next(p)) { + while (p) { req = rb_entry(p, struct ceph_mds_request, r_node); + p = rb_next(p); if (req->r_got_unsafe) continue; if (req->r_session && |