diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-10-27 05:18:00 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2015-11-02 17:36:48 -0500 |
commit | 4c06ace81a60636dec358c288ef6aaf3aa6dc599 (patch) | |
tree | 08b483ee257ddba892f29aec5310a6e741c197ed /fs | |
parent | cbf99a11fb14db0835acd79ecd7469d37e398660 (diff) |
ceph: add request to i_unsafe_dirops when getting unsafe reply
Previously we add request to i_unsafe_dirops when registering
request. So ceph_fsync() also waits for imcomplete requests.
This is unnecessary, ceph_fsync() only needs to wait unsafe
requests.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ceph/mds_client.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index a7a967abb49e..1e47a3d1d12f 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -633,13 +633,8 @@ static void __register_request(struct ceph_mds_client *mdsc, | |||
633 | mdsc->oldest_tid = req->r_tid; | 633 | mdsc->oldest_tid = req->r_tid; |
634 | 634 | ||
635 | if (dir) { | 635 | if (dir) { |
636 | struct ceph_inode_info *ci = ceph_inode(dir); | ||
637 | |||
638 | ihold(dir); | 636 | ihold(dir); |
639 | spin_lock(&ci->i_unsafe_lock); | ||
640 | req->r_unsafe_dir = dir; | 637 | req->r_unsafe_dir = dir; |
641 | list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops); | ||
642 | spin_unlock(&ci->i_unsafe_lock); | ||
643 | } | 638 | } |
644 | } | 639 | } |
645 | 640 | ||
@@ -665,13 +660,14 @@ static void __unregister_request(struct ceph_mds_client *mdsc, | |||
665 | rb_erase(&req->r_node, &mdsc->request_tree); | 660 | rb_erase(&req->r_node, &mdsc->request_tree); |
666 | RB_CLEAR_NODE(&req->r_node); | 661 | RB_CLEAR_NODE(&req->r_node); |
667 | 662 | ||
668 | if (req->r_unsafe_dir) { | 663 | if (req->r_unsafe_dir && req->r_got_unsafe) { |
669 | struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir); | 664 | struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir); |
670 | |||
671 | spin_lock(&ci->i_unsafe_lock); | 665 | spin_lock(&ci->i_unsafe_lock); |
672 | list_del_init(&req->r_unsafe_dir_item); | 666 | list_del_init(&req->r_unsafe_dir_item); |
673 | spin_unlock(&ci->i_unsafe_lock); | 667 | spin_unlock(&ci->i_unsafe_lock); |
668 | } | ||
674 | 669 | ||
670 | if (req->r_unsafe_dir) { | ||
675 | iput(req->r_unsafe_dir); | 671 | iput(req->r_unsafe_dir); |
676 | req->r_unsafe_dir = NULL; | 672 | req->r_unsafe_dir = NULL; |
677 | } | 673 | } |
@@ -2484,6 +2480,14 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
2484 | } else { | 2480 | } else { |
2485 | req->r_got_unsafe = true; | 2481 | req->r_got_unsafe = true; |
2486 | list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); | 2482 | list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe); |
2483 | if (req->r_unsafe_dir) { | ||
2484 | struct ceph_inode_info *ci = | ||
2485 | ceph_inode(req->r_unsafe_dir); | ||
2486 | spin_lock(&ci->i_unsafe_lock); | ||
2487 | list_add_tail(&req->r_unsafe_dir_item, | ||
2488 | &ci->i_unsafe_dirops); | ||
2489 | spin_unlock(&ci->i_unsafe_lock); | ||
2490 | } | ||
2487 | } | 2491 | } |
2488 | 2492 | ||
2489 | dout("handle_reply tid %lld result %d\n", tid, result); | 2493 | dout("handle_reply tid %lld result %d\n", tid, result); |