aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-10-27 05:18:00 -0400
committerIlya Dryomov <idryomov@gmail.com>2015-11-02 17:36:48 -0500
commit4c06ace81a60636dec358c288ef6aaf3aa6dc599 (patch)
tree08b483ee257ddba892f29aec5310a6e741c197ed /fs
parentcbf99a11fb14db0835acd79ecd7469d37e398660 (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.c18
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);