ceph: initialize sb->s_bdi, bdi_unregister after kill_anon_super
authorSage Weil <sage@newdream.net>
Wed, 14 Oct 2009 21:09:07 +0000 (14:09 -0700)
committerSage Weil <sage@newdream.net>
Wed, 14 Oct 2009 21:09:07 +0000 (14:09 -0700)
Writeback doesn't work without the bdi set, and writeback on
umount doesn't work if we unregister the bdi too early.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/super.c

index 442a9900317eee4db560a056baecd2eefb83ee7a..7f7d4759a4438a63934c85e1dcf8ef3f5796e029 100644 (file)
@@ -97,6 +97,7 @@ static int ceph_syncfs(struct super_block *sb, int wait)
        dout("sync_fs %d\n", wait);
        ceph_osdc_sync(&ceph_client(sb)->osdc);
        ceph_mdsc_sync(&ceph_client(sb)->mdsc);
+       dout("sync_fs %d done\n", wait);
        return 0;
 }
 
@@ -777,6 +778,7 @@ static int ceph_init_bdi(struct super_block *sb, struct ceph_client *client)
        err = bdi_init(&client->backing_dev_info);
        if (err < 0)
                return err;
+       sb->s_bdi = &client->backing_dev_info;
 
        /* set ra_pages based on rsize mount option? */
        if (client->mount_args.rsize >= PAGE_CACHE_SIZE)
@@ -861,8 +863,8 @@ static void ceph_kill_sb(struct super_block *s)
        struct ceph_client *client = ceph_sb_to_client(s);
        dout("kill_sb %p\n", s);
        ceph_mdsc_pre_umount(&client->mdsc);
-       bdi_unregister(&client->backing_dev_info);
        kill_anon_super(s);    /* will call put_super after sb is r/o */
+       bdi_unregister(&client->backing_dev_info);
        bdi_destroy(&client->backing_dev_info);
        ceph_destroy_client(client);
 }