--- linux-2.5.43/fs/block_dev.c Mon Sep 16 07:25:59 2002 +++ linux-currentish-vanilla/fs/block_dev.c Mon Sep 16 10:54:59 2002 @@ -612,12 +612,12 @@ if (owner) __MOD_DEC_USE_COUNT(owner); } + disk = get_gendisk(bdev->bd_dev, &part); - if (!disk) - goto out1; + if (!bdev->bd_contains) { bdev->bd_contains = bdev; - if (part) { + if (disk && part) { struct block_device *whole; whole = bdget(MKDEV(disk->major, disk->first_minor)); ret = -ENOMEM; @@ -630,8 +630,6 @@ } } if (bdev->bd_contains == bdev) { - if (!bdev->bd_openers) - bdev->bd_disk = disk; if (!bdev->bd_queue) { struct blk_dev_struct *p = blk_dev + major(dev); bdev->bd_queue = &p->request_queue; @@ -645,8 +643,12 @@ } if (!bdev->bd_openers) { struct backing_dev_info *bdi; + sector_t sect = 0; + bdev->bd_offset = 0; - bd_set_size(bdev, (loff_t)get_capacity(disk) << 9); + if (disk) + sect = get_capacity(disk); + bd_set_size(bdev, (loff_t)sect << 9); bdi = blk_get_backing_dev_info(bdev); if (bdi == NULL) bdi = &default_backing_dev_info;