diff options
| author | Sage Weil <sage@newdream.net> | 2010-05-04 19:14:46 -0400 |
|---|---|---|
| committer | Sage Weil <sage@newdream.net> | 2010-05-04 19:14:46 -0400 |
| commit | 5dfc589a8467470226feccdc50f1b32713318e7b (patch) | |
| tree | 82998c57555055cf3763e9a4fc757d5de0628c21 | |
| parent | b0930f8d38c6ab76dc8222a5a910a21392d38208 (diff) | |
ceph: unregister bdi before kill_anon_super releases device name
Unregister and destroy the bdi in put_super, after mount is r/o, but before
put_anon_super releases the device name.
For symmetry, bdi_destroy in destroy_client (we bdi_init in create_client).
Only set s_bdi if bdi_register succeeds, since we use it to decide whether
to bdi_unregister.
Signed-off-by: Sage Weil <sage@newdream.net>
| -rw-r--r-- | fs/ceph/super.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index f888cf487b7c..110857ba9269 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) | |||
| 47 | */ | 47 | */ |
| 48 | static void ceph_put_super(struct super_block *s) | 48 | static void ceph_put_super(struct super_block *s) |
| 49 | { | 49 | { |
| 50 | struct ceph_client *cl = ceph_client(s); | 50 | struct ceph_client *client = ceph_sb_to_client(s); |
| 51 | 51 | ||
| 52 | dout("put_super\n"); | 52 | dout("put_super\n"); |
| 53 | ceph_mdsc_close_sessions(&cl->mdsc); | 53 | ceph_mdsc_close_sessions(&client->mdsc); |
| 54 | |||
| 55 | /* | ||
| 56 | * ensure we release the bdi before put_anon_super releases | ||
| 57 | * the device name. | ||
| 58 | */ | ||
| 59 | if (s->s_bdi == &client->backing_dev_info) { | ||
| 60 | bdi_unregister(&client->backing_dev_info); | ||
| 61 | s->s_bdi = NULL; | ||
| 62 | } | ||
| 63 | |||
| 54 | return; | 64 | return; |
| 55 | } | 65 | } |
| 56 | 66 | ||
| @@ -636,6 +646,8 @@ static void ceph_destroy_client(struct ceph_client *client) | |||
| 636 | destroy_workqueue(client->pg_inv_wq); | 646 | destroy_workqueue(client->pg_inv_wq); |
| 637 | destroy_workqueue(client->trunc_wq); | 647 | destroy_workqueue(client->trunc_wq); |
| 638 | 648 | ||
| 649 | bdi_destroy(&client->backing_dev_info); | ||
| 650 | |||
| 639 | if (client->msgr) | 651 | if (client->msgr) |
| 640 | ceph_messenger_destroy(client->msgr); | 652 | ceph_messenger_destroy(client->msgr); |
| 641 | mempool_destroy(client->wb_pagevec_pool); | 653 | mempool_destroy(client->wb_pagevec_pool); |
| @@ -876,14 +888,14 @@ static int ceph_register_bdi(struct super_block *sb, struct ceph_client *client) | |||
| 876 | { | 888 | { |
| 877 | int err; | 889 | int err; |
| 878 | 890 | ||
| 879 | sb->s_bdi = &client->backing_dev_info; | ||
| 880 | |||
| 881 | /* set ra_pages based on rsize mount option? */ | 891 | /* set ra_pages based on rsize mount option? */ |
| 882 | if (client->mount_args->rsize >= PAGE_CACHE_SIZE) | 892 | if (client->mount_args->rsize >= PAGE_CACHE_SIZE) |
| 883 | client->backing_dev_info.ra_pages = | 893 | client->backing_dev_info.ra_pages = |
| 884 | (client->mount_args->rsize + PAGE_CACHE_SIZE - 1) | 894 | (client->mount_args->rsize + PAGE_CACHE_SIZE - 1) |
| 885 | >> PAGE_SHIFT; | 895 | >> PAGE_SHIFT; |
| 886 | err = bdi_register_dev(&client->backing_dev_info, sb->s_dev); | 896 | err = bdi_register_dev(&client->backing_dev_info, sb->s_dev); |
| 897 | if (!err) | ||
| 898 | sb->s_bdi = &client->backing_dev_info; | ||
| 887 | return err; | 899 | return err; |
| 888 | } | 900 | } |
| 889 | 901 | ||
| @@ -957,9 +969,6 @@ static void ceph_kill_sb(struct super_block *s) | |||
| 957 | dout("kill_sb %p\n", s); | 969 | dout("kill_sb %p\n", s); |
| 958 | ceph_mdsc_pre_umount(&client->mdsc); | 970 | ceph_mdsc_pre_umount(&client->mdsc); |
| 959 | kill_anon_super(s); /* will call put_super after sb is r/o */ | 971 | kill_anon_super(s); /* will call put_super after sb is r/o */ |
| 960 | if (s->s_bdi == &client->backing_dev_info) | ||
| 961 | bdi_unregister(&client->backing_dev_info); | ||
| 962 | bdi_destroy(&client->backing_dev_info); | ||
| 963 | ceph_destroy_client(client); | 972 | ceph_destroy_client(client); |
| 964 | } | 973 | } |
| 965 | 974 | ||
