On Mon, Nov 03, 2008 at 10:59:00PM +0100, Sebastian Andrzej Siewior wrote:
> From: Sebastian Andrzej Siewior <[EMAIL PROTECTED]>
> 
> 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 <[EMAIL PROTECTED]>
> ---
>  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));

Please reformat these lines so they are <= 80 columns wide.

> +     } else {
> +             size = stats.st_size;
> +     }
> +
>       *r_size = size;
>       buf = xmalloc(size);
>       progress = 0;
> -- 
> 1.6.0.2
> 
> 
> _______________________________________________
> kexec mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/kexec

-- 
Simon Horman
  VA Linux Systems Japan K.K., Sydney, Australia Satellite Office
  H: www.vergenet.net/~horms/             W: www.valinux.co.jp/en


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to