summaryrefslogtreecommitdiffstats
path: root/sbin/fdisk
diff options
context:
space:
mode:
authorsimon <simon@FreeBSD.org>2006-06-18 22:02:22 +0000
committersimon <simon@FreeBSD.org>2006-06-18 22:02:22 +0000
commit80d29aa8a846516f97ff083705921f9b1b6387de (patch)
tree0778e7f8ccdf761258d60d08edadb1b739a619ad /sbin/fdisk
parent9d0350bdbe6fe5b7262f15a945b502fbdd590621 (diff)
downloadFreeBSD-src-80d29aa8a846516f97ff083705921f9b1b6387de.zip
FreeBSD-src-80d29aa8a846516f97ff083705921f9b1b6387de.tar.gz
- Fail with an understandable error message if we cannot detect the
sector size, instead of later failing with an error about /boot/mbr not being a multiple of the sector size (since we end up with an assumed sector size of MAX_SEC_SIZE * 2). - We query the sector size via an IOCTL anyway, so if that succeeds use that instead of probing for it via read(2) calls. This fixes the problem with fdisk failing to operate on at least graid3 and md(4) devices on kernels with src/sys/geom/geom_dev.c before rev. 1.90, due to fdisk failing to detect the sector size. - When detecting the root device allow "/" characters in it, which happens with e.g. gmirror devices. Reviewed by: cperciva MFC after: 1 week
Diffstat (limited to 'sbin/fdisk')
-rw-r--r--sbin/fdisk/fdisk.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c
index d0b12b7..142cf13 100644
--- a/sbin/fdisk/fdisk.c
+++ b/sbin/fdisk/fdisk.c
@@ -317,7 +317,8 @@ main(int argc, char *argv[])
/* (abu)use mboot.bootinst to probe for the sector size */
if ((mboot.bootinst = malloc(MAX_SEC_SIZE)) == NULL)
err(1, "cannot allocate buffer to determine disk sector size");
- read_disk(0, mboot.bootinst);
+ if (read_disk(0, mboot.bootinst) == -1)
+ errx(1, "could not detect sector size");
free(mboot.bootinst);
mboot.bootinst = NULL;
@@ -811,6 +812,8 @@ get_params()
error = ioctl(fd, DIOCGSECTORSIZE, &u);
if (error != 0 || u == 0)
u = 512;
+ else
+ secsize = u;
error = ioctl(fd, DIOCGMEDIASIZE, &o);
if (error == 0) {
@@ -1395,7 +1398,7 @@ get_rootdisk(void)
if (statfs("/", &rootfs) == -1)
err(1, "statfs(\"/\")");
- if ((rv = regcomp(&re, "^(/dev/[a-z]+[0-9]+)([sp][0-9]+)?[a-h]?$",
+ if ((rv = regcomp(&re, "^(/dev/[a-z/]+[0-9]+)([sp][0-9]+)?[a-h]?$",
REG_EXTENDED)) != 0)
errx(1, "regcomp() failed (%d)", rv);
if ((rv = regexec(&re, rootfs.f_mntfromname, NMATCHES, rm, 0)) != 0)
OpenPOWER on IntegriCloud