summaryrefslogtreecommitdiffstats
path: root/fs/ceph/caps.c
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2017-06-27 05:17:24 -0400
committerIlya Dryomov <idryomov@gmail.com>2017-07-07 11:25:13 -0400
commit4b9f2042fd2a9da7e6c7b4dd49eff19dc3754e4f (patch)
tree7856299e8f18a048896874a063a9e40131957f7a /fs/ceph/caps.c
parent62a65f36d016fff32179acdbfcb8b2d8d9e54757 (diff)
ceph: avoid accessing freeing inode in ceph_check_delayed_caps()
Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r--fs/ceph/caps.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index f5552455223f..7007ae2a5ad2 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -3809,6 +3809,7 @@ bad:
3809 */ 3809 */
3810void ceph_check_delayed_caps(struct ceph_mds_client *mdsc) 3810void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
3811{ 3811{
3812 struct inode *inode;
3812 struct ceph_inode_info *ci; 3813 struct ceph_inode_info *ci;
3813 int flags = CHECK_CAPS_NODELAY; 3814 int flags = CHECK_CAPS_NODELAY;
3814 3815
@@ -3824,9 +3825,15 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
3824 time_before(jiffies, ci->i_hold_caps_max)) 3825 time_before(jiffies, ci->i_hold_caps_max))
3825 break; 3826 break;
3826 list_del_init(&ci->i_cap_delay_list); 3827 list_del_init(&ci->i_cap_delay_list);
3828
3829 inode = igrab(&ci->vfs_inode);
3827 spin_unlock(&mdsc->cap_delay_lock); 3830 spin_unlock(&mdsc->cap_delay_lock);
3828 dout("check_delayed_caps on %p\n", &ci->vfs_inode); 3831
3829 ceph_check_caps(ci, flags, NULL); 3832 if (inode) {
3833 dout("check_delayed_caps on %p\n", inode);
3834 ceph_check_caps(ci, flags, NULL);
3835 iput(inode);
3836 }
3830 } 3837 }
3831 spin_unlock(&mdsc->cap_delay_lock); 3838 spin_unlock(&mdsc->cap_delay_lock);
3832} 3839}