summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Grzeschik <m.grzeschik@pengutronix.de>2017-11-08 19:07:47 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-11-10 08:01:18 +0100
commit7c3f8d3663cbee7e406bf949a263ce82f6b34ae8 (patch)
tree22cc0d8430ddf99d4e76a4ad9678d96813b6e377
parented5d71ab06bf45e585f9d03049f4730109979aff (diff)
downloadbarebox-7c3f8d3663cbee7e406bf949a263ce82f6b34ae8.tar.gz
barebox-7c3f8d3663cbee7e406bf949a263ce82f6b34ae8.tar.xz
uimage: fix: add can_lseek_backward and use in uimage_open
Since commit ce0cc7fe we support forward seek on tftpfs. This feature breaks the condition to check rather we open an uimage over tftp. Since backward seeking is the problem here, we add the function can_lseek_backward and check for it instead of the simple lseek. Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--common/uimage.c4
-rw-r--r--fs/uimagefs.c4
-rw-r--r--include/fs.h20
3 files changed, 24 insertions, 4 deletions
diff --git a/common/uimage.c b/common/uimage.c
index 28a25bba2d..b6f0f109ca 100644
--- a/common/uimage.c
+++ b/common/uimage.c
@@ -111,9 +111,9 @@ again:
/*
* Hack around tftp fs. We need lseek for uImage support, but
* this cannot be implemented in tftp fs, so we detect this
- * by doing a test lseek and copy the file to ram if it fails
+ * and copy the file to ram if it fails
*/
- if (IS_BUILTIN(CONFIG_FS_TFTP) && lseek(fd, 0, SEEK_SET)) {
+ if (IS_BUILTIN(CONFIG_FS_TFTP) && !can_lseek_backward(fd)) {
close(fd);
ret = copy_file(filename, uimage_tmp, 0);
if (ret)
diff --git a/fs/uimagefs.c b/fs/uimagefs.c
index 13c1fbac05..c0c5750c2c 100644
--- a/fs/uimagefs.c
+++ b/fs/uimagefs.c
@@ -374,9 +374,9 @@ again:
/*
* Hack around tftp fs. We need lseek for uImage support, but
* this cannot be implemented in tftp fs, so we detect this
- * by doing a test lseek and copy the file to ram if it fails
+ * and copy the file to ram if it fails
*/
- if (IS_BUILTIN(CONFIG_FS_TFTP) && lseek(fd, 0, SEEK_SET)) {
+ if (IS_BUILTIN(CONFIG_FS_TFTP) && !can_lseek_backward(fd)) {
close(fd);
ret = copy_file(priv->filename, priv->tmp, 0);
if (ret)
diff --git a/include/fs.h b/include/fs.h
index d7fa7714b4..f8a3b8bda4 100644
--- a/include/fs.h
+++ b/include/fs.h
@@ -100,6 +100,26 @@ struct fs_device_d {
char *linux_rootarg;
};
+/*
+ * Some filesystems i.e. tftpfs only support lseek into one direction.
+ * To detect this limited functionality we add this extra function.
+ * Additionaly we also return 0 if we even can not seek forward.
+ */
+static inline int can_lseek_backward(int fd)
+{
+ int ret;
+
+ ret = lseek(fd, 1, SEEK_SET);
+ if (ret < 0)
+ return 0;
+
+ ret = lseek(fd, 0, SEEK_SET);
+ if (ret < 0)
+ return 0;
+
+ return ret;
+}
+
#define drv_to_fs_driver(d) container_of(d, struct fs_driver_d, drv)
int flush(int fd);