Hi folks I've been playing with yet unseen prd block device, and hit an issue with partitioning but since prd.c is a copy/paste of brd.c the same exact issue exists with brd. It does not support partitions! An attempt to fdisk say a couple of partitions, then mkfs && mount an individual partition will result in the primary device being accessed and a corrupted disk data. If I enable max_part(=2) properly on modprobe, then fdisk a couple of partitions all goes well But then if I pass the device to Kernel (Say via mount), after a call to bdev = blkdev_get_by_path(dev_name, mode, fs_type); I get the following results: (size is extracted using: i_size_read(bdev->bd_inode); part_size is extracted using: bdev->bd_part->nr_sects << 9; ) dev_name == /dev/ram0 [Jul29 17:40] foo: [foo_mount:880] size=0x40000000 bdev=ffff88003dc24340 bd_inode=ffff88003dc24430 bd_part=ffff88003ca22848 part_size=0x40000000 dev_name == /dev/ram0p1 [ +16.816065] foo: [foo_mount:880] size=0x40000000 bdev=ffff88003d2f6d80 bd_inode=ffff88003d2f6e70 bd_part=ffff88003ca22848 part_size=0x40000000 dev_name == /dev/ram0p2 [Jul29 17:41] foo: [foo_mount:880] size=0x40000000 bdev=ffff88003dc24680 bd_inode=ffff88003dc24770 bd_part=ffff88003ca22848 part_size=0x40000000 We can see that all 3 different bdev's point to the same bd_part, which is the BUG. Funny is that bd_inode is different but contains same wrong size, for exactly the same reason. The fix for this is easy: ---- diff --git drivers/block/brd.c drivers/block/brd.c index c7d138e..0d982d7 100644 --- drivers/block/brd.c +++ drivers/block/brd.c @@ -378,10 +378,12 @@ static int brd_direct_access(struct block_device *bdev, sector_t sector, if (!brd) return -ENODEV; + sector += get_start_sect(bdev); if (sector & (PAGE_SECTORS-1)) return -EINVAL; +/* Check is wrong here we need to check against bdev->bd_part->nr_sects */ if (sector + PAGE_SECTORS > get_capacity(bdev->bd_disk)) return -ERANGE; page = brd_insert_page(brd, sector); if (!page) return -ENOSPC; @@ -532,11 +532,17 @@ static struct brd_device *brd_init_one(int i) goto out; } +/* In the structure of this driver this will never happen and is wrong + * to do. We should just return NULL if not found. + * This is not the bug it is just DEAD CODE + * brd = brd_alloc(i); if (brd) { add_disk(brd->brd_disk); list_add_tail(&brd->brd_list, &brd_devices); } +*/ + prd = NULL; out: return brd; } @@ -558,7 +564,8 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data) kobj = brd ? get_disk(brd->brd_disk) : NULL; mutex_unlock(&brd_devices_mutex); - *part = 0; +// Fix the partition BUG *part comes in correctly must not need to touch it +// *part = 0; return kobj; } --- After this simple fix of commenting out *part = 0, running again I get dev_name == /dev/ram0 [ +0.000004] foo: [foo_mount:880] size=0x40000000 bdev=ffff88003d2f7740 inode=ffff88003d2f7830 part=ffff88001da8c048 part_size=0x40000000 dev_name == /dev/ram0p1 [ +0.000002] foo: [foo_mount:880] size=0x1e748200 bdev=ffff88003dc25040 inode=ffff88003dc25130 part=ffff880036f6a000 part_size=0x1e748200 dev_name == /dev/ram0p2 [ +0.000002] foo: [foo_mount:880] size=0x217b7e00 bdev=ffff88003d2f7a80 inode=ffff88003d2f7b70 part=ffff880036f69000 part_size=0x217b7e00 But before we are running to fix this bug. Could we please do better and just remove the support for partitions all together. Since it *never* worked anyway, so probably no one needs it! Surly no one used it Thanks Boaz -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html