block: initialise bd_super in bdget()
authorLachlan McIlroy <lmcilroy@redhat.com>
Thu, 30 Jun 2011 01:01:45 +0000 (11:01 +1000)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Aug 2011 05:57:44 +0000 (01:57 -0400)
bd_super is currently reset to NULL in kill_block_super() so we rely on previous
users of the block_device object to initialise this value for the next user.
This quirk was exposed on RHEL5 when a third party filesystem did not always use
kill_block_super() and therefore bd_super wasn't being reset when a block_device
object was recycled within the cache.  This may not be a problem upstream but
makes sense to be defensive.

Signed-off-by: Lachlan McIlroy <lmcilroy@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/block_dev.c

index f55aad4d16110fa8a70d5c0f99b87687eabccd90..f286805532882ab33d5431682b64ce5e1f71ec6f 100644 (file)
@@ -552,6 +552,7 @@ struct block_device *bdget(dev_t dev)
 
        if (inode->i_state & I_NEW) {
                bdev->bd_contains = NULL;
+               bdev->bd_super = NULL;
                bdev->bd_inode = inode;
                bdev->bd_block_size = (1 << inode->i_blkbits);
                bdev->bd_part_count = 0;