fs: add unlink interface

"unlink" interface is added to file operations.
This is a preparatory change as unlink support for FAT file system
will be added in next patch.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
AKASHI Takahiro 2018-09-11 15:59:13 +09:00 committed by Alexander Graf
parent 5bc84a1303
commit e2519daf5c
2 changed files with 52 additions and 0 deletions

40
fs/fs.c
View file

@ -105,6 +105,11 @@ static inline int fs_opendir_unsupported(const char *filename,
return -EACCES; return -EACCES;
} }
static inline int fs_unlink_unsupported(const char *filename)
{
return -1;
}
static inline int fs_mkdir_unsupported(const char *dirname) static inline int fs_mkdir_unsupported(const char *dirname)
{ {
return -1; return -1;
@ -147,6 +152,7 @@ struct fstype_info {
int (*readdir)(struct fs_dir_stream *dirs, struct fs_dirent **dentp); int (*readdir)(struct fs_dir_stream *dirs, struct fs_dirent **dentp);
/* see fs_closedir() */ /* see fs_closedir() */
void (*closedir)(struct fs_dir_stream *dirs); void (*closedir)(struct fs_dir_stream *dirs);
int (*unlink)(const char *filename);
int (*mkdir)(const char *dirname); int (*mkdir)(const char *dirname);
}; };
@ -173,6 +179,7 @@ static struct fstype_info fstypes[] = {
.opendir = fat_opendir, .opendir = fat_opendir,
.readdir = fat_readdir, .readdir = fat_readdir,
.closedir = fat_closedir, .closedir = fat_closedir,
.unlink = fs_unlink_unsupported,
}, },
#endif #endif
#ifdef CONFIG_FS_EXT4 #ifdef CONFIG_FS_EXT4
@ -193,6 +200,7 @@ static struct fstype_info fstypes[] = {
#endif #endif
.uuid = ext4fs_uuid, .uuid = ext4fs_uuid,
.opendir = fs_opendir_unsupported, .opendir = fs_opendir_unsupported,
.unlink = fs_unlink_unsupported,
.mkdir = fs_mkdir_unsupported, .mkdir = fs_mkdir_unsupported,
}, },
#endif #endif
@ -210,6 +218,7 @@ static struct fstype_info fstypes[] = {
.write = fs_write_sandbox, .write = fs_write_sandbox,
.uuid = fs_uuid_unsupported, .uuid = fs_uuid_unsupported,
.opendir = fs_opendir_unsupported, .opendir = fs_opendir_unsupported,
.unlink = fs_unlink_unsupported,
.mkdir = fs_mkdir_unsupported, .mkdir = fs_mkdir_unsupported,
}, },
#endif #endif
@ -227,6 +236,7 @@ static struct fstype_info fstypes[] = {
.write = fs_write_unsupported, .write = fs_write_unsupported,
.uuid = fs_uuid_unsupported, .uuid = fs_uuid_unsupported,
.opendir = fs_opendir_unsupported, .opendir = fs_opendir_unsupported,
.unlink = fs_unlink_unsupported,
.mkdir = fs_mkdir_unsupported, .mkdir = fs_mkdir_unsupported,
}, },
#endif #endif
@ -244,6 +254,7 @@ static struct fstype_info fstypes[] = {
.write = fs_write_unsupported, .write = fs_write_unsupported,
.uuid = btrfs_uuid, .uuid = btrfs_uuid,
.opendir = fs_opendir_unsupported, .opendir = fs_opendir_unsupported,
.unlink = fs_unlink_unsupported,
.mkdir = fs_mkdir_unsupported, .mkdir = fs_mkdir_unsupported,
}, },
#endif #endif
@ -260,6 +271,7 @@ static struct fstype_info fstypes[] = {
.write = fs_write_unsupported, .write = fs_write_unsupported,
.uuid = fs_uuid_unsupported, .uuid = fs_uuid_unsupported,
.opendir = fs_opendir_unsupported, .opendir = fs_opendir_unsupported,
.unlink = fs_unlink_unsupported,
.mkdir = fs_mkdir_unsupported, .mkdir = fs_mkdir_unsupported,
}, },
}; };
@ -510,6 +522,19 @@ void fs_closedir(struct fs_dir_stream *dirs)
fs_close(); fs_close();
} }
int fs_unlink(const char *filename)
{
int ret;
struct fstype_info *info = fs_get_info(fs_type);
ret = info->unlink(filename);
fs_type = FS_TYPE_ANY;
fs_close();
return ret;
}
int fs_mkdir(const char *dirname) int fs_mkdir(const char *dirname)
{ {
@ -727,6 +752,21 @@ int do_fs_type(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return CMD_RET_SUCCESS; return CMD_RET_SUCCESS;
} }
int do_rm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype)
{
if (argc != 4)
return CMD_RET_USAGE;
if (fs_set_blk_dev(argv[1], argv[2], fstype))
return 1;
if (fs_unlink(argv[3]))
return 1;
return 0;
}
int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype) int fstype)
{ {

View file

@ -155,6 +155,16 @@ struct fs_dirent *fs_readdir(struct fs_dir_stream *dirs);
*/ */
void fs_closedir(struct fs_dir_stream *dirs); void fs_closedir(struct fs_dir_stream *dirs);
/*
* fs_unlink - delete a file or directory
*
* If a given name is a directory, it will be deleted only if it's empty
*
* @filename: Name of file or directory to delete
* @return 0 on success, -1 on error conditions
*/
int fs_unlink(const char *filename);
/* /*
* fs_mkdir - Create a directory * fs_mkdir - Create a directory
* *
@ -177,6 +187,8 @@ int file_exists(const char *dev_type, const char *dev_part, const char *file,
int fstype); int fstype);
int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype); int fstype);
int do_rm(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 do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
int fstype); int fstype);