diff mbox series

mkimage: allow -l to work on block devices on Linux

Message ID 20210518085904.1966773-1-yann@blade-group.com
State Accepted
Commit 331f0800f1a3ddf6b365c65a37d0bfc5114b0c02
Delegated to: Tom Rini
Headers show
Series mkimage: allow -l to work on block devices on Linux | expand

Commit Message

yann.dirson@blade-group.com May 18, 2021, 8:59 a.m. UTC
From: Yann Dirson <yann@blade-group.com>

When "mkimage -l" was run on a block device it would fail with
erroneous message, because fstat reports a size of zero for those:

 mkimage: Bad size: "/dev/sdb4" is not valid image

This patch identifies the "is a block device" case and reports it as
such, and if it knows how to determine the size of a block device on
the current OS, proceeds.

As shown in
http://www.mit.edu/afs.new/sipb/user/tytso/e2fsprogs/lib/blkid/getsize.c
this is no portable task, and I only handled the case of a modern
Linux kernel, which is what I can test.

Signed-off-by: Yann Dirson <yann@blade-group.com>
---
 tools/mkimage.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

Comments

Tom Rini July 15, 2021, 1:27 a.m. UTC | #1
On Tue, May 18, 2021 at 10:59:04AM +0200, yann.dirson@blade-group.com wrote:

> From: Yann Dirson <yann@blade-group.com>
> 
> When "mkimage -l" was run on a block device it would fail with
> erroneous message, because fstat reports a size of zero for those:
> 
>  mkimage: Bad size: "/dev/sdb4" is not valid image
> 
> This patch identifies the "is a block device" case and reports it as
> such, and if it knows how to determine the size of a block device on
> the current OS, proceeds.
> 
> As shown in
> http://www.mit.edu/afs.new/sipb/user/tytso/e2fsprogs/lib/blkid/getsize.c
> this is no portable task, and I only handled the case of a modern
> Linux kernel, which is what I can test.
> 
> Signed-off-by: Yann Dirson <yann@blade-group.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/tools/mkimage.c b/tools/mkimage.c
index cc7b242faf..302bfcf971 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -12,6 +12,9 @@ 
 #include "imximage.h"
 #include <image.h>
 #include <version.h>
+#ifdef __linux__
+#include <sys/ioctl.h>
+#endif
 
 static void copy_file(int, const char *, int);
 
@@ -402,6 +405,7 @@  int main(int argc, char **argv)
 	}
 
 	if (params.lflag || params.fflag) {
+		uint64_t size;
 		/*
 		 * list header information of existing image
 		 */
@@ -412,14 +416,34 @@  int main(int argc, char **argv)
 			exit (EXIT_FAILURE);
 		}
 
-		if ((unsigned)sbuf.st_size < tparams->header_size) {
+		if ((sbuf.st_mode & S_IFMT) == S_IFBLK) {
+#ifdef __linux__
+#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
+#define BLKGETSIZE64 _IOR(0x12,114,size_t)	/* return device size in bytes (u64 *arg) */
+#endif
+			if (ioctl(ifd, BLKGETSIZE64, &size) < 0) {
+				fprintf (stderr,
+					"%s: failed to get size of block device \"%s\"\n",
+					params.cmdname, params.imagefile);
+				exit (EXIT_FAILURE);
+			}
+#else
 			fprintf (stderr,
-				"%s: Bad size: \"%s\" is not valid image\n",
+				"%s: \"%s\" is block device, don't know how to get its size\n",
 				params.cmdname, params.imagefile);
 			exit (EXIT_FAILURE);
+#endif
+		} else if ((unsigned)sbuf.st_size < tparams->header_size) {
+			fprintf (stderr,
+				"%s: Bad size: \"%s\" is not valid image: size %ld < %u\n",
+				params.cmdname, params.imagefile,
+				sbuf.st_size, tparams->header_size);
+			exit (EXIT_FAILURE);
+		} else {
+			size = sbuf.st_size;
 		}
 
-		ptr = mmap(0, sbuf.st_size, PROT_READ, MAP_SHARED, ifd, 0);
+		ptr = mmap(0, size, PROT_READ, MAP_SHARED, ifd, 0);
 		if (ptr == MAP_FAILED) {
 			fprintf (stderr, "%s: Can't read %s: %s\n",
 				params.cmdname, params.imagefile,