#include #include #include #include #include #include #define BLKSSZGET _IO(0x12,104) #define BLKIOMIN _IO(0x12,120) #define BLKIOOPT _IO(0x12,121) #define BLKALIGNOFF _IO(0x12,122) #define BLKPBSZGET _IO(0x12,123) static int die(const char *fmt, ...) { int err = errno; va_list val; va_start(val, fmt); vfprintf(stderr, fmt, val); if (err != 0) fprintf(stderr, ": %s", strerror(err)); fprintf(stderr, "\n"); va_end(val); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { unsigned int lbs, pbs, min, opt, align; int fd; if (argc != 2) die("Usage: %s ", argv[0]); fd = open(argv[1], O_RDONLY); if (fd < 0) die("Can't open %s", argv[1]); if (ioctl(fd, BLKSSZGET, &lbs) < 0) die("Can't get logical block size"); if (ioctl(fd, BLKPBSZGET, &pbs) < 0) die("Can't get physical block size"); if (ioctl(fd, BLKIOMIN, &min) < 0) die("Can't get preferred random I/O size"); if (ioctl(fd, BLKIOOPT, &opt) < 0) die("Can't get preferred sustained I/O size"); if (ioctl(fd, BLKALIGNOFF, &align) < 0) die("Can't get alignment offset"); printf("%s:\n", argv[1]); printf("\tlogical block size: %u\n", lbs); printf("\tphysical block size: %u\n", pbs); printf("\trandom I/O size: %u\n", min); printf("\tsustained I/O size: %u\n", opt); printf("\talignment offset: %u\n", align); exit(EXIT_SUCCESS); }