ceph: fix incorrect snaprealm when adding caps

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
Yan, Zheng 2017-12-19 18:00:54 +08:00 committed by Ilya Dryomov
parent 314c4737a4
commit 7d9c9193b5
2 changed files with 19 additions and 3 deletions

View File

@ -577,18 +577,30 @@ void ceph_add_cap(struct inode *inode,
} }
} }
if (!ci->i_snap_realm) { if (!ci->i_snap_realm ||
((flags & CEPH_CAP_FLAG_AUTH) &&
realmino != (u64)-1 && ci->i_snap_realm->ino != realmino)) {
/* /*
* add this inode to the appropriate snap realm * add this inode to the appropriate snap realm
*/ */
struct ceph_snap_realm *realm = ceph_lookup_snap_realm(mdsc, struct ceph_snap_realm *realm = ceph_lookup_snap_realm(mdsc,
realmino); realmino);
if (realm) { if (realm) {
struct ceph_snap_realm *oldrealm = ci->i_snap_realm;
if (oldrealm) {
spin_lock(&oldrealm->inodes_with_caps_lock);
list_del_init(&ci->i_snap_realm_item);
spin_unlock(&oldrealm->inodes_with_caps_lock);
}
spin_lock(&realm->inodes_with_caps_lock); spin_lock(&realm->inodes_with_caps_lock);
ci->i_snap_realm = realm; ci->i_snap_realm = realm;
list_add(&ci->i_snap_realm_item, list_add(&ci->i_snap_realm_item,
&realm->inodes_with_caps); &realm->inodes_with_caps);
spin_unlock(&realm->inodes_with_caps_lock); spin_unlock(&realm->inodes_with_caps_lock);
if (oldrealm)
ceph_put_snap_realm(mdsc, oldrealm);
} else { } else {
pr_err("ceph_add_cap: couldn't find snap realm %llx\n", pr_err("ceph_add_cap: couldn't find snap realm %llx\n",
realmino); realmino);

View File

@ -922,13 +922,17 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc,
/* /*
* Move the inode to the new realm * Move the inode to the new realm
*/ */
spin_lock(&realm->inodes_with_caps_lock); oldrealm = ci->i_snap_realm;
spin_lock(&oldrealm->inodes_with_caps_lock);
list_del_init(&ci->i_snap_realm_item); list_del_init(&ci->i_snap_realm_item);
spin_unlock(&oldrealm->inodes_with_caps_lock);
spin_lock(&realm->inodes_with_caps_lock);
list_add(&ci->i_snap_realm_item, list_add(&ci->i_snap_realm_item,
&realm->inodes_with_caps); &realm->inodes_with_caps);
oldrealm = ci->i_snap_realm;
ci->i_snap_realm = realm; ci->i_snap_realm = realm;
spin_unlock(&realm->inodes_with_caps_lock); spin_unlock(&realm->inodes_with_caps_lock);
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
ceph_get_snap_realm(mdsc, realm); ceph_get_snap_realm(mdsc, realm);