diff options
Diffstat (limited to 'fs/ceph/mds_client.c')
-rw-r--r-- | fs/ceph/mds_client.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 6e08f488a30f..623c67cd484b 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -1624,11 +1624,29 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, | |||
1624 | err = PTR_ERR(req->r_reply); | 1624 | err = PTR_ERR(req->r_reply); |
1625 | req->r_reply = NULL; | 1625 | req->r_reply = NULL; |
1626 | 1626 | ||
1627 | /* clean up */ | 1627 | if (err == -ERESTARTSYS) { |
1628 | __unregister_request(mdsc, req); | 1628 | /* aborted */ |
1629 | if (!list_empty(&req->r_unsafe_item)) | 1629 | req->r_aborted = true; |
1630 | list_del_init(&req->r_unsafe_item); | 1630 | |
1631 | complete(&req->r_safe_completion); | 1631 | if (req->r_locked_dir && |
1632 | (req->r_op & CEPH_MDS_OP_WRITE)) { | ||
1633 | struct ceph_inode_info *ci = | ||
1634 | ceph_inode(req->r_locked_dir); | ||
1635 | |||
1636 | dout("aborted, clearing I_COMPLETE on %p\n", | ||
1637 | req->r_locked_dir); | ||
1638 | spin_lock(&req->r_locked_dir->i_lock); | ||
1639 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; | ||
1640 | ci->i_release_count++; | ||
1641 | spin_unlock(&req->r_locked_dir->i_lock); | ||
1642 | } | ||
1643 | } else { | ||
1644 | /* clean up this request */ | ||
1645 | __unregister_request(mdsc, req); | ||
1646 | if (!list_empty(&req->r_unsafe_item)) | ||
1647 | list_del_init(&req->r_unsafe_item); | ||
1648 | complete(&req->r_safe_completion); | ||
1649 | } | ||
1632 | } else if (req->r_err) { | 1650 | } else if (req->r_err) { |
1633 | err = req->r_err; | 1651 | err = req->r_err; |
1634 | } else { | 1652 | } else { |