
On 07/20/2018 04:57 AM, AKASHI Takahiro wrote:
"mkdir" interface is added to file operations. This is a preparatory change as mkdir support for FAT file system will be added in next patch.
Signed-off-by: AKASHI Takahiro takahiro.akashi@linaro.org
fs/fs.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ include/fs.h | 10 ++++++++++ 2 files changed, 55 insertions(+)
diff --git a/fs/fs.c b/fs/fs.c index 33808d549e..3cb6b21fe9 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -105,6 +105,11 @@ static inline int fs_opendir_unsupported(const char *filename, return -EACCES; }
+static inline int fs_mkdir_unsupported(const char *dirname) +{
- return -1;
+}
struct fstype_info { int fstype; char *name; @@ -142,6 +147,7 @@ struct fstype_info { int (*readdir)(struct fs_dir_stream *dirs, struct fs_dirent **dentp); /* see fs_closedir() */ void (*closedir)(struct fs_dir_stream *dirs);
- int (*mkdir)(const char *dirname);
};
static struct fstype_info fstypes[] = { @@ -165,6 +171,7 @@ static struct fstype_info fstypes[] = { .opendir = fat_opendir, .readdir = fat_readdir, .closedir = fat_closedir,
.mkdir = fs_mkdir_unsupported,
Why should we create a dummy function? Just use NULL as an indicator that the interface method is not implemented. See the use of structures for the driver model.
@Simon The array fstypes[] should be replaced by a linker list to match the driver model.
}, #endif #ifdef CONFIG_FS_EXT4 @@ -185,6 +192,7 @@ static struct fstype_info fstypes[] = { #endif .uuid = ext4fs_uuid, .opendir = fs_opendir_unsupported,
},.mkdir = fs_mkdir_unsupported,
#endif #ifdef CONFIG_SANDBOX @@ -201,6 +209,7 @@ static struct fstype_info fstypes[] = { .write = fs_write_sandbox, .uuid = fs_uuid_unsupported, .opendir = fs_opendir_unsupported,
},.mkdir = fs_mkdir_unsupported,
#endif #ifdef CONFIG_CMD_UBIFS @@ -217,6 +226,7 @@ static struct fstype_info fstypes[] = { .write = fs_write_unsupported, .uuid = fs_uuid_unsupported, .opendir = fs_opendir_unsupported,
},.mkdir = fs_mkdir_unsupported,
#endif #ifdef CONFIG_FS_BTRFS @@ -233,6 +243,7 @@ static struct fstype_info fstypes[] = { .write = fs_write_unsupported, .uuid = btrfs_uuid, .opendir = fs_opendir_unsupported,
},.mkdir = fs_mkdir_unsupported,
#endif { @@ -248,6 +259,7 @@ static struct fstype_info fstypes[] = { .write = fs_write_unsupported, .uuid = fs_uuid_unsupported, .opendir = fs_opendir_unsupported,
},.mkdir = fs_mkdir_unsupported,
};
@@ -498,6 +510,20 @@ void fs_closedir(struct fs_dir_stream *dirs) }
+int fs_mkdir(const char *dirname) +{
- int ret;
- struct fstype_info *info = fs_get_info(fs_type);
- ret = info->mkdir(dirname);
Please, check if mkdir is NULL before calling.
- fs_type = FS_TYPE_ANY;
- fs_close();
What do you want to close here if mkdir() is not implemented by the file system?
Best regards
Heinrich
- return ret;
+}
int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int fstype) { @@ -700,3 +726,22 @@ int do_fs_type(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return CMD_RET_SUCCESS; }
+int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype)
+{
- int ret;
- if (argc != 4)
return CMD_RET_USAGE;
- if (fs_set_blk_dev(argv[1], argv[2], fstype))
return 1;
- ret = fs_mkdir(argv[3]);
- if (ret) {
printf("** Unable to create a directory \"%s\" **\n", argv[3]);
return 1;
- }
- return 0;
+} diff --git a/include/fs.h b/include/fs.h index 163da103b4..fbaee154dd 100644 --- a/include/fs.h +++ b/include/fs.h @@ -155,6 +155,14 @@ struct fs_dirent *fs_readdir(struct fs_dir_stream *dirs); */ void fs_closedir(struct fs_dir_stream *dirs);
+/*
- fs_mkdir - Create a directory
- @filename: Name of directory to create
- @return 0 on success, -1 on error conditions
- */
+int fs_mkdir(const char *filename);
/*
- Common implementation for various filesystem commands, optionally limited
- to a specific filesystem type via the fstype parameter.
@@ -169,6 +177,8 @@ int file_exists(const char *dev_type, const char *dev_part, const char *file, int fstype); int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int fstype); +int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype);
/*
- Determine the UUID of the specified filesystem and print it. Optionally it is