>From 6119af38a3f22540376d5a2a93490f6e228a2e02 Mon Sep 17 00:00:00 2001 From: Matt Domsch <[email protected]> Date: Tue, 27 Jan 2009 09:42:07 -0600 Subject: [PATCH] linux.c: use ioctl(BLKSSZGET) and ioctl(BLKBSZGET) appropriately
BLKSSZGET is for physical sector size, BLKBSZGET is for logical sector size. Parted has until now been using a physical sector size of PED_SECTOR_SIZE_DEFAULT, and using the kernel-reported physical sector size as the logical sector size. Signed-off-by: Matt Domsch <[email protected]> --- libparted/arch/linux.c | 31 ++++++++++++++++++++++--------- 1 files changed, 22 insertions(+), 9 deletions(-) diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c index acd5997..0589ee0 100644 --- a/libparted/arch/linux.c +++ b/libparted/arch/linux.c @@ -194,7 +194,8 @@ struct hd_driveid { #define BLKRRPART _IO(0x12,95) /* re-read partition table */ #define BLKGETSIZE _IO(0x12,96) /* return device size */ #define BLKFLSBUF _IO(0x12,97) /* flush buffer cache */ -#define BLKSSZGET _IO(0x12,104) /* get block device sector size */ +#define BLKSSZGET _IO(0x12,104) /* get block device physical sector size */ +#define BLKBSZGET _IOR(0x12,112,size_t) /* get block device logical sector size */ #define BLKGETLASTSECT _IO(0x12,108) /* get last sector of block device */ #define BLKSETLASTSECT _IO(0x12,109) /* set last sector of block device */ @@ -584,12 +585,13 @@ _have_devfs () return have_devfs = S_ISCHR(sb.st_mode) ? 1 : 0; } -static void +static void _device_set_sector_size (PedDevice* dev) { LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev); - int sector_size; - + int physical_sector_size=0; + size_t logical_sector_size=0ULL; + dev->sector_size = PED_SECTOR_SIZE_DEFAULT; dev->phys_sector_size = PED_SECTOR_SIZE_DEFAULT; @@ -599,16 +601,27 @@ _device_set_sector_size (PedDevice* dev) dev->sector_size = PED_SECTOR_SIZE_DEFAULT; return; } - - if (ioctl (arch_specific->fd, BLKSSZGET, §or_size)) { + + if (ioctl (arch_specific->fd, BLKBSZGET, &logical_sector_size)) { + ped_exception_throw ( + PED_EXCEPTION_WARNING, + PED_EXCEPTION_OK, + _("Could not determine logical sector size for %s: %s.\n" + "Using the default logical sector size (%lld)."), + dev->path, strerror (errno), PED_SECTOR_SIZE_DEFAULT); + } else { + dev->sector_size = (long long)logical_sector_size; + } + + if (ioctl (arch_specific->fd, BLKSSZGET, &physical_sector_size)) { ped_exception_throw ( PED_EXCEPTION_WARNING, PED_EXCEPTION_OK, - _("Could not determine sector size for %s: %s.\n" - "Using the default sector size (%lld)."), + _("Could not determine physical sector size for %s: %s.\n" + "Using the default physical sector size (%lld)."), dev->path, strerror (errno), PED_SECTOR_SIZE_DEFAULT); } else { - dev->sector_size = (long long)sector_size; + dev->phys_sector_size = (long long)physical_sector_size; } /* Return PED_SECTOR_SIZE_DEFAULT for DASDs. */ -- 1.6.0.5 -- Matt Domsch Linux Technology Strategist, Dell Office of the CTO linux.dell.com & www.dell.com/linux _______________________________________________ parted-devel mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/parted-devel

