diff options
Diffstat (limited to 'fs/ceph/super.c')
| -rw-r--r-- | fs/ceph/super.c | 30 | 
1 files changed, 20 insertions, 10 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 75d02eaa127..110857ba926 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -47,10 +47,20 @@ const char *ceph_file_part(const char *s, int len)   */  static void ceph_put_super(struct super_block *s)  { -	struct ceph_client *cl = ceph_client(s); +	struct ceph_client *client = ceph_sb_to_client(s);  	dout("put_super\n"); -	ceph_mdsc_close_sessions(&cl->mdsc); +	ceph_mdsc_close_sessions(&client->mdsc); + +	/* +	 * ensure we release the bdi before put_anon_super releases +	 * the device name. +	 */ +	if (s->s_bdi == &client->backing_dev_info) { +		bdi_unregister(&client->backing_dev_info); +		s->s_bdi = NULL; +	} +  	return;  } @@ -636,6 +646,8 @@ static void ceph_destroy_client(struct ceph_client *client)  	destroy_workqueue(client->pg_inv_wq);  	destroy_workqueue(client->trunc_wq); +	bdi_destroy(&client->backing_dev_info); +  	if (client->msgr)  		ceph_messenger_destroy(client->msgr);  	mempool_destroy(client->wb_pagevec_pool); @@ -876,14 +888,14 @@ static int ceph_register_bdi(struct super_block *sb, struct ceph_client *client)  {  	int err; -	sb->s_bdi = &client->backing_dev_info; -  	/* set ra_pages based on rsize mount option? */  	if (client->mount_args->rsize >= PAGE_CACHE_SIZE)  		client->backing_dev_info.ra_pages =  			(client->mount_args->rsize + PAGE_CACHE_SIZE - 1)  			>> PAGE_SHIFT;  	err = bdi_register_dev(&client->backing_dev_info, sb->s_dev); +	if (!err) +		sb->s_bdi = &client->backing_dev_info;  	return err;  } @@ -957,9 +969,6 @@ static void ceph_kill_sb(struct super_block *s)  	dout("kill_sb %p\n", s);  	ceph_mdsc_pre_umount(&client->mdsc);  	kill_anon_super(s);    /* will call put_super after sb is r/o */ -	if (s->s_bdi == &client->backing_dev_info) -		bdi_unregister(&client->backing_dev_info); -	bdi_destroy(&client->backing_dev_info);  	ceph_destroy_client(client);  } @@ -996,9 +1005,10 @@ static int __init init_ceph(void)  	if (ret)  		goto out_icache; -	pr_info("loaded %d.%d.%d (mon/mds/osd proto %d/%d/%d)\n", -		CEPH_VERSION_MAJOR, CEPH_VERSION_MINOR, CEPH_VERSION_PATCH, -		CEPH_MONC_PROTOCOL, CEPH_MDSC_PROTOCOL, CEPH_OSDC_PROTOCOL); +	pr_info("loaded (mon/mds/osd proto %d/%d/%d, osdmap %d/%d %d/%d)\n", +		CEPH_MONC_PROTOCOL, CEPH_MDSC_PROTOCOL, CEPH_OSDC_PROTOCOL, +		CEPH_OSDMAP_VERSION, CEPH_OSDMAP_VERSION_EXT, +		CEPH_OSDMAP_INC_VERSION, CEPH_OSDMAP_INC_VERSION_EXT);  	return 0;  out_icache:  |