e55ef91f9d
- use _smp_mflags
91 lines
2.8 KiB
Diff
91 lines
2.8 KiB
Diff
From df7441a7de1a5702c4deed9195c24c8803b7508c Mon Sep 17 00:00:00 2001
|
|
From: Stephen Warren <swarren@nvidia.com>
|
|
Date: Thu, 23 Jan 2014 12:56:56 -0700
|
|
Subject: [PATCH 05/13] 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.
|
|
|
|
Cc: Simon Glass <sjg@chromium.org>
|
|
Signed-off-by: Stephen Warren <swarren@nvidia.com>
|
|
Acked-by: Simon Glass <sjg@chromium.org>
|
|
---
|
|
fs/fs.c | 9 +++------
|
|
include/fs.h | 10 ++++++++++
|
|
2 files changed, 13 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/fs/fs.c b/fs/fs.c
|
|
index be1855d..9c2ef6b 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;
|
|
}
|
|
diff --git a/include/fs.h b/include/fs.h
|
|
index 7d9403e..97b0094 100644
|
|
--- a/include/fs.h
|
|
+++ b/include/fs.h
|
|
@@ -55,6 +55,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.
|
|
*/
|
|
--
|
|
1.8.5.3
|
|
|