summaryrefslogtreecommitdiffstats
path: root/fdisk/fdisk.c
diff options
context:
space:
mode:
Diffstat (limited to 'fdisk/fdisk.c')
-rw-r--r--fdisk/fdisk.c309
1 files changed, 123 insertions, 186 deletions
diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c
index 1143b2f2a..47c5d6720 100644
--- a/fdisk/fdisk.c
+++ b/fdisk/fdisk.c
@@ -47,9 +47,6 @@
#ifdef HAVE_LINUX_BLKPG_H
#include <linux/blkpg.h>
#endif
-#ifdef HAVE_LIBBLKID
-#include <blkid.h>
-#endif
#include "gpt.h"
@@ -144,19 +141,12 @@ sector_t sector_offset = 1, sectors;
unsigned int heads,
cylinders,
- sector_size = DEFAULT_SECTOR_SIZE,
user_set_sector_size = 0,
units_per_sector = 1,
display_in_cyl_units = 0;
sector_t total_number_of_sectors; /* in logical sectors */
-unsigned long grain = DEFAULT_SECTOR_SIZE,
- io_size = DEFAULT_SECTOR_SIZE,
- min_io_size = DEFAULT_SECTOR_SIZE,
- phy_sector_size = DEFAULT_SECTOR_SIZE,
- alignment_offset;
-int has_topology;
-
+unsigned long grain = DEFAULT_SECTOR_SIZE;
enum labeltype disklabel; /* Current disklabel */
static void __attribute__ ((__noreturn__)) usage(FILE *out)
@@ -318,22 +308,22 @@ test_c(char **m, char *mesg) {
}
static int
-lba_is_aligned(sector_t lba)
+lba_is_aligned(struct fdisk_context *cxt, sector_t lba)
{
- unsigned int granularity = max(phy_sector_size, min_io_size);
- sector_t offset = (lba * sector_size) & (granularity - 1);
+ unsigned int granularity = max(cxt->phy_sector_size, cxt->min_io_size);
+ sector_t offset = (lba * cxt->sector_size) & (granularity - 1);
- return !((granularity + alignment_offset - offset) & (granularity - 1));
+ return !((granularity + cxt->alignment_offset - offset) & (granularity - 1));
}
-sector_t align_lba(sector_t lba, int direction)
+sector_t align_lba(struct fdisk_context *cxt, sector_t lba, int direction)
{
sector_t res;
- if (lba_is_aligned(lba))
+ if (lba_is_aligned(cxt, lba))
res = lba;
else {
- sector_t sects_in_phy = grain / sector_size;
+ sector_t sects_in_phy = grain / cxt->sector_size;
if (lba < sector_offset)
res = sector_offset;
@@ -347,8 +337,8 @@ sector_t align_lba(sector_t lba, int direction)
else /* ALIGN_NEAREST */
res = ((lba + sects_in_phy / 2) / sects_in_phy) * sects_in_phy;
- if (alignment_offset && !lba_is_aligned(res) &&
- res > alignment_offset / sector_size) {
+ if (cxt->alignment_offset && !lba_is_aligned(cxt, res) &&
+ res > cxt->alignment_offset / cxt->sector_size) {
/*
* apply alignment_offset
*
@@ -357,8 +347,8 @@ sector_t align_lba(sector_t lba, int direction)
* according the offset to be on the physical boundary.
*/
/* fprintf(stderr, "LBA: %llu apply alignment_offset\n", res); */
- res -= (max(phy_sector_size, min_io_size) -
- alignment_offset) / sector_size;
+ res -= (max(cxt->phy_sector_size, cxt->min_io_size) -
+ cxt->alignment_offset) / cxt->sector_size;
if (direction == ALIGN_UP && res < lba)
res += sects_in_phy;
@@ -408,31 +398,31 @@ void update_units(void)
units_per_sector = 1; /* in sectors */
}
-void warn_limits(void)
+void warn_limits(struct fdisk_context *cxt)
{
if (total_number_of_sectors > UINT_MAX && !nowarn) {
- unsigned long long bytes = total_number_of_sectors * sector_size;
+ unsigned long long bytes = total_number_of_sectors * cxt->sector_size;
int giga = bytes / 1000000000;
int hectogiga = (giga + 50) / 100;
fprintf(stderr, _("\n"
"WARNING: The size of this disk is %d.%d TB (%llu bytes).\n"
"DOS partition table format can not be used on drives for volumes\n"
-"larger than (%llu bytes) for %d-byte sectors. Use parted(1) and GUID \n"
+"larger than (%llu bytes) for %ld-byte sectors. Use parted(1) and GUID \n"
"partition table format (GPT).\n\n"),
hectogiga / 10, hectogiga % 10,
bytes,
- (sector_t ) UINT_MAX * sector_size,
- sector_size);
+ (sector_t ) UINT_MAX * cxt->sector_size,
+ cxt->sector_size);
}
}
-void warn_alignment(void)
+void warn_alignment(struct fdisk_context *cxt)
{
if (nowarn)
return;
- if (sector_size != phy_sector_size)
+ if (cxt->sector_size != cxt->phy_sector_size)
fprintf(stderr, _("\n"
"The device presents a logical sector size that is smaller than\n"
"the physical sector size. Aligning to a physical sector (or optimal\n"
@@ -451,64 +441,6 @@ void warn_alignment(void)
}
static void
-get_topology(struct fdisk_context *cxt) {
- int arg;
-#ifdef HAVE_LIBBLKID
- blkid_probe pr;
-
- pr = blkid_new_probe();
- if (pr && blkid_probe_set_device(pr, cxt->dev_fd, 0, 0) == 0) {
- blkid_topology tp = blkid_probe_get_topology(pr);
-
- if (tp) {
- min_io_size = blkid_topology_get_minimum_io_size(tp);
- io_size = blkid_topology_get_optimal_io_size(tp);
- phy_sector_size = blkid_topology_get_physical_sector_size(tp);
- alignment_offset = blkid_topology_get_alignment_offset(tp);
-
- /* We assume that the device provides topology info if
- * optimal_io_size is set or alignment_offset is set or
- * minimum_io_size is not power of 2.
- *
- * See also update_sector_offset().
- */
- if (io_size || alignment_offset ||
- (min_io_size & (min_io_size - 1)))
- has_topology = 1;
- if (!io_size)
- /* optimal IO is optional, default to minimum IO */
- io_size = min_io_size;
- }
- }
- blkid_free_probe(pr);
-#endif
-
- if (user_set_sector_size)
- /* fdisk since 2.17 differentiate between logical and physical
- * sectors size. For backward compatibility the
- * fdisk -b <sectorsize>
- * changes both, logical and physical sector size.
- */
- phy_sector_size = sector_size;
-
- else if (blkdev_get_sector_size(cxt->dev_fd, &arg) == 0) {
- sector_size = arg;
-
- if (!phy_sector_size)
- phy_sector_size = sector_size;
- }
-
- if (!min_io_size)
- min_io_size = phy_sector_size;
- if (!io_size)
- io_size = min_io_size;
-
- if (sector_size != DEFAULT_SECTOR_SIZE)
- printf(_("Note: sector size is %d (not %d)\n"),
- sector_size, DEFAULT_SECTOR_SIZE);
-}
-
-static void
get_partition_table_geometry(void) {
unsigned char *bufp = MBRbuffer;
struct partition *p;
@@ -544,9 +476,9 @@ get_partition_table_geometry(void) {
* Sets LBA of the first partition
*/
void
-update_sector_offset(void)
+update_sector_offset(struct fdisk_context *cxt)
{
- grain = io_size;
+ grain = cxt->io_size;
if (dos_compatible_flag)
sector_offset = sectors; /* usually 63 sectors */
@@ -564,29 +496,29 @@ update_sector_offset(void)
*/
sector_t x = 0;
- if (has_topology) {
- if (alignment_offset)
- x = alignment_offset;
- else if (io_size > 2048 * 512)
- x = io_size;
+ if (fdisk_dev_has_topology(cxt)) {
+ if (cxt->alignment_offset)
+ x = cxt->alignment_offset;
+ else if (cxt->io_size > 2048 * 512)
+ x = cxt->io_size;
}
/* default to 1MiB */
if (!x)
x = 2048 * 512;
- sector_offset = x / sector_size;
+ sector_offset = x / cxt->sector_size;
/* don't use huge offset on small devices */
if (total_number_of_sectors <= sector_offset * 4)
- sector_offset = phy_sector_size / sector_size;
+ sector_offset = cxt->phy_sector_size / cxt->sector_size;
/* use 1MiB grain always when possible */
if (grain < 2048 * 512)
grain = 2048 * 512;
/* don't use huge grain on small devices */
- if (total_number_of_sectors <= (grain * 4 / sector_size))
- grain = phy_sector_size;
+ if (total_number_of_sectors <= (grain * 4 / cxt->sector_size))
+ grain = cxt->phy_sector_size;
}
}
@@ -595,7 +527,6 @@ get_geometry(struct fdisk_context *cxt, struct geom *g) {
sector_t llcyls, nsects = 0;
unsigned int kern_heads = 0, kern_sectors = 0;
- get_topology(cxt);
heads = cylinders = sectors = 0;
pt_heads = pt_sectors = 0;
@@ -611,9 +542,9 @@ get_geometry(struct fdisk_context *cxt, struct geom *g) {
/* get number of 512-byte sectors, and convert it the real sectors */
if (blkdev_get_sectors(cxt->dev_fd, &nsects) == 0)
- total_number_of_sectors = (nsects / (sector_size >> 9));
+ total_number_of_sectors = (nsects / (cxt->sector_size >> 9));
- update_sector_offset();
+ update_sector_offset(cxt);
llcyls = total_number_of_sectors / (heads * sectors);
cylinders = llcyls;
@@ -676,7 +607,7 @@ static int get_boot(struct fdisk_context *cxt, int try_only) {
if (check_osf_label(cxt)) {
/* intialize partitions for BSD as well */
- dos_init();
+ dos_init(cxt);
if (!valid_part_table_flag(MBRbuffer)) {
disklabel = OSF_LABEL;
return 0;
@@ -695,7 +626,7 @@ static int get_boot(struct fdisk_context *cxt, int try_only) {
#ifdef __sparc__
create_sunlabel(cxt);
#else
- create_doslabel();
+ create_doslabel(cxt);
#endif
}
return 0;
@@ -796,7 +727,8 @@ read_hex(struct systypes *sys)
}
unsigned int
-read_int_with_suffix(unsigned int low, unsigned int dflt, unsigned int high,
+read_int_with_suffix(struct fdisk_context *cxt,
+ unsigned int low, unsigned int dflt, unsigned int high,
unsigned int base, char *mesg, int *is_suffix_used)
{
unsigned int res;
@@ -895,7 +827,7 @@ read_int_with_suffix(unsigned int low, unsigned int dflt, unsigned int high,
unsigned long unit;
bytes = (unsigned long long) res * absolute;
- unit = sector_size * units_per_sector;
+ unit = cxt->sector_size * units_per_sector;
bytes += unit/2; /* round */
bytes /= unit;
res = bytes;
@@ -932,18 +864,19 @@ read_int_with_suffix(unsigned int low, unsigned int dflt, unsigned int high,
* There is no default if DFLT is not between LOW and HIGH.
*/
unsigned int
-read_int(unsigned int low, unsigned int dflt, unsigned int high,
+read_int(struct fdisk_context *cxt,
+ unsigned int low, unsigned int dflt, unsigned int high,
unsigned int base, char *mesg)
{
- return read_int_with_suffix(low, dflt, high, base, mesg, NULL);
+ return read_int_with_suffix(cxt, low, dflt, high, base, mesg, NULL);
}
int
-get_partition_dflt(int warn, int max, int dflt) {
+get_partition_dflt(struct fdisk_context *cxt, int warn, int max, int dflt) {
struct pte *pe;
int i;
- i = read_int(1, dflt, max, 0, _("Partition number")) - 1;
+ i = read_int(cxt, 1, dflt, max, 0, _("Partition number")) - 1;
pe = &ptes[i];
if (warn) {
@@ -961,14 +894,14 @@ get_partition_dflt(int warn, int max, int dflt) {
}
int
-get_partition(int warn, int max) {
- return get_partition_dflt(warn, max, 0);
+get_partition(struct fdisk_context *cxt, int warn, int max) {
+ return get_partition_dflt(cxt, warn, max, 0);
}
/* User partition selection unless one partition only is available */
static int
-get_existing_partition(int warn, int max) {
+get_existing_partition(struct fdisk_context *cxt, int warn, int max) {
int pno = -1;
int i;
@@ -995,7 +928,7 @@ get_existing_partition(int warn, int max) {
not_implemented:
not_unique:
- return get_partition(warn, max);
+ return get_partition(cxt, warn, max);
}
const char *
@@ -1031,18 +964,18 @@ toggle_active(int i) {
}
static void
-toggle_dos_compatibility_flag(void) {
+toggle_dos_compatibility_flag(struct fdisk_context *cxt) {
dos_compatible_flag = ~dos_compatible_flag;
if (dos_compatible_flag)
printf(_("DOS Compatibility flag is set (DEPRECATED!)\n"));
else
printf(_("DOS Compatibility flag is not set\n"));
- update_sector_offset();
+ update_sector_offset(cxt);
}
static void
-delete_partition(int i)
+delete_partition(struct fdisk_context *cxt, int i)
{
if (i < 0)
return;
@@ -1057,18 +990,18 @@ delete_partition(int i)
else if (disklabel == SUN_LABEL)
sun_delete_partition(i);
else if (disklabel == SGI_LABEL)
- sgi_delete_partition(i);
+ sgi_delete_partition(cxt, i);
printf(_("Partition %d is deleted\n"), i + 1);
}
-static void
-change_sysid(void) {
+static void change_sysid(struct fdisk_context *cxt)
+{
char *temp;
int i, sys, origsys;
struct partition *p;
- i = get_existing_partition(0, partitions);
+ i = get_existing_partition(cxt, 0, partitions);
if (i == -1)
return;
@@ -1204,16 +1137,16 @@ static void check_consistency(struct partition *p, int partition) {
}
static void
-check_alignment(sector_t lba, int partition)
+check_alignment(struct fdisk_context *cxt, sector_t lba, int partition)
{
- if (!lba_is_aligned(lba))
+ if (!lba_is_aligned(cxt, lba))
printf(_("Partition %i does not start on physical sector boundary.\n"),
partition + 1);
}
static void
list_disk_geometry(struct fdisk_context *cxt) {
- unsigned long long bytes = total_number_of_sectors * sector_size;
+ unsigned long long bytes = total_number_of_sectors * cxt->sector_size;
long megabytes = bytes/1000000;
if (megabytes < 10000)
@@ -1229,16 +1162,16 @@ list_disk_geometry(struct fdisk_context *cxt) {
if (units_per_sector == 1)
printf(_(", total %llu sectors"), total_number_of_sectors);
printf("\n");
- printf(_("Units = %s of %d * %d = %d bytes\n"),
+ printf(_("Units = %s of %d * %ld = %ld bytes\n"),
str_units(PLURAL),
- units_per_sector, sector_size, units_per_sector * sector_size);
+ units_per_sector, cxt->sector_size, units_per_sector * cxt->sector_size);
- printf(_("Sector size (logical/physical): %u bytes / %lu bytes\n"),
- sector_size, phy_sector_size);
+ printf(_("Sector size (logical/physical): %lu bytes / %lu bytes\n"),
+ cxt->sector_size, cxt->phy_sector_size);
printf(_("I/O size (minimum/optimal): %lu bytes / %lu bytes\n"),
- min_io_size, io_size);
- if (alignment_offset)
- printf(_("Alignment offset: %lu bytes\n"), alignment_offset);
+ cxt->min_io_size, cxt->io_size);
+ if (cxt->alignment_offset)
+ printf(_("Alignment offset: %lu bytes\n"), cxt->alignment_offset);
if (disklabel == DOS_LABEL)
dos_print_mbr_id();
printf("\n");
@@ -1428,12 +1361,12 @@ list_table(struct fdisk_context *cxt, int xtra) {
unsigned int pblocks = psects;
unsigned int podd = 0;
- if (sector_size < 1024) {
- pblocks /= (1024 / sector_size);
- podd = psects % (1024 / sector_size);
+ if (cxt->sector_size < 1024) {
+ pblocks /= (1024 / cxt->sector_size);
+ podd = psects % (1024 / cxt->sector_size);
}
- if (sector_size > 1024)
- pblocks *= (sector_size / 1024);
+ if (cxt->sector_size > 1024)
+ pblocks *= (cxt->sector_size / 1024);
printf(
"%s %c %11lu %11lu %11lu%c %2x %s\n",
partname(cxt->dev_path, i+1, w+2),
@@ -1447,7 +1380,7 @@ list_table(struct fdisk_context *cxt, int xtra) {
/* type name */ (type = partition_type(p->sys_ind)) ?
type : _("Unknown"));
check_consistency(p, i);
- check_alignment(get_partition_start(pe), i);
+ check_alignment(cxt, get_partition_start(pe), i);
}
}
@@ -1482,7 +1415,7 @@ x_list_table(struct fdisk_context *cxt, int extend) {
(unsigned long) get_nr_sects(p), p->sys_ind);
if (p->sys_ind) {
check_consistency(p, i);
- check_alignment(get_partition_start(pe), i);
+ check_alignment(cxt, get_partition_start(pe), i);
}
}
}
@@ -1533,7 +1466,7 @@ check(int n, unsigned int h, unsigned int s, unsigned int c,
}
static void
-verify(void) {
+verify(struct fdisk_context *cxt) {
int i, j;
sector_t total = 1, n_sectors = total_number_of_sectors;
unsigned long long first[partitions], last[partitions];
@@ -1559,7 +1492,7 @@ verify(void) {
p = pe->part_table;
if (p->sys_ind && !IS_EXTENDED (p->sys_ind)) {
check_consistency(p, i);
- check_alignment(get_partition_start(pe), i);
+ check_alignment(cxt, get_partition_start(pe), i);
if (get_partition_start(pe) < first[i])
printf(_("Warning: bad start-of-data in "
"partition %d\n"), i + 1);
@@ -1603,30 +1536,31 @@ verify(void) {
printf(_("Total allocated sectors %llu greater than the maximum"
" %llu\n"), total, n_sectors);
else if (total < n_sectors)
- printf(_("Remaining %lld unallocated %d-byte sectors\n"),
- n_sectors - total, sector_size);
+ printf(_("Remaining %lld unallocated %ld-byte sectors\n"),
+ n_sectors - total, cxt->sector_size);
}
-void print_partition_size(int num, sector_t start, sector_t stop, int sysid)
+void print_partition_size(struct fdisk_context *cxt,
+ int num, sector_t start, sector_t stop, int sysid)
{
char *str = size_to_human_string(SIZE_SUFFIX_3LETTER | SIZE_SUFFIX_SPACE,
- (stop - start + 1) * sector_size);
+ (stop - start + 1) * cxt->sector_size);
printf(_("Partition %d of type %s and of size %s is set\n"), num, partition_type(sysid), str);
free(str);
}
-static void new_partition(void)
+static void new_partition(struct fdisk_context *cxt)
{
if (warn_geometry())
return;
if (disklabel == SUN_LABEL) {
- add_sun_partition(get_partition(0, partitions), LINUX_NATIVE);
+ add_sun_partition(cxt, get_partition(cxt, 0, partitions), LINUX_NATIVE);
return;
}
if (disklabel == SGI_LABEL) {
- sgi_add_partition(get_partition(0, partitions), LINUX_NATIVE);
+ sgi_add_partition(cxt, get_partition(cxt, 0, partitions), LINUX_NATIVE);
return;
}
@@ -1649,7 +1583,7 @@ static void new_partition(void)
}
/* default to DOS/BSD */
- dos_new_partition();
+ dos_new_partition(cxt);
}
static void
@@ -1719,10 +1653,10 @@ reread_partition_table(struct fdisk_context *cxt, int leave) {
#define MAX_PER_LINE 16
static void
-print_buffer(unsigned char pbuffer[]) {
+print_buffer(struct fdisk_context *cxt, unsigned char pbuffer[]) {
unsigned int i, l;
- for (i = 0, l = 0; i < sector_size; i++, l++) {
+ for (i = 0, l = 0; i < cxt->sector_size; i++, l++) {
if (l == 0)
printf("0x%03X:", i);
printf(" %02X", pbuffer[i]);
@@ -1736,19 +1670,19 @@ print_buffer(unsigned char pbuffer[]) {
printf("\n");
}
-static void
-print_raw(char *dev) {
+static void print_raw(struct fdisk_context *cxt)
+{
int i;
- printf(_("Device: %s\n"), dev);
+ printf(_("Device: %s\n"), cxt->dev_path);
if (disklabel == SUN_LABEL || disklabel == SGI_LABEL)
- print_buffer(MBRbuffer);
+ print_buffer(cxt, MBRbuffer);
else for (i = 3; i < partitions; i++)
- print_buffer(ptes[i].sectorbuffer);
+ print_buffer(cxt, ptes[i].sectorbuffer);
}
static void
-move_begin(int i) {
+move_begin(struct fdisk_context *cxt, int i) {
struct pte *pe = &ptes[i];
struct partition *p = pe->part_table;
unsigned int new, free_start, curr_start, last;
@@ -1785,7 +1719,7 @@ move_begin(int i) {
last = get_partition_start(pe) + get_nr_sects(p) - 1;
- new = read_int(free_start, curr_start, last, free_start,
+ new = read_int(cxt, free_start, curr_start, last, free_start,
_("New beginning of data")) - pe->offset;
if (new != get_nr_sects(p)) {
@@ -1814,27 +1748,27 @@ expert_command_prompt(struct fdisk_context *cxt)
switch (c) {
case 'a':
if (disklabel == SUN_LABEL)
- sun_set_alt_cyl();
+ sun_set_alt_cyl(cxt);
break;
case 'b':
if (disklabel == DOS_LABEL)
- move_begin(get_partition(0, partitions));
+ move_begin(cxt, get_partition(cxt, 0, partitions));
break;
case 'c':
user_cylinders = cylinders =
- read_int(1, cylinders, 1048576, 0,
+ read_int(cxt, 1, cylinders, 1048576, 0,
_("Number of cylinders"));
if (disklabel == SUN_LABEL)
sun_set_ncyl(cylinders);
break;
case 'd':
- print_raw(cxt->dev_path);
+ print_raw(cxt);
break;
case 'e':
if (disklabel == SGI_LABEL)
sgi_set_xcyl();
else if (disklabel == SUN_LABEL)
- sun_set_xcyl();
+ sun_set_xcyl(cxt);
else
if (disklabel == DOS_LABEL)
x_list_table(cxt, 1);
@@ -1847,19 +1781,19 @@ expert_command_prompt(struct fdisk_context *cxt)
create_sgilabel(cxt);
break;
case 'h':
- user_heads = heads = read_int(1, heads, 256, 0,
+ user_heads = heads = read_int(cxt, 1, heads, 256, 0,
_("Number of heads"));
update_units();
break;
case 'i':
if (disklabel == SUN_LABEL)
- sun_set_ilfact();
+ sun_set_ilfact(cxt);
else if (disklabel == DOS_LABEL)
dos_set_mbr_id();
break;
case 'o':
if (disklabel == SUN_LABEL)
- sun_set_rspeed();
+ sun_set_rspeed(cxt);
break;
case 'p':
if (disklabel == SUN_LABEL)
@@ -1872,24 +1806,24 @@ expert_command_prompt(struct fdisk_context *cxt)
case 'r':
return;
case 's':
- user_sectors = sectors = read_int(1, sectors, 63, 0,
+ user_sectors = sectors = read_int(cxt, 1, sectors, 63, 0,
_("Number of sectors"));
if (dos_compatible_flag)
fprintf(stderr, _("Warning: setting "
"sector offset for DOS "
"compatiblity\n"));
- update_sector_offset();
+ update_sector_offset(cxt);
update_units();
break;
case 'v':
- verify();
+ verify(cxt);
break;
case 'w':
write_table(cxt);
break;
case 'y':
if (disklabel == SUN_LABEL)
- sun_set_pcylcount();
+ sun_set_pcylcount(cxt);
break;
default:
print_menu(EXPERT_MENU);
@@ -1918,15 +1852,15 @@ gpt_warning(char *dev)
}
/* Print disk geometry and partition table of a specified device (-l option) */
-
-static void
-print_partition_table_from_option(char *device)
+static void print_partition_table_from_option(char *device, unsigned long sector_size)
{
int gb;
struct fdisk_context *cxt = fdisk_new_context_from_filename(device, 1); /* read-only */
if (!cxt)
err(EXIT_FAILURE, _("unable to open %s"), device);
+ if (sector_size) /* passed -b option, override autodiscovery */
+ cxt->phy_sector_size = cxt->sector_size = sector_size;
gpt_warning(device);
gb = get_boot(cxt, 1);
@@ -1946,7 +1880,7 @@ print_partition_table_from_option(char *device)
* try all things in /proc/partitions that look like a full disk
*/
static void
-print_all_partition_table_from_option(void)
+print_all_partition_table_from_option(unsigned long sector_size)
{
FILE *procpt;
char line[128], ptname[128], devname[256];
@@ -1968,7 +1902,7 @@ print_all_partition_table_from_option(void)
char *cn = canonicalize_path(devname);
if (cn) {
if (!is_ide_cdrom_or_tape(cn))
- print_partition_table_from_option(cn);
+ print_partition_table_from_option(cn, sector_size);
free(cn);
}
}
@@ -2011,13 +1945,13 @@ static void command_prompt(struct fdisk_context *cxt)
switch (c) {
case 'a':
if (disklabel == DOS_LABEL)
- toggle_active(get_partition(1, partitions));
+ toggle_active(get_partition(cxt, 1, partitions));
else if (disklabel == SUN_LABEL)
- toggle_sunflags(get_partition(1, partitions),
+ toggle_sunflags(get_partition(cxt, 1, partitions),
SUN_FLAG_UNMNT);
else if (disklabel == SGI_LABEL)
sgi_set_bootpartition(
- get_partition(1, partitions));
+ get_partition(cxt, 1, partitions));
else
unknown_command(c);
break;
@@ -2033,18 +1967,18 @@ static void command_prompt(struct fdisk_context *cxt)
break;
case 'c':
if (disklabel == DOS_LABEL)
- toggle_dos_compatibility_flag();
+ toggle_dos_compatibility_flag(cxt);
else if (disklabel == SUN_LABEL)
- toggle_sunflags(get_partition(1, partitions),
+ toggle_sunflags(get_partition(cxt, 1, partitions),
SUN_FLAG_RONLY);
else if (disklabel == SGI_LABEL)
sgi_set_swappartition(
- get_partition(1, partitions));
+ get_partition(cxt, 1, partitions));
else
unknown_command(c);
break;
case 'd':
- delete_partition(get_existing_partition(1, partitions));
+ delete_partition(cxt, get_existing_partition(cxt, 1, partitions));
break;
case 'i':
if (disklabel == SGI_LABEL)
@@ -2059,10 +1993,10 @@ static void command_prompt(struct fdisk_context *cxt)
print_menu(MAIN_MENU);
break;
case 'n':
- new_partition();
+ new_partition(cxt);
break;
case 'o':
- create_doslabel();
+ create_doslabel(cxt);
break;
case 'p':
list_table(cxt, 0);
@@ -2073,13 +2007,13 @@ static void command_prompt(struct fdisk_context *cxt)
create_sunlabel(cxt);
break;
case 't':
- change_sysid();
+ change_sysid(cxt);
break;
case 'u':
change_units();
break;
case 'v':
- verify();
+ verify(cxt);
break;
case 'w':
write_table(cxt);
@@ -2112,6 +2046,7 @@ static sector_t get_dev_blocks(char *dev)
int main(int argc, char **argv)
{
int c, optl = 0, opts = 0;
+ unsigned long sector_size = 0;
struct fdisk_context *cxt = NULL;
setlocale(LC_ALL, "");
@@ -2191,9 +2126,9 @@ int main(int argc, char **argv)
if (argc > optind) {
int k;
for (k = optind; k < argc; k++)
- print_partition_table_from_option(argv[k]);
+ print_partition_table_from_option(argv[k], sector_size);
} else
- print_all_partition_table_from_option();
+ print_all_partition_table_from_option(sector_size);
exit(0);
}
@@ -2216,6 +2151,8 @@ int main(int argc, char **argv)
cxt = fdisk_new_context_from_filename(argv[optind], 0);
if (!cxt)
err(EXIT_FAILURE, _("unable to open %s"), argv[optind]);
+ if (user_set_sector_size) /* passed -b option, override autodiscovery */
+ cxt->phy_sector_size = cxt->sector_size = sector_size;
}
else
usage(stderr);