From: zhaoyifan <zhaoyifa...@huawei.com>

The current `diskbuf` implementation uses `lseek` to operate file offset,
preventing multiple streams from writing to the same file. Let's replace
`write` + `lseek` with `pwrite` to enable this use pattern.

Signed-off-by: Yifan Zhao <zhaoyifa...@huawei.com>
---
 lib/diskbuf.c | 7 +------
 lib/tar.c     | 2 +-
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/lib/diskbuf.c b/lib/diskbuf.c
index 3789654..0bf42da 100644
--- a/lib/diskbuf.c
+++ b/lib/diskbuf.c
@@ -36,9 +36,6 @@ int erofs_diskbuf_reserve(struct erofs_diskbuf *db, int sid, 
u64 *off)
 
        if (strm->tailoffset & (strm->alignsize - 1)) {
                strm->tailoffset = round_up(strm->tailoffset, strm->alignsize);
-               if (lseek(strm->fd, strm->tailoffset + strm->devpos,
-                         SEEK_SET) != strm->tailoffset + strm->devpos)
-                       return -EIO;
        }
        db->offset = strm->tailoffset;
        if (off)
@@ -108,9 +105,6 @@ int erofs_diskbuf_init(unsigned int nstrms)
                        strm->devpos = 1ULL << 40;
                        if (!ftruncate(g_sbi.bdev.fd, strm->devpos << 1)) {
                                strm->fd = dup(g_sbi.bdev.fd);
-                               if (lseek(strm->fd, strm->devpos,
-                                         SEEK_SET) != strm->devpos)
-                                       return -EIO;
                                goto setupone;
                        }
                }
@@ -141,4 +135,5 @@ void erofs_diskbuf_exit(void)
                close(strm->fd);
                strm->fd = -1;
        }
+       free(dbufstrm);
 }
diff --git a/lib/tar.c b/lib/tar.c
index 8d068cb..44714e0 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -675,7 +675,7 @@ static int tarerofs_write_file_data(struct erofs_inode 
*inode,
                nread = erofs_iostream_read(&tar->ios, &buf, j);
                if (nread < 0)
                        break;
-               if (write(fd, buf, nread) != nread) {
+               if (pwrite(fd, buf, nread, off) != nread) {
                        nread = -EIO;
                        break;
                }
-- 
2.46.0


Reply via email to