diff options
Diffstat (limited to 'lib/inode.c')
-rw-r--r-- | lib/inode.c | 58 |
1 files changed, 29 insertions, 29 deletions
diff --git a/lib/inode.c b/lib/inode.c index 0e19b11..bd0652b 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -302,24 +302,11 @@ static bool erofs_file_is_compressible(struct erofs_inode *inode) return true; } -int erofs_write_file(struct erofs_inode *inode) +static int write_uncompressed_file_from_fd(struct erofs_inode *inode, int fd) { + int ret; unsigned int nblocks, i; - int ret, fd; - if (!inode->i_size) { - inode->datalayout = EROFS_INODE_FLAT_PLAIN; - return 0; - } - - if (cfg.c_compr_alg_master && erofs_file_is_compressible(inode)) { - ret = erofs_write_compressed_file(inode); - - if (!ret || ret != -ENOSPC) - return ret; - } - - /* fallback to all data uncompressed */ inode->datalayout = EROFS_INODE_FLAT_INLINE; nblocks = inode->i_size / EROFS_BLKSIZ; @@ -327,47 +314,60 @@ int erofs_write_file(struct erofs_inode *inode) if (ret) return ret; - fd = open(inode->i_srcpath, O_RDONLY | O_BINARY); - if (fd < 0) - return -errno; - for (i = 0; i < nblocks; ++i) { char buf[EROFS_BLKSIZ]; ret = read(fd, buf, EROFS_BLKSIZ); if (ret != EROFS_BLKSIZ) { if (ret < 0) - goto fail; - close(fd); + return -errno; return -EAGAIN; } ret = blk_write(buf, inode->u.i_blkaddr + i, 1); if (ret) - goto fail; + return ret; } /* read the tail-end data */ inode->idata_size = inode->i_size % EROFS_BLKSIZ; if (inode->idata_size) { inode->idata = malloc(inode->idata_size); - if (!inode->idata) { - close(fd); + if (!inode->idata) return -ENOMEM; - } ret = read(fd, inode->idata, inode->idata_size); if (ret < inode->idata_size) { free(inode->idata); inode->idata = NULL; - close(fd); return -EIO; } } - close(fd); return 0; -fail: - ret = -errno; +} + +int erofs_write_file(struct erofs_inode *inode) +{ + int ret, fd; + + if (!inode->i_size) { + inode->datalayout = EROFS_INODE_FLAT_PLAIN; + return 0; + } + + if (cfg.c_compr_alg_master && erofs_file_is_compressible(inode)) { + ret = erofs_write_compressed_file(inode); + + if (!ret || ret != -ENOSPC) + return ret; + } + + /* fallback to all data uncompressed */ + fd = open(inode->i_srcpath, O_RDONLY | O_BINARY); + if (fd < 0) + return -errno; + + ret = write_uncompressed_file_from_fd(inode, fd); close(fd); return ret; } |