.. Avoid erofs_dev_write() and use the bdev virtual file instead.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/internal.h |  3 +-
 lib/blobchunk.c          |  6 ++--
 lib/inode.c              | 67 +++++++++++++++++++---------------------
 lib/super.c              |  1 -
 4 files changed, 35 insertions(+), 42 deletions(-)

diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index b5df8a48..65d40840 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -95,7 +95,6 @@ struct erofs_sb_info {
        u32 feature_compat;
        u32 feature_incompat;
 
-       unsigned char islotbits;
        unsigned char blkszbits;
 
        u32 sb_size;                    /* total superblock size */
@@ -293,7 +292,7 @@ static inline erofs_off_t erofs_iloc(struct erofs_inode 
*inode)
        struct erofs_sb_info *sbi = inode->sbi;
 
        return erofs_pos(sbi, sbi->meta_blkaddr) +
-                       (inode->nid << sbi->islotbits);
+                       (inode->nid << EROFS_ISLOTBITS);
 }
 
 static inline bool is_inode_layout_compression(struct erofs_inode *inode)
diff --git a/lib/blobchunk.c b/lib/blobchunk.c
index 3388ce0d..bbc69cfb 100644
--- a/lib/blobchunk.c
+++ b/lib/blobchunk.c
@@ -193,7 +193,6 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode 
*inode,
                else
                        memcpy(inode->chunkindexes + dst, &idx, sizeof(idx));
        }
-       off = roundup(off, unit);
        if (extent_start != EROFS_NULL_ADDR) {
                extent_end = min(extent_end, extent_start + remaining_blks);
                zeroedlen = inode->i_size & (erofs_blksiz(sbi) - 1);
@@ -202,8 +201,9 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode 
*inode,
                tarerofs_blocklist_write(extent_start, extent_end - 
extent_start,
                                         source_offset, zeroedlen);
        }
-       return erofs_dev_write(inode->sbi, inode->chunkindexes, off,
-                              inode->extent_isize);
+       off = roundup(off, unit);
+       return erofs_io_pwrite(&sbi->bdev, inode->chunkindexes,
+                              off, inode->extent_isize);
 }
 
 int erofs_blob_mergechunks(struct erofs_inode *inode, unsigned int chunkbits,
diff --git a/lib/inode.c b/lib/inode.c
index 4f6715af..f7c6b87f 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -609,22 +609,23 @@ int erofs_write_unencoded_file(struct erofs_inode *inode, 
int fd, u64 fpos)
 
 int erofs_iflush(struct erofs_inode *inode)
 {
-       const u16 icount = EROFS_INODE_XATTR_ICOUNT(inode->xattr_isize);
+       u16 icount = EROFS_INODE_XATTR_ICOUNT(inode->xattr_isize);
        struct erofs_sb_info *sbi = inode->sbi;
-       erofs_off_t off;
+       struct erofs_buffer_head *bh = inode->bh;
+       erofs_off_t off = erofs_iloc(inode);
        union {
                struct erofs_inode_compact dic;
                struct erofs_inode_extended die;
        } u = {};
        union erofs_inode_i_u u1;
        union erofs_inode_i_nb nb;
+       unsigned int iovcnt = 0;
+       struct iovec iov[2];
+       char *xattrs = NULL;
        bool nlink_1 = true;
        int ret, fmt;
 
-       if (inode->bh)
-               off = erofs_btell(inode->bh, false);
-       else
-               off = erofs_iloc(inode);
+       DBG_BUGON(bh && erofs_btell(bh, false) != off);
 
        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
            S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode))
@@ -702,41 +703,41 @@ int erofs_iflush(struct erofs_inode *inode)
        default:
                erofs_err("unsupported on-disk inode version of nid %llu",
                          (unsigned long long)inode->nid);
-               BUG_ON(1);
+               DBG_BUGON(1);
+               return -EOPNOTSUPP;
        }
 
-       ret = erofs_dev_write(sbi, &u, off, inode->inode_isize);
-       if (ret)
-               return ret;
-       off += inode->inode_isize;
-
+       iov[iovcnt++] = (struct iovec){ .iov_base = &u,
+                                       .iov_len = inode->inode_isize };
        if (inode->xattr_isize) {
-               char *xattrs = erofs_export_xattr_ibody(inode);
-
+               xattrs = erofs_export_xattr_ibody(inode);
                if (IS_ERR(xattrs))
                        return PTR_ERR(xattrs);
-
-               ret = erofs_dev_write(sbi, xattrs, off, inode->xattr_isize);
-               free(xattrs);
-               if (ret)
-                       return ret;
-
-               off += inode->xattr_isize;
+               iov[iovcnt++] = (struct iovec){ .iov_base = xattrs,
+                                               .iov_len = inode->xattr_isize };
        }
 
+       ret = erofs_io_pwritev(&sbi->bdev, iov, iovcnt, off);
+       free(xattrs);
+       if (ret != inode->inode_isize + inode->xattr_isize)
+               return ret < 0 ? ret : -EIO;
+
+       off += ret;
        if (inode->extent_isize) {
                if (inode->datalayout == EROFS_INODE_CHUNK_BASED) {
                        ret = erofs_blob_write_chunk_indexes(inode, off);
-                       if (ret)
-                               return ret;
-               } else {
-                       /* write compression metadata */
+               } else {        /* write compression metadata */
                        off = roundup(off, 8);
-                       ret = erofs_dev_write(sbi, inode->compressmeta, off,
-                                             inode->extent_isize);
-                       if (ret)
-                               return ret;
+                       ret = erofs_io_pwrite(&sbi->bdev, inode->compressmeta,
+                                             off, inode->extent_isize);
                }
+               if (ret != inode->extent_isize)
+                       return ret < 0 ? ret : -EIO;
+       }
+       if (bh) {
+               inode->bh = NULL;
+               erofs_iput(inode);
+               return erofs_bh_flush_generic_end(bh);
        }
        return 0;
 }
@@ -744,15 +745,9 @@ int erofs_iflush(struct erofs_inode *inode)
 static int erofs_bh_flush_write_inode(struct erofs_buffer_head *bh)
 {
        struct erofs_inode *inode = bh->fsprivate;
-       int ret;
 
        DBG_BUGON(inode->bh != bh);
-       ret = erofs_iflush(inode);
-       if (ret)
-               return ret;
-       inode->bh = NULL;
-       erofs_iput(inode);
-       return erofs_bh_flush_generic_end(bh);
+       return erofs_iflush(inode);
 }
 
 static struct erofs_bhops erofs_write_inode_bhops = {
diff --git a/lib/super.c b/lib/super.c
index 0533a7c8..e5364d27 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -114,7 +114,6 @@ int erofs_read_superblock(struct erofs_sb_info *sbi)
        sbi->xattr_blkaddr = le32_to_cpu(dsb->xattr_blkaddr);
        sbi->xattr_prefix_start = le32_to_cpu(dsb->xattr_prefix_start);
        sbi->xattr_prefix_count = dsb->xattr_prefix_count;
-       sbi->islotbits = EROFS_ISLOTBITS;
        if (erofs_sb_has_48bit(sbi) && dsb->rootnid_8b) {
                sbi->root_nid = le64_to_cpu(dsb->rootnid_8b);
                sbi->primarydevice_blocks = (sbi->primarydevice_blocks << 32) |
-- 
2.43.5


Reply via email to