Since virtual files may have their own `.close()`. Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- include/erofs/io.h | 3 +++ lib/io.c | 11 +++++++++-- lib/metabox.c | 2 +- lib/tar.c | 2 +- mount/main.c | 24 ++++++++++++------------ 5 files changed, 26 insertions(+), 16 deletions(-)
diff --git a/include/erofs/io.h b/include/erofs/io.h index 370765f..a9f6d2e 100644 --- a/include/erofs/io.h +++ b/include/erofs/io.h @@ -41,6 +41,7 @@ struct erofs_vfops { off_t *pos, size_t count); int (*xcopy)(struct erofs_vfile *vout, off_t pos, struct erofs_vfile *vin, unsigned int len, bool noseek); + void (*close)(struct erofs_vfile *vf); }; /* don't extend this; instead, use payload for any extra information */ @@ -87,6 +88,8 @@ static inline int erofs_pread(struct erofs_vfile *vf, void *buf, return read != len ? -EIO : 0; } +void erofs_io_close(struct erofs_vfile *vf); + #ifdef __cplusplus } #endif diff --git a/lib/io.c b/lib/io.c index ff3b794..629af9c 100644 --- a/lib/io.c +++ b/lib/io.c @@ -380,8 +380,7 @@ out: void erofs_dev_close(struct erofs_sb_info *sbi) { - if (!sbi->bdev.ops) - close(sbi->bdev.fd); + erofs_io_close(&sbi->bdev); free(sbi->devname); sbi->devname = NULL; sbi->bdev.fd = -1; @@ -657,3 +656,11 @@ int erofs_io_xcopy(struct erofs_vfile *vout, off_t pos, } while (len); return 0; } + +void erofs_io_close(struct erofs_vfile *vf) +{ + if (vf->ops) + return vf->ops->close(vf); + close(vf->fd); + vf->fd = -1; +} diff --git a/lib/metabox.c b/lib/metabox.c index fdc46eb..abde5e6 100644 --- a/lib/metabox.c +++ b/lib/metabox.c @@ -21,7 +21,7 @@ void erofs_metabox_exit(struct erofs_sb_info *sbi) return; DBG_BUGON(!m2gr->bmgr); erofs_buffer_exit(m2gr->bmgr); - close(m2gr->vf.fd); + erofs_io_close(&m2gr->vf); free(m2gr); } diff --git a/lib/tar.c b/lib/tar.c index fe801e2..c8fd48e 100644 --- a/lib/tar.c +++ b/lib/tar.c @@ -65,7 +65,7 @@ void erofs_iostream_close(struct erofs_iostream *ios) #endif return; } - close(ios->vf.fd); + erofs_io_close(&ios->vf); } int erofs_iostream_open(struct erofs_iostream *ios, int fd, int decoder) diff --git a/mount/main.c b/mount/main.c index a270f0a..149bb53 100644 --- a/mount/main.c +++ b/mount/main.c @@ -267,8 +267,8 @@ static void *erofsmount_nbd_loopfn(void *arg) break; } } - close(ctx->vd.fd); - close(ctx->sk.fd); + erofs_io_close(&ctx->vd); + erofs_io_close(&ctx->sk); return (void *)(uintptr_t)err; } @@ -288,15 +288,15 @@ static int erofsmount_startnbd(int nbdfd, const char *source) err = erofs_nbd_connect(nbdfd, 9, INT64_MAX >> 9); if (err < 0) { - close(ctx.vd.fd); + erofs_io_close(&ctx.vd); goto out_closefd; } ctx.sk.fd = err; err = -pthread_create(&th, NULL, erofsmount_nbd_loopfn, &ctx); if (err) { - close(ctx.vd.fd); - close(ctx.sk.fd); + erofs_io_close(&ctx.vd); + erofs_io_close(&ctx.sk); goto out_closefd; } @@ -392,7 +392,7 @@ static int erofsmount_startnbd_nl(pid_t *pid, const char *source) err = pipe(pipefd); if (err < 0) { err = -errno; - close(ctx.vd.fd); + erofs_io_close(&ctx.vd); return err; } if ((*pid = fork()) == 0) { @@ -400,12 +400,12 @@ static int erofsmount_startnbd_nl(pid_t *pid, const char *source) /* Otherwise, NBD disconnect sends SIGPIPE, skipping cleanup */ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { - close(ctx.vd.fd); + erofs_io_close(&ctx.vd); exit(EXIT_FAILURE); } recp = erofsmount_write_recovery_info(source); if (IS_ERR(recp)) { - close(ctx.vd.fd); + erofs_io_close(&ctx.vd); exit(EXIT_FAILURE); } num = -1; @@ -414,7 +414,7 @@ static int erofsmount_startnbd_nl(pid_t *pid, const char *source) ctx.sk.fd = err; err = erofsmount_nbd_fix_backend_linkage(num, &recp); if (err) { - close(ctx.sk.fd); + erofs_io_close(&ctx.sk); } else { err = write(pipefd[1], &num, sizeof(int)); if (err < 0) @@ -427,7 +427,7 @@ static int erofsmount_startnbd_nl(pid_t *pid, const char *source) } } } - close(ctx.vd.fd); + erofs_io_close(&ctx.vd); out_fork: (void)unlink(recp); free(recp); @@ -529,10 +529,10 @@ static int erofsmount_reattach(const char *target) return EXIT_FAILURE; return EXIT_SUCCESS; } - close(ctx.sk.fd); + erofs_io_close(&ctx.sk); err = 0; } - close(ctx.vd.fd); + erofs_io_close(&ctx.vd); err_line: free(line); err_identifier: -- 2.43.5