fs: fix generic save command implementation
authorStephen Warren <swarren@nvidia.com>
Mon, 3 Feb 2014 20:20:59 +0000 (13:20 -0700)
committerTom Rini <trini@ti.com>
Wed, 19 Feb 2014 14:47:33 +0000 (09:47 -0500)
Fix a few issues with the generic "save" shell command, and fs_write()
function.

1) fstypes[].write wasn't filled in for some file-systems, and isn't
   checked when used, which could cause crashes/... if executing save
   on e.g. fat/ext filesystems.

2) fs_write() requires the length argument to be non-zero, since it needs
   to know exactly how many bytes to write. Adjust the comments and code
   according to this.

3) fs_write() wasn't prototyped in <fs.h> like other generic functions;
   other code should be able to call this directly rather than invoking
   the "save" shell command.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Simon Glass <sjg@chromium.org>
fs/fs.c
include/fs.h

diff --git a/fs/fs.c b/fs/fs.c
index be1855d1291f217b19720ae0faa45076eb0cc5ac..9c2ef6b6597ca30de8b49aeb9d5e0c1e1663d907 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -75,6 +75,7 @@ static struct fstype_info fstypes[] = {
                .close = fat_close,
                .ls = file_fat_ls,
                .read = fat_read_file,
+               .write = fs_write_unsupported,
        },
 #endif
 #ifdef CONFIG_FS_EXT4
@@ -84,6 +85,7 @@ static struct fstype_info fstypes[] = {
                .close = ext4fs_close,
                .ls = ext4fs_ls,
                .read = ext4_read_file,
+               .write = fs_write_unsupported,
        },
 #endif
 #ifdef CONFIG_SANDBOX
@@ -212,16 +214,11 @@ int fs_write(const char *filename, ulong addr, int offset, int len)
        void *buf;
        int ret;
 
-       /*
-        * We don't actually know how many bytes are being read, since len==0
-        * means read the whole file.
-        */
        buf = map_sysmem(addr, len);
        ret = info->write(filename, buf, offset, len);
        unmap_sysmem(buf);
 
-       /* If we requested a specific number of bytes, check we got it */
-       if (ret >= 0 && len && ret != len) {
+       if (ret >= 0 && ret != len) {
                printf("** Unable to write file %s **\n", filename);
                ret = -1;
        }
index 7d9403ed87588c2f254ec0a4b514fe5840eac0b9..97b0094e954b92ba0fde6606d8c534f9bcd52f55 100644 (file)
@@ -54,6 +54,16 @@ int fs_ls(const char *dirname);
  */
 int fs_read(const char *filename, ulong addr, int offset, int len);
 
+/*
+ * Write file "filename" to the partition previously set by fs_set_blk_dev(),
+ * from address "addr", starting at byte offset "offset", and writing "len"
+ * bytes. "offset" may be 0 to write to the start of the file. Note that not
+ * all filesystem types support offset!=0.
+ *
+ * Returns number of bytes read on success. Returns <= 0 on error.
+ */
+int fs_write(const char *filename, ulong addr, int offset, int len);
+
 /*
  * Common implementation for various filesystem commands, optionally limited
  * to a specific filesystem type via the fstype parameter.