Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d9c9193 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov
Browse files

ceph: fix incorrect snaprealm when adding caps



Signed-off-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 314c4737
Loading
Loading
Loading
Loading
+13 −1
Original line number Original line Diff line number Diff line
@@ -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);
+6 −2
Original line number Original line Diff line number Diff line
@@ -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);