[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT VFS PATCH 1/3] Fix dentry referecing and file closing
Increase the refcount of the dentry when opening a file Decrease the refcount of the dentry and free the file on closing Make fdrop return 0 if the file's refcount hit 0 or 1 otherwise. This is the OSv behaviour and the return of an error from fdrop is never checked. Signed-off-by: Mihai Pogonaru <pogonarumihai@xxxxxxxxx> --- lib/vfscore/file.c | 18 ++++++++++++++---- lib/vfscore/fops.c | 7 ++++--- lib/vfscore/syscalls.c | 3 +++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/vfscore/file.c b/lib/vfscore/file.c index e56f16dc..e7627e96 100644 --- a/lib/vfscore/file.c +++ b/lib/vfscore/file.c @@ -42,15 +42,25 @@ int fdrop(struct vfscore_file *fp) { - int ret = 0; int prev = ukarch_dec(&fp->f_count); if (prev == 0) UK_CRASH("Unbalanced fhold/fdrop"); - if (prev == 1) - ret = vfs_close(fp); - return ret; + if (prev == 1) { + /* + * we free the file even in case of an error + * so release the dentry too + */ + if (vfs_close(fp) != 0) + drele(fp->f_dentry); + + free(fp); + + return 1; + } + + return 0; } void fhold(struct vfscore_file *fp) { diff --git a/lib/vfscore/fops.c b/lib/vfscore/fops.c index 8f5c2e1b..0cef2c12 100644 --- a/lib/vfscore/fops.c +++ b/lib/vfscore/fops.c @@ -53,9 +53,10 @@ int vfs_close(struct vfscore_file *fp) if (error) return error; - /* Dentry stays forever in the dentry cache. Unless the - * file/directory it refers to gets deleted/renamed */ + /* Release the dentry */ + drele(fp->f_dentry); fp->f_dentry = NULL; + return 0; } @@ -103,7 +104,7 @@ int vfs_write(struct vfscore_file *fp, struct uio *uio, int flags) ioflags |= IO_SYNC; if ((flags & FOF_OFFSET) == 0) - uio->uio_offset = fp->f_offset; + uio->uio_offset = fp->f_offset; error = VOP_WRITE(vp, uio, ioflags); if (!error) { diff --git a/lib/vfscore/syscalls.c b/lib/vfscore/syscalls.c index 385d90c0..f9666c4c 100644 --- a/lib/vfscore/syscalls.c +++ b/lib/vfscore/syscalls.c @@ -204,6 +204,8 @@ sys_open(char *path, int flags, mode_t mode, struct vfscore_file **fpp) } fp->f_flags = flags; + // OSv was using a intrusive_ptr which was increasing the refcount + dref(dp); // change to std::move once dp is a dentry_ref fp->f_dentry = dp; dp = NULL; @@ -214,6 +216,7 @@ sys_open(char *path, int flags, mode_t mode, struct vfscore_file **fpp) // Note direct delete of fp instead of fdrop(fp). fp was never // returned so cannot be in use, and because it wasn't opened // it cannot be close()ed. + drele(fp->f_dentry); free(fp); return error; } -- 2.11.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |