diff options
author | Andreas Fenkart <afenkart@gmail.com> | 2015-11-09 10:42:56 +0100 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2015-11-11 11:04:24 +0900 |
commit | bc1d49d51dd1ce10712b5c4f6d237a8c6771c950 (patch) | |
tree | 42ad99cd548111bbfde1a69bb644468ed7d34d05 /kexec/kexec.c | |
parent | 95741713e790fa6bde7780bbfb772ad88e81a744 (diff) | |
download | kexec-tools-bc1d49d51dd1ce10712b5c4f6d237a8c6771c950.tar.gz |
kexec: determine size of block device
starting 'kexec -l /dev/mmcblk0p1' fails since the size of
a block device can not be determined with stat
Signed-off-by: Andreas Fenkart <andreas.fenkart@dev.digitalstrom.org>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec/kexec.c')
-rw-r--r-- | kexec/kexec.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/kexec/kexec.c b/kexec/kexec.c index ca1e81d..cf6e03d 100644 --- a/kexec/kexec.c +++ b/kexec/kexec.c @@ -26,6 +26,8 @@ #include <stdlib.h> #include <errno.h> #include <limits.h> +#include <sys/ioctl.h> +#include <sys/mount.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/reboot.h> @@ -555,6 +557,12 @@ static char *slurp_file_generic(const char *filename, off_t *r_size, die("Can not seek to the begin of file %s: %s\n", filename, strerror(errno)); buf = slurp_fd(fd, filename, size, &nread); + } else if (S_ISBLK(stats.st_mode)) { + err = ioctl(fd, BLKGETSIZE64, &size); + if (err < 0) + die("Can't retrieve size of block device %s: %s\n", + filename, strerror(errno)); + buf = slurp_fd(fd, filename, size, &nread); } else { size = stats.st_size; if (use_mmap) { |