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 7abe1aed819b..aca82d55cc53 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -378,6 +378,22 @@ void ceph_destroy_inode(struct inode *inode) | |||
| 378 | 378 | ||
| 379 | ceph_queue_caps_release(inode); | 379 | ceph_queue_caps_release(inode); |
| 380 | 380 | ||
| 381 | /* | ||
| 382 | * we may still have a snap_realm reference if there are stray | ||
| 383 | * caps in i_cap_exporting_issued or i_snap_caps. | ||
| 384 | */ | ||
| 385 | if (ci->i_snap_realm) { | ||
| 386 | struct ceph_mds_client *mdsc = | ||
| 387 | &ceph_client(ci->vfs_inode.i_sb)->mdsc; | ||
| 388 | struct ceph_snap_realm *realm = ci->i_snap_realm; | ||
| 389 | |||
| 390 | dout(" dropping residual ref to snap realm %p\n", realm); | ||
| 391 | spin_lock(&realm->inodes_with_caps_lock); | ||
| 392 | list_del_init(&ci->i_snap_realm_item); | ||
| 393 | spin_unlock(&realm->inodes_with_caps_lock); | ||
| 394 | ceph_put_snap_realm(mdsc, realm); | ||
| 395 | } | ||
| 396 | |||
| 381 | kfree(ci->i_symlink); | 397 | kfree(ci->i_symlink); |
| 382 | while ((n = rb_first(&ci->i_fragtree)) != NULL) { | 398 | while ((n = rb_first(&ci->i_fragtree)) != NULL) { |
| 383 | frag = rb_entry(n, struct ceph_inode_frag, node); | 399 | frag = rb_entry(n, struct ceph_inode_frag, node); |
