From: Karel Zak Date: Thu, 9 Oct 2014 10:06:52 +0000 (+0200) Subject: libfdisk: add functions to play nasty games with first/last LBA X-Git-Tag: v2.26-rc1~334 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d37c2ce9a3e4a257c438a24a6293b48bb9e51fd;p=thirdparty%2Futil-linux.git libfdisk: add functions to play nasty games with first/last LBA Signed-off-by: Karel Zak --- diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c index 8a5397368d..67a3ec0d06 100644 --- a/libfdisk/src/context.c +++ b/libfdisk/src/context.c @@ -843,6 +843,62 @@ sector_t fdisk_get_first_lba(struct fdisk_context *cxt) return cxt->first_lba; } +/** + * fdisk_set_first_lba: + * @cxt: fdisk context + * @lba: first possible sector for data + * + * It's strongly recommended to use the default library setting. The first LBA + * is always reseted by fdisk_assign_device(), fdisk_override_geometry() + * and fdisk_reset_alignment(). This is very low level function and library + * does not check if your setting makes any sense. + * + * Returns: 0 on success, <0 on error. + */ +sector_t fdisk_set_first_lba(struct fdisk_context *cxt, sector_t lba) +{ + assert(cxt); + DBG(CXT, ul_debugobj(cxt, "setting first LBA from %ju to %ju", + (uintmax_t) cxt->first_lba, (uintmax_t) lba)); + cxt->first_lba = lba; + return 0; +} + +/** + * fdisk_get_last_lba: + * @cxt: fdisk context + * + * Note that the device has to be already assigned. + * + * Returns: last possible LBA on device + */ +sector_t fdisk_get_last_lba(struct fdisk_context *cxt) +{ + return cxt->last_lba; +} + +/** + * fdisk_set_last_lba: + * @cxt: fdisk context + * @lba: last possible sector + * + * It's strongly recommended to use the default library setting. The last LBA + * is always reseted by fdisk_assign_device(), fdisk_override_geometry() and + * fdisk_reset_alignment(). + * + * Returns: 0 on success, <0 on error. + */ +sector_t fdisk_set_last_lba(struct fdisk_context *cxt, sector_t lba) +{ + assert(cxt); + + if (lba > cxt->total_sectors - 1 && lba < 1) + return -ERANGE; + cxt->last_lba = lba; + return 0; +} + + /** * fdisk_get_nsectors: * @cxt: context diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index a01481f21f..047119983d 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -123,6 +123,9 @@ unsigned long fdisk_get_sector_size(struct fdisk_context *cxt); unsigned long fdisk_get_alignment_offset(struct fdisk_context *cxt); unsigned long fdisk_get_grain_size(struct fdisk_context *cxt); sector_t fdisk_get_first_lba(struct fdisk_context *cxt); +sector_t fdisk_set_first_lba(struct fdisk_context *cxt, sector_t lba); +sector_t fdisk_get_last_lba(struct fdisk_context *cxt); +sector_t fdisk_set_last_lba(struct fdisk_context *cxt, sector_t lba); sector_t fdisk_get_nsectors(struct fdisk_context *cxt); const char *fdisk_get_devname(struct fdisk_context *cxt); int fdisk_get_devfd(struct fdisk_context *cxt); @@ -131,6 +134,8 @@ unsigned int fdisk_get_geom_heads(struct fdisk_context *cxt); sector_t fdisk_get_geom_sectors(struct fdisk_context *cxt); sector_t fdisk_get_geom_cylinders(struct fdisk_context *cxt); + + /* parttype.c */ const struct fdisk_parttype *fdisk_label_get_parttype(const struct fdisk_label *lb, size_t n); size_t fdisk_label_get_nparttypes(const struct fdisk_label *lb);