diff options
author | Denys Vlasenko | 2013-03-18 02:26:58 +0100 |
---|---|---|
committer | Denys Vlasenko | 2013-03-18 02:26:58 +0100 |
commit | 7c6f2d4207e11ca60964132deb3bd1c4cb583aba (patch) | |
tree | a9fe1b448e0454f7e3c0faa6d8a79b4370cca8e4 | |
parent | 4424dfd69bc4edfe514b17b7006f8855892a338b (diff) | |
download | busybox-7c6f2d4207e11ca60964132deb3bd1c4cb583aba.zip busybox-7c6f2d4207e11ca60964132deb3bd1c4cb583aba.tar.gz |
mkfs_minix: use get_volume_size_in_bytes instead of local version
Hopefully this also closes 4730
function old new delta
valid_offset 55 - -55
mkfs_minix_main 2925 2674 -251
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-306) Total: -306 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | util-linux/mkfs_minix.c | 77 |
1 files changed, 14 insertions, 63 deletions
diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c index 59d7d23..49afd11 100644 --- a/util-linux/mkfs_minix.c +++ b/util-linux/mkfs_minix.c @@ -196,54 +196,6 @@ static void minix_clrbit(char *a, unsigned i) # define BLKGETSIZE _IO(0x12,96) /* return device size */ #endif - -static long valid_offset(int fd, int offset) -{ - char ch; - - if (lseek(fd, offset, SEEK_SET) < 0) - return 0; - if (read(fd, &ch, 1) < 1) - return 0; - return 1; -} - -static int count_blocks(int fd) -{ - int high, low; - - low = 0; - for (high = 1; valid_offset(fd, high); high *= 2) - low = high; - - while (low < high - 1) { - const int mid = (low + high) / 2; - - if (valid_offset(fd, mid)) - low = mid; - else - high = mid; - } - valid_offset(fd, 0); - return (low + 1); -} - -static int get_size(const char *file) -{ - int fd; - long size; - - fd = xopen(file, O_RDWR); - if (ioctl(fd, BLKGETSIZE, &size) >= 0) { - close(fd); - return (size * 512); - } - - size = count_blocks(fd); - close(fd); - return size; -} - static void write_tables(void) { /* Mark the superblock valid. */ @@ -636,7 +588,6 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv) { unsigned opt; char *tmp; - struct stat statbuf; char *str_i; char *listfile = NULL; @@ -673,13 +624,17 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv) #endif } - G.device_name = *argv++; + G.device_name = argv[0]; if (!G.device_name) bb_show_usage(); - if (*argv) - G.total_blocks = xatou32(*argv); - else - G.total_blocks = get_size(G.device_name) / 1024; + + /* Check if it is mounted */ + if (find_mount_point(G.device_name, 0)) + bb_error_msg_and_die("can't format mounted filesystem"); + + xmove_fd(xopen(G.device_name, O_RDWR), dev_fd); + + G.total_blocks = get_volume_size_in_bytes(dev_fd, argv[1], 1024, /*extend:*/ 1) / 1024; if (G.total_blocks < 10) bb_error_msg_and_die("must have at least 10 blocks"); @@ -690,25 +645,21 @@ int mkfs_minix_main(int argc UNUSED_PARAM, char **argv) G.magic = MINIX2_SUPER_MAGIC; } else if (G.total_blocks > 65535) G.total_blocks = 65535; - - /* Check if it is mounted */ - if (find_mount_point(G.device_name, 0)) - bb_error_msg_and_die("can't format mounted filesystem"); - - xmove_fd(xopen(G.device_name, O_RDWR), dev_fd); +#if 0 + struct stat statbuf; xfstat(dev_fd, &statbuf, G.device_name); +/* why? */ if (!S_ISBLK(statbuf.st_mode)) opt &= ~1; // clear -c (check) - +#if 0 /* I don't know why someone has special code to prevent mkfs.minix * on IDE devices. Why IDE but not SCSI, etc?... */ -#if 0 else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340) /* what is this? */ bb_error_msg_and_die("will not try " "to make filesystem on '%s'", G.device_name); #endif - +#endif tmp = G.root_block; *(short *) tmp = 1; strcpy(tmp + 2, "."); |