[PATCH 1/2] erofs-utils: erofs_io.c: clean up dev_open()
Li Guifu
bluce.liguifu at huawei.com
Fri Dec 21 12:51:18 AEDT 2018
On 2018/12/19 20:40, Gao Xiang wrote:
> Signed-off-by: Gao Xiang <gaoxiang25 at huawei.com>
> ---
> erofs_io.c | 74 ++++++++++++++++++-------------------------------------------
> mkfs_main.c | 11 ++++-----
> 2 files changed, 27 insertions(+), 58 deletions(-)
>
> diff --git a/erofs_io.c b/erofs_io.c
> index 57e283e..563ca3f 100644
> --- a/erofs_io.c
> +++ b/erofs_io.c
> @@ -22,93 +22,61 @@
> #define pr_fmt(fmt) "DEVICE IO: " FUNC_LINE_FMT fmt "\n"
> #include "erofs_debug.h"
>
> -static char *erofs_devname;
> +static const char *erofs_devname;
> static int erofs_devfd = -1;
> static u64 erofs_devsz;
>
> void dev_close(void)
> {
> close(erofs_devfd);
> - free(erofs_devname);
> erofs_devname = NULL;
> erofs_devfd = -1;
> erofs_devsz = 0;
> }
>
> -int dev_open(const char *devname)
> +int dev_open(const char *dev)
> {
> - char *dev;
> struct stat st;
> - int fd;
> - int ret;
> -
> - dev = strdup(devname);
> - if (!dev)
> - return -ENOMEM;
> -again:
> - fd = open(dev, O_RDWR);
> - if (fd < 0 && errno != ENOENT) {
> - erofs_err("Open device/file(%s) fail.", dev);
> - free(dev);
> - return -errno;
> - }
> + int fd, ret;
>
> + fd = open(dev, O_RDWR | O_CREAT, 0644);
> if (fd < 0) {
> - fd = open(dev, O_RDWR | O_CREAT | O_NOCTTY,
> - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
> - if (fd < 0) {
> - if (errno != EEXIST) {
> - erofs_err("Create image file(%s) fail.", dev);
> - free(dev);
> - return -errno;
> - }
> -
> - erofs_dbg("Image file(%s) existed, it might be created by the other users.",
> - dev);
> - goto again;
> -
> - }
> + erofs_err("failed to open(%s).", dev);
> + return -errno;
> }
>
> ret = fstat(fd, &st);
> if (ret) {
> - erofs_err("Get stat of device/file(%s) fail.", dev);
> + erofs_err("failed to fstat(%s).", dev);
> close(fd);
> - free(dev);
> return -errno;
> }
>
> - if (!S_ISBLK(st.st_mode) && !S_ISREG(st.st_mode)) {
> - erofs_err("File (%s) type is wrong.", dev);
> - close(fd);
> - free(dev);
> - return -EINVAL;
> - }
> -
> - if (S_ISREG(st.st_mode)) {
> + switch(st.st_mode & S_IFMT) {
> + case S_IFBLK:
> + erofs_devsz = st.st_size;
> + break;
> + case S_IFREG:
> ret = ftruncate(fd, 0);
> if (ret) {
> - erofs_err("Truncate file(%s) fail.", dev);
> + erofs_err("failed to ftruncate(%s).", dev);
> close(fd);
> - free(dev);
> return -errno;
> }
> - }
> -
> - erofs_devname = dev;
> - erofs_devfd = fd;
> -
> - if (S_ISBLK(st.st_mode)) {
> - erofs_devsz = st.st_size;
> - } else {
> /* INT64_MAX is the limit of kernel vfs */
> erofs_devsz = INT64_MAX;
> + break;
> + default:
> + erofs_err("bad file type (%s, %o).", dev, st.st_mode);
> + close(fd);
> + return -EINVAL;
> }
>
> + erofs_devname = dev;
> + erofs_devfd = fd;
> erofs_devsz = round_down(erofs_devsz, EROFS_BLKSIZE);
>
> - erofs_info("Open device/file %s", erofs_devname);
> -
> + erofs_info("successfully to open %s", dev);
> return 0;
> }
>
> diff --git a/mkfs_main.c b/mkfs_main.c
> index 17611f4..30b0a22 100644
> --- a/mkfs_main.c
> +++ b/mkfs_main.c
> @@ -107,11 +107,6 @@ static void mkfs_parse_options_cfg(int argc, char *argv[])
> erofs_compress_alg_init(erofs_cfg.c_alg_name);
>
> mkfs_dump_config();
> -
> - if (dev_open(erofs_cfg.c_img_path) < 0) {
> - erofs_err("dev_open is failed!!!");
> - usage(argv[0]);
> - }
> }
>
> void mkfs_update_erofs_header(u64 root_addr)
> @@ -156,6 +151,12 @@ int main(int argc, char **argv)
> mkfs_init_configure();
> mkfs_parse_options_cfg(argc, argv);
>
> + err = dev_open(erofs_cfg.c_img_path);
> + if (err) {
> + usage(argv[0]);
> + return -1;
> + }
> +
> proot_node = mkfs_prepare_root_inode(erofs_cfg.c_src_path);
> if (!proot_node)
> goto exit;
Reviewed-by: Li Guifu <bluce.liguifu at huawei.com>
Thanks,
More information about the Linux-erofs
mailing list