On 2018/12/19 20:40, Gao Xiang wrote: > Signed-off-by: Gao Xiang <gaoxian...@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.ligu...@huawei.com> Thanks,