diff mbox

[mtd-utils] nanddump: check write function result for errors

Message ID 1468833493-28311-1-git-send-email-zajec5@gmail.com
State Superseded
Headers show

Commit Message

Rafał Miłecki July 18, 2016, 9:18 a.m. UTC
Errors may happen, it's e.g. easy on embedded devices to run out of space
when dumping big partitions. This patch adds a helper function for
writing. It deals with partial writes and just returns 0 on success or
error number.

The old code didn't check for errors at all which could result in
incomplete dumps without exiting with an error.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 nand-utils/nanddump.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 44 insertions(+), 6 deletions(-)

Comments

Richard Weinberger July 18, 2016, 11:33 a.m. UTC | #1
On Mon, Jul 18, 2016 at 11:18 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
> Errors may happen, it's e.g. easy on embedded devices to run out of space
> when dumping big partitions. This patch adds a helper function for
> writing. It deals with partial writes and just returns 0 on success or
> error number.
>
> The old code didn't check for errors at all which could result in
> incomplete dumps without exiting with an error.

Is this patch different from my version, does it fix more?
http://lists.infradead.org/pipermail/linux-mtd/2016-April/067234.html

Brian, if this is fine with you I'd apply one of these patches.
Rafał Miłecki July 18, 2016, 11:59 a.m. UTC | #2
On 18 July 2016 at 13:33, Richard Weinberger
<richard.weinberger@gmail.com> wrote:
> On Mon, Jul 18, 2016 at 11:18 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>> Errors may happen, it's e.g. easy on embedded devices to run out of space
>> when dumping big partitions. This patch adds a helper function for
>> writing. It deals with partial writes and just returns 0 on success or
>> error number.
>>
>> The old code didn't check for errors at all which could result in
>> incomplete dumps without exiting with an error.
>
> Is this patch different from my version, does it fix more?
> http://lists.infradead.org/pipermail/linux-mtd/2016-April/067234.html
>
> Brian, if this is fine with you I'd apply one of these patches.

I wasn't aware of your patch, having it accepted would save me some
time for sure.

Two minor advantages I see in my version:
1) It handles partial writes, just retries if only some part of buffer
has been written
2) It displays error number and string which may provide some extra
hint to the user

In my case (when I was running out of space), the successful last
write was partial because there wasn't enough space for the whole
buffer. I needed to retry a write to get a real error code.
Richard Weinberger July 18, 2016, 2:10 p.m. UTC | #3
Rafał,

Am 18.07.2016 um 13:59 schrieb Rafał Miłecki:
> On 18 July 2016 at 13:33, Richard Weinberger
> <richard.weinberger@gmail.com> wrote:
>> On Mon, Jul 18, 2016 at 11:18 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>>> Errors may happen, it's e.g. easy on embedded devices to run out of space
>>> when dumping big partitions. This patch adds a helper function for
>>> writing. It deals with partial writes and just returns 0 on success or
>>> error number.
>>>
>>> The old code didn't check for errors at all which could result in
>>> incomplete dumps without exiting with an error.
>>
>> Is this patch different from my version, does it fix more?
>> http://lists.infradead.org/pipermail/linux-mtd/2016-April/067234.html
>>
>> Brian, if this is fine with you I'd apply one of these patches.
> 
> I wasn't aware of your patch, having it accepted would save me some
> time for sure.
> 
> Two minor advantages I see in my version:
> 1) It handles partial writes, just retries if only some part of buffer
> has been written

That's a plus point. :-)

> 2) It displays error number and string which may provide some extra
> hint to the user

My patch too since it uses mtd-util's logging functions.
sys_errmsg(...)

Could you please merge both patches and resend?

Thanks,
//richard
Rafał Miłecki July 18, 2016, 2:51 p.m. UTC | #4
On 18 July 2016 at 16:10, Richard Weinberger <richard@nod.at> wrote:
> Rafał,
>
> Am 18.07.2016 um 13:59 schrieb Rafał Miłecki:
>> On 18 July 2016 at 13:33, Richard Weinberger
>> <richard.weinberger@gmail.com> wrote:
>>> On Mon, Jul 18, 2016 at 11:18 AM, Rafał Miłecki <zajec5@gmail.com> wrote:
>>>> Errors may happen, it's e.g. easy on embedded devices to run out of space
>>>> when dumping big partitions. This patch adds a helper function for
>>>> writing. It deals with partial writes and just returns 0 on success or
>>>> error number.
>>>>
>>>> The old code didn't check for errors at all which could result in
>>>> incomplete dumps without exiting with an error.
>>>
>>> Is this patch different from my version, does it fix more?
>>> http://lists.infradead.org/pipermail/linux-mtd/2016-April/067234.html
>>>
>>> Brian, if this is fine with you I'd apply one of these patches.
>>
>> I wasn't aware of your patch, having it accepted would save me some
>> time for sure.
>>
>> Two minor advantages I see in my version:
>> 1) It handles partial writes, just retries if only some part of buffer
>> has been written
>
> That's a plus point. :-)
>
>> 2) It displays error number and string which may provide some extra
>> hint to the user
>
> My patch too since it uses mtd-util's logging functions.
> sys_errmsg(...)
>
> Could you please merge both patches and resend?

Oh, I didn't realize sys_errmsg does that. I assumed it logs into
system log (which seemed like a weird idea to do). A bit confusing
name. Thanks, I'll send V2.
Richard Weinberger July 18, 2016, 6:31 p.m. UTC | #5
Rafał,

Am 18.07.2016 um 16:51 schrieb Rafał Miłecki:
> On 18 July 2016 at 16:10, Richard Weinberger <richard@nod.at> wrote:
>> My patch too since it uses mtd-util's logging functions.
>> sys_errmsg(...)
>>
>> Could you please merge both patches and resend?
> 
> Oh, I didn't realize sys_errmsg does that. I assumed it logs into
> system log (which seemed like a weird idea to do). A bit confusing
> name. Thanks, I'll send V2.
> 

The sys_ prefix denotes that this function is used for syscall
errors. :-)

Thanks,
//richard
diff mbox

Patch

diff --git a/nand-utils/nanddump.c b/nand-utils/nanddump.c
index 4ee7ed4..0bbc97f 100644
--- a/nand-utils/nanddump.c
+++ b/nand-utils/nanddump.c
@@ -293,6 +293,25 @@  nil:
 	linebuf[lx++] = '\0';
 }
 
+/**
+ * ofd_write - writes whole buffer to the file associated with a descriptor
+ *
+ * On failure an error (negative number) is returned. Otherwise 0 is returned.
+ */
+static int ofd_write(int ofd, const unsigned char *buf, size_t nbyte)
+{
+	ssize_t bytes;
+
+	while (nbyte) {
+		bytes = write(ofd, buf, nbyte);
+		if (bytes < 0)
+			return -errno;
+		buf += bytes;
+		nbyte -= bytes;
+	}
+
+	return 0;
+}
 
 /*
  * Main program
@@ -309,6 +328,7 @@  int main(int argc, char * const argv[])
 	bool eccstats = false;
 	unsigned char *readbuf = NULL, *oobbuf = NULL;
 	libmtd_t mtd_desc;
+	int err;
 
 	process_options(argc, argv);
 
@@ -443,10 +463,19 @@  int main(int argc, char * const argv[])
 			for (i = 0; i < bs; i += PRETTY_ROW_SIZE) {
 				pretty_dump_to_buffer(readbuf + i, PRETTY_ROW_SIZE,
 						pretty_buf, PRETTY_BUF_LEN, true, canonical, ofs + i);
-				write(ofd, pretty_buf, strlen(pretty_buf));
+				err = write(ofd, pretty_buf, strlen(pretty_buf));
+				if (err) {
+					errmsg("ofd_write: %s\n", strerror(-err));
+					goto closeall;
+				}
 			}
-		} else
-			write(ofd, readbuf, bs);
+		} else {
+			err = ofd_write(ofd, readbuf, bs);
+			if (err) {
+				errmsg("ofd_write: %d %s\n", err, strerror(-err));
+				goto closeall;
+			}
+		}
 
 		if (omitoob)
 			continue;
@@ -466,10 +495,19 @@  int main(int argc, char * const argv[])
 			for (i = 0; i < mtd.oob_size; i += PRETTY_ROW_SIZE) {
 				pretty_dump_to_buffer(oobbuf + i, mtd.oob_size - i,
 						pretty_buf, PRETTY_BUF_LEN, false, canonical, 0);
-				write(ofd, pretty_buf, strlen(pretty_buf));
+				err = write(ofd, pretty_buf, strlen(pretty_buf));
+				if (err) {
+					errmsg("ofd_write: %s\n", strerror(-err));
+					goto closeall;
+				}
 			}
-		} else
-			write(ofd, oobbuf, mtd.oob_size);
+		} else {
+			err = ofd_write(ofd, oobbuf, mtd.oob_size);
+			if (err) {
+				errmsg("ofd_write: %d %s\n", err, strerror(-err));
+				goto closeall;
+			}
+		}
 	}
 
 	/* Close the output file and MTD device, free memory */