Hello,
in getsize() the BLKGETSIZE and BLKGETSIZE64 ioctls are called
with signed args, see the patch below.
Another thing:
Since the EFBIG change in getsize() sz might contain garbage, so there
should be additional error checks, something like (yes, this is ugly):
static int
getsize(int fd, unsigned long long *sectors) {
int err1, err2;
unsigned long sz;
unsigned long long b;
err1 = ioctl (fd, BLKGETSIZE, &sz);
if (err1) {
if (errno != EFBIG)
return err1;
}
err2 = ioctl(fd, BLKGETSIZE64, &b);
if (!err1 && (err2 || b == 0 || b == sz))
*sectors = sz;
else if (!err2)
*sectors = (b >> 9);
else
return err2;
return 0;
}
What is the purpose of (b == 0 || b == sz)? I searched a little and most
getsize() functions seem to try BLKGETSIZE64 first. If that fails, they
try other methods.
Stefan Krah
========================================================================
diff --git a/disk-utils/blockdev.c b/disk-utils/blockdev.c
index d02ebbc..d0ddb1b 100644
--- a/disk-utils/blockdev.c
+++ b/disk-utils/blockdev.c
@@ -145,10 +145,10 @@ find_cmd(char *s) {
}
static int
-getsize(int fd, long long *sectors) {
+getsize(int fd, unsigned long long *sectors) {
int err;
- long sz;
- long long b;
+ unsigned long sz;
+ unsigned long long b;
err = ioctl (fd, BLKGETSIZE, &sz);
if (err) {
@@ -262,9 +262,9 @@ do_commands(int fd, char **argv, int d) {
}
if (!strcmp(argv[i], "--getsz")) {
- res = getsize(fd, &llarg);
+ res = getsize(fd, &llu);
if (res == 0)
- printf("%lld\n", llarg);
+ printf("%llu\n", llu);
else
exit(1);
continue;
@@ -401,7 +401,7 @@ report_device(char *device, int quiet) {
int fd;
int ro, ssz, bsz;
long ra, ss;
- long long bytes;
+ unsigned long long sectors;
struct hd_geometry g;
fd = open(device, O_RDONLY | O_NONBLOCK);
@@ -419,9 +419,9 @@ report_device(char *device, int quiet) {
ioctl (fd, BLKSSZGET, &ssz) == 0 &&
ioctl (fd, BLKBSZGET, &bsz) == 0 &&
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);
+ getsize (fd, §ors) == 0) {
+ printf("%s %5ld %5d %5d %10ld %10llu %s\n",
+ ro ? "ro" : "rw", ra, ssz, bsz, g.start, sectors,
device);
} else {
if (!quiet)
fprintf(stderr, _("%s: ioctl error on %s\n"),
-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html