diff options
| -rw-r--r-- | fs/ceph/snap.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index 2b881262ef67..d5114db70453 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c | |||
| @@ -869,16 +869,20 @@ skip_inode: | |||
| 869 | continue; | 869 | continue; |
| 870 | ci = ceph_inode(inode); | 870 | ci = ceph_inode(inode); |
| 871 | spin_lock(&inode->i_lock); | 871 | spin_lock(&inode->i_lock); |
| 872 | if (!ci->i_snap_realm) | 872 | if (list_empty(&ci->i_snap_realm_item)) { |
| 873 | goto split_skip_inode; | 873 | struct ceph_snap_realm *oldrealm = |
| 874 | ceph_put_snap_realm(mdsc, ci->i_snap_realm); | 874 | ci->i_snap_realm; |
| 875 | spin_lock(&realm->inodes_with_caps_lock); | 875 | |
| 876 | list_add(&ci->i_snap_realm_item, | 876 | dout(" moving %p to split realm %llx %p\n", |
| 877 | &realm->inodes_with_caps); | 877 | inode, realm->ino, realm); |
| 878 | ci->i_snap_realm = realm; | 878 | spin_lock(&realm->inodes_with_caps_lock); |
| 879 | spin_unlock(&realm->inodes_with_caps_lock); | 879 | list_add(&ci->i_snap_realm_item, |
| 880 | ceph_get_snap_realm(mdsc, realm); | 880 | &realm->inodes_with_caps); |
| 881 | split_skip_inode: | 881 | ci->i_snap_realm = realm; |
| 882 | spin_unlock(&realm->inodes_with_caps_lock); | ||
| 883 | ceph_get_snap_realm(mdsc, realm); | ||
| 884 | ceph_put_snap_realm(mdsc, oldrealm); | ||
| 885 | } | ||
| 882 | spin_unlock(&inode->i_lock); | 886 | spin_unlock(&inode->i_lock); |
| 883 | iput(inode); | 887 | iput(inode); |
| 884 | } | 888 | } |
