[PATCH 1/4] slurpfile: use lseek() on character nodes instead of fstat() for file size
Sebastian Andrzej Siewior
sebastian at breakpoint.cc
Mon Nov 3 16:59:00 EST 2008
From: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
fstat() is used to determine the filesize before read() and
it requires a filesystem. That it means it can not be used
on character nodes. This makes it impossible to obtains the
kernel from a char node like mtd or more likely ubi.
We can't use this in every case because files in /proc don't
support lseek(). This is required by the powerpc part to read
some device-tree entries.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
---
kexec/kexec.c | 22 ++++++++++++++++++++--
1 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/kexec/kexec.c b/kexec/kexec.c
index 0616091..3c3f73e 100644
--- a/kexec/kexec.c
+++ b/kexec/kexec.c
@@ -467,7 +467,7 @@ char *slurp_file(const char *filename, off_t *r_size)
{
int fd;
char *buf;
- off_t size, progress;
+ off_t size, progress, err;
ssize_t result;
struct stat stats;
@@ -486,7 +486,25 @@ char *slurp_file(const char *filename, off_t *r_size)
die("Cannot stat: %s: %s\n",
filename, strerror(errno));
}
- size = stats.st_size;
+ /*
+ * Seek in case the kernel is a character node like /dev/ubi0_0.
+ * This does not work on regular files which live in /proc and
+ * we need this for some /proc/device-tree entries
+ */
+ if (S_ISCHR(stats.st_mode)) {
+
+ size = lseek(fd, 0, SEEK_END);
+ if (size < 0)
+ die("Can not seek file %s: %s\n", filename, strerror(errno));
+
+ err = lseek(fd, 0, SEEK_SET);
+ if (err < 0)
+ die("Can not seek to the begin of file %s: %s\n", filename,
+ strerror(errno));
+ } else {
+ size = stats.st_size;
+ }
+
*r_size = size;
buf = xmalloc(size);
progress = 0;
--
1.6.0.2
More information about the kexec
mailing list