block: Unregister bdi on last reference drop
authorJan Kara <jack@suse.cz>
Wed, 12 Apr 2017 10:24:26 +0000 (12:24 +0200)
committerJens Axboe <axboe@fb.com>
Thu, 20 Apr 2017 18:09:55 +0000 (12:09 -0600)
Most users will want to unregister bdi when dropping last reference to a
bdi. Only a few users (like block devices) want to play more complex
tricks with bdi registration and unregistration. So unregister bdi when
the last reference to bdi is dropped and just make sure we don't
unregister the bdi the second time if it is already unregistered.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
mm/backing-dev.c

index e5e0972bdd6f9a78e22fe09989dc9cd7a82e09cd..164ccc93690f0c376b5c042af6715d882f1c7dd5 100644 (file)
@@ -961,6 +961,8 @@ static void release_bdi(struct kref *ref)
        struct backing_dev_info *bdi =
                        container_of(ref, struct backing_dev_info, refcnt);
 
+       if (test_bit(WB_registered, &bdi->wb.state))
+               bdi_unregister(bdi);
        bdi_exit(bdi);
        kfree(bdi);
 }