From: Boaz Harrosh <boaz@xxxxxxxxxxxxx> Now when fdisk is run on brd it will ask some cryptic questions about CHS. This is because the getgeo block operation is not implemented. With the usual emulated values of 64, 32, X and the default size of 4M device, fdisk will offer 34 as possible first-sector, And after the previous patch of 4K sectores it will offer 40 as possible first-sector. But with the values presented here of 1, 1, 1 fdisk will offer 8 (4K) as possible first sector. I have done a quick audit of the fdisk code. The CHS calculation is very convoluted but at the end it comes out with a number. Which is taken into consideration in first-sector to allow. With all 1(s) this numbers is very small and other numbers come into account. Also note that if the device is big like 1G (not sure what is the threshold) fdisk will offer 1M (2048) as possible first- sector, and it does not matter what numbers we give here. Only fdisk is problematic both libgparted (and all applications that use it) and cfdisk always offer 1M alignment and do not call getgeo at all. Signed-off-by: Boaz Harrosh <boaz@xxxxxxxxxxxxx> --- drivers/block/brd.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 0026998..7965bf9 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -19,6 +19,7 @@ #include <linux/radix-tree.h> #include <linux/fs.h> #include <linux/slab.h> +#include <linux/hdreg.h> #include <asm/uaccess.h> @@ -426,6 +427,22 @@ static int brd_ioctl(struct block_device *bdev, fmode_t mode, return error; } +static int brd_getgeo(struct block_device *bd, struct hd_geometry *geo) +{ + /* With the usual emulated values of 64, 32, X and the + * default size of 4M device, fdisk will offer 40 as possible + * first-sector. + * But with the values presented here of 1, 1, 1 fdisk will + * offer 8 (4K) as possible first sector. + * Otherwise, either way, it effects nothing. Only fdisk calls + * this vector at all. + */ + geo->heads = 1; + geo->sectors = 1; + geo->cylinders = 1; + return 0; +} + static const struct block_device_operations brd_fops = { .owner = THIS_MODULE, .rw_page = brd_rw_page, @@ -433,6 +450,7 @@ static const struct block_device_operations brd_fops = { #ifdef CONFIG_BLK_DEV_XIP .direct_access = brd_direct_access, #endif + .getgeo = brd_getgeo, }; /* -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html