mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-26 20:37:16 +00:00
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>
This commit is contained in:
parent
16f4d9335f
commit
bd6fb31fab
2 changed files with 13 additions and 6 deletions
9
fs/fs.c
9
fs/fs.c
|
@ -75,6 +75,7 @@ static struct fstype_info fstypes[] = {
|
||||||
.close = fat_close,
|
.close = fat_close,
|
||||||
.ls = file_fat_ls,
|
.ls = file_fat_ls,
|
||||||
.read = fat_read_file,
|
.read = fat_read_file,
|
||||||
|
.write = fs_write_unsupported,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_FS_EXT4
|
#ifdef CONFIG_FS_EXT4
|
||||||
|
@ -84,6 +85,7 @@ static struct fstype_info fstypes[] = {
|
||||||
.close = ext4fs_close,
|
.close = ext4fs_close,
|
||||||
.ls = ext4fs_ls,
|
.ls = ext4fs_ls,
|
||||||
.read = ext4_read_file,
|
.read = ext4_read_file,
|
||||||
|
.write = fs_write_unsupported,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SANDBOX
|
#ifdef CONFIG_SANDBOX
|
||||||
|
@ -212,16 +214,11 @@ int fs_write(const char *filename, ulong addr, int offset, int len)
|
||||||
void *buf;
|
void *buf;
|
||||||
int ret;
|
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);
|
buf = map_sysmem(addr, len);
|
||||||
ret = info->write(filename, buf, offset, len);
|
ret = info->write(filename, buf, offset, len);
|
||||||
unmap_sysmem(buf);
|
unmap_sysmem(buf);
|
||||||
|
|
||||||
/* If we requested a specific number of bytes, check we got it */
|
if (ret >= 0 && ret != len) {
|
||||||
if (ret >= 0 && len && ret != len) {
|
|
||||||
printf("** Unable to write file %s **\n", filename);
|
printf("** Unable to write file %s **\n", filename);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
|
10
include/fs.h
10
include/fs.h
|
@ -54,6 +54,16 @@ int fs_ls(const char *dirname);
|
||||||
*/
|
*/
|
||||||
int fs_read(const char *filename, ulong addr, int offset, int len);
|
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
|
* Common implementation for various filesystem commands, optionally limited
|
||||||
* to a specific filesystem type via the fstype parameter.
|
* to a specific filesystem type via the fstype parameter.
|
||||||
|
|
Loading…
Add table
Reference in a new issue