mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
ceph: register MDS request with dir inode from the start
When the unsafe reply to a request comes in, the request is put on the r_unsafe_dir inode's list. In future patches, we're going to need to wait on requests that may not have gotten an unsafe reply yet. Change __register_request to put the entry on the dir inode's list when the pointer is set in the request, and don't check the CEPH_MDS_R_GOT_UNSAFE flag when unregistering it. The only place that uses this list today is fsync codepath, and with the coming changes, we'll want to wait on all operations whether it has gotten an unsafe reply or not. Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
7111951b8d
commit
3db0a2fc56
1 changed files with 6 additions and 10 deletions
|
@ -793,8 +793,13 @@ static void __register_request(struct ceph_mds_client *mdsc,
|
|||
mdsc->oldest_tid = req->r_tid;
|
||||
|
||||
if (dir) {
|
||||
struct ceph_inode_info *ci = ceph_inode(dir);
|
||||
|
||||
ihold(dir);
|
||||
req->r_unsafe_dir = dir;
|
||||
spin_lock(&ci->i_unsafe_lock);
|
||||
list_add_tail(&req->r_unsafe_dir_item, &ci->i_unsafe_dirops);
|
||||
spin_unlock(&ci->i_unsafe_lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -822,8 +827,7 @@ static void __unregister_request(struct ceph_mds_client *mdsc,
|
|||
|
||||
erase_request(&mdsc->request_tree, req);
|
||||
|
||||
if (req->r_unsafe_dir &&
|
||||
test_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags)) {
|
||||
if (req->r_unsafe_dir) {
|
||||
struct ceph_inode_info *ci = ceph_inode(req->r_unsafe_dir);
|
||||
spin_lock(&ci->i_unsafe_lock);
|
||||
list_del_init(&req->r_unsafe_dir_item);
|
||||
|
@ -2935,14 +2939,6 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
|
|||
} else {
|
||||
set_bit(CEPH_MDS_R_GOT_UNSAFE, &req->r_req_flags);
|
||||
list_add_tail(&req->r_unsafe_item, &req->r_session->s_unsafe);
|
||||
if (req->r_unsafe_dir) {
|
||||
struct ceph_inode_info *ci =
|
||||
ceph_inode(req->r_unsafe_dir);
|
||||
spin_lock(&ci->i_unsafe_lock);
|
||||
list_add_tail(&req->r_unsafe_dir_item,
|
||||
&ci->i_unsafe_dirops);
|
||||
spin_unlock(&ci->i_unsafe_lock);
|
||||
}
|
||||
}
|
||||
|
||||
dout("handle_reply tid %lld result %d\n", tid, result);
|
||||
|
|
Loading…
Reference in a new issue