diff options
Diffstat (limited to 'fs/ceph/inode.c')
| -rw-r--r-- | fs/ceph/inode.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 7abe1aed819..aca82d55cc5 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -378,6 +378,22 @@ void ceph_destroy_inode(struct inode *inode)  	ceph_queue_caps_release(inode); +	/* +	 * we may still have a snap_realm reference if there are stray +	 * caps in i_cap_exporting_issued or i_snap_caps. +	 */ +	if (ci->i_snap_realm) { +		struct ceph_mds_client *mdsc = +			&ceph_client(ci->vfs_inode.i_sb)->mdsc; +		struct ceph_snap_realm *realm = ci->i_snap_realm; + +		dout(" dropping residual ref to snap realm %p\n", realm); +		spin_lock(&realm->inodes_with_caps_lock); +		list_del_init(&ci->i_snap_realm_item); +		spin_unlock(&realm->inodes_with_caps_lock); +		ceph_put_snap_realm(mdsc, realm); +	} +  	kfree(ci->i_symlink);  	while ((n = rb_first(&ci->i_fragtree)) != NULL) {  		frag = rb_entry(n, struct ceph_inode_frag, node);  |