From: Yan, Zheng Date: Thu, 10 Jan 2019 07:41:09 +0000 (+0800) Subject: ceph: clear inode pointer when snap realm gets dropped by its inode X-Git-Tag: v4.19.19~78 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3e05ceedf1439eea0a1306e30935ef5ee65e5d4f;p=users%2Fdwmw2%2Flinux.git ceph: clear inode pointer when snap realm gets dropped by its inode commit d95e674c01cfb5461e8b9fdeebf6d878c9b80b2f upstream. snap realm and corresponding inode have pointers to each other. The two pointer should get clear at the same time. Otherwise, snap realm's pointer may reference freed inode. Cc: stable@vger.kernel.org # 4.17+ Signed-off-by: "Yan, Zheng" Reviewed-by: Luis Henriques Signed-off-by: Ilya Dryomov Signed-off-by: Greg Kroah-Hartman --- diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index eadffaa39f4e5..c7542e8dd096c 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -1030,6 +1030,8 @@ static void drop_inode_snap_realm(struct ceph_inode_info *ci) list_del_init(&ci->i_snap_realm_item); ci->i_snap_realm_counter++; ci->i_snap_realm = NULL; + if (realm->ino == ci->i_vino.ino) + realm->inode = NULL; spin_unlock(&realm->inodes_with_caps_lock); ceph_put_snap_realm(ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc, realm);