summaryrefslogtreecommitdiffstats
path: root/disk-utils/blockdev.c
diff options
context:
space:
mode:
authorKarel Zak2006-12-07 00:26:16 +0100
committerKarel Zak2006-12-07 00:26:16 +0100
commitc129767e063c5c9839cc9d94c34fd88dac3fb9a6 (patch)
tree13dd85577b43ec1be3cf51a8d913282c2a92259c /disk-utils/blockdev.c
parentImported from util-linux-2.12a tarball. (diff)
downloadkernel-qcow2-util-linux-c129767e063c5c9839cc9d94c34fd88dac3fb9a6.tar.gz
kernel-qcow2-util-linux-c129767e063c5c9839cc9d94c34fd88dac3fb9a6.tar.xz
kernel-qcow2-util-linux-c129767e063c5c9839cc9d94c34fd88dac3fb9a6.zip
Imported from util-linux-2.12b tarball.
Diffstat (limited to 'disk-utils/blockdev.c')
-rw-r--r--disk-utils/blockdev.c64
1 files changed, 55 insertions, 9 deletions
diff --git a/disk-utils/blockdev.c b/disk-utils/blockdev.c
index b1422a823..bb11981db 100644
--- a/disk-utils/blockdev.c
+++ b/disk-utils/blockdev.c
@@ -24,8 +24,9 @@
#define BLKRASET _IO(0x12,98)
#define BLKRAGET _IO(0x12,99)
#define BLKSSZGET _IO(0x12,104)
-#define BLKBSZGET _IOR(0x12,112,sizeof(int))
-#define BLKBSZSET _IOW(0x12,113,sizeof(int))
+#define BLKBSZGET _IOR(0x12,112,size_t)
+#define BLKBSZSET _IOW(0x12,113,size_t)
+#define BLKGETSIZE64 _IOR(0x12,114,size_t)
#endif
/* Maybe <linux/hdreg.h> could be included */
@@ -52,6 +53,7 @@ struct bdc {
#define ARGINTP 3
#define ARGINTG 4
#define ARGLINTG 5
+#define ARGLLINTG 6
long argval;
char *argname;
char *help;
@@ -73,7 +75,10 @@ struct bdc {
{ "--setbsz", "BLKBSZSET", BLKBSZSET, ARGINTAP, 0, "BLOCKSIZE", N_("set blocksize") },
#endif
#ifdef BLKGETSIZE
- { "--getsize", "BLKGETSIZE", BLKGETSIZE, ARGLINTG, -1, NULL, N_("get size") },
+ { "--getsize", "BLKGETSIZE", BLKGETSIZE, ARGLINTG, -1, NULL, N_("get 32-bit sector count") },
+#endif
+#ifdef BLKGETSIZE64
+ { "--getsize64", "BLKGETSIZE64", BLKGETSIZE64, ARGLLINTG, -1, NULL, N_("get size in bytes") },
#endif
#ifdef BLKRASET
{ "--setra", "BLKRASET", BLKRASET, ARGINTA, 0, "READAHEAD", N_("set readahead") },
@@ -100,6 +105,7 @@ usage(void) {
fprintf(stderr, _(" %s --report [devices]\n"), progname);
fprintf(stderr, _(" %s [-v|-q] commands devices\n"), progname);
fprintf(stderr, _("Available commands:\n"));
+ fprintf(stderr, "\t--getsz\t(%s)\n", "get size in 512-byte sectors");
for (i = 0; i < SIZE(bdcms); i++) {
fprintf(stderr, "\t%s", bdcms[i].name);
if (bdcms[i].argname)
@@ -121,6 +127,23 @@ find_cmd(char *s) {
return -1;
}
+static int
+getsize(int fd, long long *sectors) {
+ int err;
+ long sz;
+ long long b;
+
+ err = ioctl (fd, BLKGETSIZE, &sz);
+ if (err)
+ return err;
+ err = ioctl(fd, BLKGETSIZE64, &b);
+ if (err || b == 0 || b == sz)
+ *sectors = sz;
+ else
+ *sectors = (b >> 9);
+ return 0;
+}
+
void do_commands(int fd, char **argv, int d);
void report_header(void);
void report_device(char *device, int quiet);
@@ -174,6 +197,8 @@ main(int argc, char **argv) {
d++;
continue;
}
+ if (!strcmp(argv[d], "--getsz"))
+ continue;
if (!strcmp(argv[d], "--")) {
d++;
break;
@@ -202,6 +227,7 @@ do_commands(int fd, char **argv, int d) {
int res, i, j;
int iarg;
long larg;
+ long long llarg;
int verbose = 0;
for (i = 1; i < d; i++) {
@@ -214,6 +240,15 @@ do_commands(int fd, char **argv, int d) {
continue;
}
+ if (!strcmp(argv[i], "--getsz")) {
+ res = getsize(fd, &llarg);
+ if (res == 0)
+ printf("%lld\n", llarg);
+ else
+ exit(1);
+ continue;
+ }
+
j = find_cmd(argv[i]);
if (j == -1) {
fprintf(stderr, _("%s: Unknown command: %s\n"),
@@ -253,6 +288,10 @@ do_commands(int fd, char **argv, int d) {
larg = bdcms[j].argval;
res = ioctl(fd, bdcms[j].ioc, &larg);
break;
+ case ARGLLINTG:
+ llarg = bdcms[j].argval;
+ res = ioctl(fd, bdcms[j].ioc, &llarg);
+ break;
}
if (res == -1) {
perror(bdcms[j].iocname);
@@ -273,6 +312,12 @@ do_commands(int fd, char **argv, int d) {
else
printf("%ld\n", larg);
break;
+ case ARGLLINTG:
+ if (verbose)
+ printf("%s: %lld\n", _(bdcms[j].help), llarg);
+ else
+ printf("%lld\n", llarg);
+ break;
default:
if (verbose)
printf(_("%s succeeded.\n"), _(bdcms[j].help));
@@ -312,7 +357,8 @@ void
report_device(char *device, int quiet) {
int fd;
int ro, ssz, bsz;
- long ra, sz, ss;
+ long ra, ss;
+ long long bytes;
struct hd_geometry g;
fd = open(device, O_RDONLY | O_NONBLOCK);
@@ -324,15 +370,15 @@ report_device(char *device, int quiet) {
}
ro = ssz = bsz = 0;
- g.start = ra = sz = ss = 0;
+ g.start = ra = ss = 0;
if (ioctl (fd, BLKROGET, &ro) == 0 &&
ioctl (fd, BLKRAGET, &ra) == 0 &&
ioctl (fd, BLKSSZGET, &ssz) == 0 &&
ioctl (fd, BLKBSZGET, &bsz) == 0 &&
- ioctl (fd, BLKGETSIZE, &sz) == 0 &&
- ioctl (fd, HDIO_GETGEO, &g) == 0) {
- printf("%s %5ld %5d %5d %10ld %10ld %s\n",
- ro ? "ro" : "rw", ra, ssz, bsz, g.start, sz, device);
+ ioctl (fd, HDIO_GETGEO, &g) == 0 &&
+ getsize (fd, &bytes) == 0) {
+ printf("%s %5ld %5d %5d %10ld %10lld %s\n",
+ ro ? "ro" : "rw", ra, ssz, bsz, g.start, bytes, device);
} else {
if (!quiet)
fprintf(stderr, _("%s: ioctl error on %s\n"),