From: Masami Hiramatsu <mhiramat@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>,
Linus Torvalds <torvalds@linux-foundation.org>
Cc: Chen Yu <yu.c.chen@intel.com>, Chen Yu <yu.chen.surf@gmail.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@kernel.org>, Jonathan Corbet <corbet@lwn.net>
Subject: [PATCH v5 2/4] tools/bootconfig: Fix to check the write failure correctly
Date: Thu, 19 Nov 2020 14:53:31 +0900 [thread overview]
Message-ID: <160576521135.320071.3883101436675969998.stgit@devnote2> (raw)
In-Reply-To: <160576519277.320071.14260402851742732108.stgit@devnote2>
Fix to check the write(2) failure including partial write
correctly and try to rollback the partial write, because
if there is no BOOTCONFIG_MAGIC string, we can not remove it.
Fixes: 85c46b78da58 ("bootconfig: Add bootconfig magic word for indicating bootconfig explicitly")
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
Changes in v5:
- Return -ENOSPC for partial write.
---
tools/bootconfig/main.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c
index 52eb2bbe8966..a0733cbb3c49 100644
--- a/tools/bootconfig/main.c
+++ b/tools/bootconfig/main.c
@@ -337,6 +337,7 @@ static int delete_xbc(const char *path)
static int apply_xbc(const char *path, const char *xbc_path)
{
+ struct stat stat;
u32 size, csum;
char *buf, *data;
int ret, fd;
@@ -394,16 +395,26 @@ static int apply_xbc(const char *path, const char *xbc_path)
return ret;
}
/* TODO: Ensure the @path is initramfs/initrd image */
+ if (fstat(fd, &stat) < 0) {
+ pr_err("Failed to get the size of %s\n", path);
+ goto out;
+ }
ret = write(fd, data, size + 8);
- if (ret < 0) {
+ if (ret < size + 8) {
+ if (ret < 0)
+ ret = -errno;
pr_err("Failed to apply a boot config: %d\n", ret);
- goto out;
+ if (ret < 0)
+ goto out;
+ goto out_rollback;
}
/* Write a magic word of the bootconfig */
ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
- if (ret < 0) {
+ if (ret < BOOTCONFIG_MAGIC_LEN) {
+ if (ret < 0)
+ ret = -errno;
pr_err("Failed to apply a boot config magic: %d\n", ret);
- goto out;
+ goto out_rollback;
}
ret = 0;
out:
@@ -411,6 +422,17 @@ static int apply_xbc(const char *path, const char *xbc_path)
free(data);
return ret;
+
+out_rollback:
+ /* Map the partial write to -ENOSPC */
+ if (ret >= 0)
+ ret = -ENOSPC;
+ if (ftruncate(fd, stat.st_size) < 0) {
+ ret = -errno;
+ pr_err("Failed to rollback the write error: %d\n", ret);
+ pr_err("The initrd %s may be corrupted. Recommend to rebuild.\n", path);
+ }
+ goto out;
}
static int usage(void)
next prev parent reply other threads:[~2020-11-19 5:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-19 5:53 [PATCH v5 0/4] tools/bootconfig: Align the bootconfig applied initrd Masami Hiramatsu
2020-11-19 5:53 ` [PATCH v5 1/4] tools/bootconfig: Fix errno reference after printf() Masami Hiramatsu
2020-11-19 5:53 ` Masami Hiramatsu [this message]
2020-11-19 5:53 ` [PATCH v5 3/4] tools/bootconfig: Align the bootconfig applied initrd image size to 4 Masami Hiramatsu
2020-11-19 5:53 ` [PATCH v5 4/4] docs: bootconfig: Update file format on initrd image Masami Hiramatsu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=160576521135.320071.3883101436675969998.stgit@devnote2 \
--to=mhiramat@kernel.org \
--cc=corbet@lwn.net \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=rostedt@goodmis.org \
--cc=torvalds@linux-foundation.org \
--cc=yu.c.chen@intel.com \
--cc=yu.chen.surf@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.