summaryrefslogtreecommitdiff
path: root/fs/fs.c
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2014-02-03 13:20:59 -0700
committerTom Rini <trini@ti.com>2014-02-19 09:47:33 -0500
commitbd6fb31fab1523ecac1aaf7af574868a26169dc6 (patch)
tree00a06ba1a3cc5409caf3e45f188528809fe86337 /fs/fs.c
parent16f4d9335fe18cf3b57e400baf7687f1c390fd8c (diff)
downloadu-boot-bd6fb31fab1523ecac1aaf7af574868a26169dc6.tar.gz
u-boot-bd6fb31fab1523ecac1aaf7af574868a26169dc6.tar.bz2
u-boot-bd6fb31fab1523ecac1aaf7af574868a26169dc6.zip
fs: fix generic save command implementation
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>
Diffstat (limited to 'fs/fs.c')
-rw-r--r--fs/fs.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/fs/fs.c b/fs/fs.c
index be1855d129..9c2ef6b659 100644
--- 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;
}