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:
parent
314c4737a4
commit
7d9c9193b5
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user