erofs-utils: clean up erofs_write_file()

Introduce write_uncompressed_file_from_fd() to make
error handling path in erofs_write_file() clearer.

Link: https://lore.kernel.org/r/20191219181901.GA9405@hsiangkao-HP-ZHAN-66-Pro-G1
Signed-off-by: Li Guifu <blucerlee@gmail.com>
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
diff --git a/lib/inode.c b/lib/inode.c
index 0e19b11..bd0652b 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -302,9 +302,52 @@
 	return true;
 }
 
+static int write_uncompressed_file_from_fd(struct erofs_inode *inode, int fd)
+{
+	int ret;
+	unsigned int nblocks, i;
+
+	inode->datalayout = EROFS_INODE_FLAT_INLINE;
+	nblocks = inode->i_size / EROFS_BLKSIZ;
+
+	ret = __allocate_inode_bh_data(inode, nblocks);
+	if (ret)
+		return ret;
+
+	for (i = 0; i < nblocks; ++i) {
+		char buf[EROFS_BLKSIZ];
+
+		ret = read(fd, buf, EROFS_BLKSIZ);
+		if (ret != EROFS_BLKSIZ) {
+			if (ret < 0)
+				return -errno;
+			return -EAGAIN;
+		}
+
+		ret = blk_write(buf, inode->u.i_blkaddr + i, 1);
+		if (ret)
+			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)
+			return -ENOMEM;
+
+		ret = read(fd, inode->idata, inode->idata_size);
+		if (ret < inode->idata_size) {
+			free(inode->idata);
+			inode->idata = NULL;
+			return -EIO;
+		}
+	}
+	return 0;
+}
+
 int erofs_write_file(struct erofs_inode *inode)
 {
-	unsigned int nblocks, i;
 	int ret, fd;
 
 	if (!inode->i_size) {
@@ -320,54 +363,11 @@
 	}
 
 	/* fallback to all data uncompressed */
-	inode->datalayout = EROFS_INODE_FLAT_INLINE;
-	nblocks = inode->i_size / EROFS_BLKSIZ;
-
-	ret = __allocate_inode_bh_data(inode, nblocks);
-	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 -EAGAIN;
-		}
-
-		ret = blk_write(buf, inode->u.i_blkaddr + i, 1);
-		if (ret)
-			goto fail;
-	}
-
-	/* 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);
-			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;
+	ret = write_uncompressed_file_from_fd(inode, fd);
 	close(fd);
 	return ret;
 }