ceph: avoid invalid memory dereference in the middle of umount
extra_mon_dispatch() and debugfs' foo_show functions dereference fsc->mdsc. we should clean up fsc->client->extra_mon_dispatch and debugfs before destroying fsc->mds. Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
1684dd03e9
commit
62a65f36d0
@ -3769,13 +3769,13 @@ static void ceph_mdsc_stop(struct ceph_mds_client *mdsc)
|
|||||||
void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
|
void ceph_mdsc_destroy(struct ceph_fs_client *fsc)
|
||||||
{
|
{
|
||||||
struct ceph_mds_client *mdsc = fsc->mdsc;
|
struct ceph_mds_client *mdsc = fsc->mdsc;
|
||||||
|
|
||||||
dout("mdsc_destroy %p\n", mdsc);
|
dout("mdsc_destroy %p\n", mdsc);
|
||||||
ceph_mdsc_stop(mdsc);
|
|
||||||
|
|
||||||
/* flush out any connection work with references to us */
|
/* flush out any connection work with references to us */
|
||||||
ceph_msgr_flush();
|
ceph_msgr_flush();
|
||||||
|
|
||||||
|
ceph_mdsc_stop(mdsc);
|
||||||
|
|
||||||
fsc->mdsc = NULL;
|
fsc->mdsc = NULL;
|
||||||
kfree(mdsc);
|
kfree(mdsc);
|
||||||
dout("mdsc_destroy %p done\n", mdsc);
|
dout("mdsc_destroy %p done\n", mdsc);
|
||||||
|
@ -636,8 +636,6 @@ static void destroy_fs_client(struct ceph_fs_client *fsc)
|
|||||||
|
|
||||||
destroy_mount_options(fsc->mount_options);
|
destroy_mount_options(fsc->mount_options);
|
||||||
|
|
||||||
ceph_fs_debugfs_cleanup(fsc);
|
|
||||||
|
|
||||||
ceph_destroy_client(fsc->client);
|
ceph_destroy_client(fsc->client);
|
||||||
|
|
||||||
kfree(fsc);
|
kfree(fsc);
|
||||||
@ -1040,6 +1038,10 @@ static void ceph_kill_sb(struct super_block *s)
|
|||||||
|
|
||||||
ceph_mdsc_pre_umount(fsc->mdsc);
|
ceph_mdsc_pre_umount(fsc->mdsc);
|
||||||
generic_shutdown_super(s);
|
generic_shutdown_super(s);
|
||||||
|
|
||||||
|
fsc->client->extra_mon_dispatch = NULL;
|
||||||
|
ceph_fs_debugfs_cleanup(fsc);
|
||||||
|
|
||||||
ceph_mdsc_destroy(fsc);
|
ceph_mdsc_destroy(fsc);
|
||||||
|
|
||||||
destroy_fs_client(fsc);
|
destroy_fs_client(fsc);
|
||||||
|
Loading…
Reference in New Issue
Block a user