From d3be3f2cb1507afba88e4cee12e80831ad9e9295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 31 Mar 2005 17:22:33 +0000 Subject: [PATCH] The open_count/close hook stuff is now (hopefully) finally correct: - vfs_exec_io_context() did not close descriptors - no variant of dup() did increment the open_count This allows "VARIABLE=`command`" bash lines to work again. Removed redundant PRINT() macro from fd.c. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12199 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/core/fs/fd.c | 27 ++++++++++++++------------- src/kernel/core/fs/pipefs.cpp | 2 +- src/kernel/core/fs/vfs.cpp | 4 +++- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/kernel/core/fs/fd.c b/src/kernel/core/fs/fd.c index 08822c28e0..8791ba6242 100644 --- a/src/kernel/core/fs/fd.c +++ b/src/kernel/core/fs/fd.c @@ -18,10 +18,8 @@ //#define TRACE_FD #ifdef TRACE_FD # define TRACE(x) dprintf x -# define PRINT(x) dprintf x #else # define TRACE(x) -# define PRINT(x) #endif @@ -40,6 +38,7 @@ dump_fd(int fd,struct file_descriptor *descriptor) } #endif + /** Allocates and initializes a new file_descriptor */ struct file_descriptor * @@ -54,7 +53,7 @@ alloc_fd(void) descriptor->u.vnode = NULL; descriptor->cookie = NULL; descriptor->ref_count = 1; - descriptor->open_count = 1; + descriptor->open_count = 0; descriptor->open_mode = 0; descriptor->pos = 0; @@ -87,6 +86,7 @@ new_fd_etc(struct io_context *context, struct file_descriptor *descriptor, int f context->fds[fd] = descriptor; context->num_used_fds++; + atomic_add(&descriptor->open_count, 1); err: mutex_unlock(&context->io_mutex); @@ -240,6 +240,7 @@ dup2_fd(int oldfd, int newfd, bool kernel) // Now do the work evicted = context->fds[newfd]; atomic_add(&context->fds[oldfd]->ref_count, 1); + atomic_add(&context->fds[oldfd]->open_count, 1); context->fds[newfd] = context->fds[oldfd]; } @@ -326,10 +327,10 @@ common_close(int fd, bool kernel) if (descriptor == NULL) return B_FILE_ERROR; - #ifdef TRACE_FD - if (!kernel) - TRACE(("_user_close(descriptor = %p)\n", descriptor)); - #endif +#ifdef TRACE_FD + if (!kernel) + TRACE(("_user_close(descriptor = %p)\n", descriptor)); +#endif close_fd(descriptor); put_fd(descriptor); @@ -560,7 +561,7 @@ _user_ioctl(int fd, ulong op, void *buffer, size_t length) if (IS_KERNEL_ADDRESS(buffer)) return B_BAD_ADDRESS; - PRINT(("user_ioctl: fd %d\n", fd)); + TRACE(("user_ioctl: fd %d\n", fd)); descriptor = get_fd(get_current_io_context(false), fd); if (!descriptor) @@ -585,7 +586,7 @@ _user_read_dir(int fd, struct dirent *buffer, size_t bufferSize, uint32 maxCount if (IS_KERNEL_ADDRESS(buffer)) return B_BAD_ADDRESS; - PRINT(("user_read_dir(fd = %d, buffer = %p, bufferSize = %ld, count = %lu)\n", fd, buffer, bufferSize, maxCount)); + TRACE(("user_read_dir(fd = %d, buffer = %p, bufferSize = %ld, count = %lu)\n", fd, buffer, bufferSize, maxCount)); descriptor = get_fd(get_current_io_context(false), fd); if (descriptor == NULL) @@ -610,7 +611,7 @@ _user_rewind_dir(int fd) struct file_descriptor *descriptor; status_t status; - PRINT(("user_rewind_dir(fd = %d)\n", fd)); + TRACE(("user_rewind_dir(fd = %d)\n", fd)); descriptor = get_fd(get_current_io_context(false), fd); if (descriptor == NULL) @@ -816,7 +817,7 @@ _kern_ioctl(int fd, ulong op, void *buffer, size_t length) struct file_descriptor *descriptor; int status; - PRINT(("sys_ioctl: fd %d\n", fd)); + TRACE(("sys_ioctl: fd %d\n", fd)); descriptor = get_fd(get_current_io_context(true), fd); if (descriptor == NULL) @@ -838,7 +839,7 @@ _kern_read_dir(int fd, struct dirent *buffer, size_t bufferSize, uint32 maxCount struct file_descriptor *descriptor; ssize_t retval; - PRINT(("sys_read_dir(fd = %d, buffer = %p, bufferSize = %ld, count = %lu)\n",fd, buffer, bufferSize, maxCount)); + TRACE(("sys_read_dir(fd = %d, buffer = %p, bufferSize = %ld, count = %lu)\n",fd, buffer, bufferSize, maxCount)); descriptor = get_fd(get_current_io_context(true), fd); if (descriptor == NULL) @@ -863,7 +864,7 @@ _kern_rewind_dir(int fd) struct file_descriptor *descriptor; status_t status; - PRINT(("sys_rewind_dir(fd = %d)\n",fd)); + TRACE(("sys_rewind_dir(fd = %d)\n",fd)); descriptor = get_fd(get_current_io_context(true), fd); if (descriptor == NULL) diff --git a/src/kernel/core/fs/pipefs.cpp b/src/kernel/core/fs/pipefs.cpp index 9fe9dd11b9..772830ad64 100644 --- a/src/kernel/core/fs/pipefs.cpp +++ b/src/kernel/core/fs/pipefs.cpp @@ -1096,7 +1096,7 @@ pipefs_create(fs_volume _volume, fs_vnode _dir, const char *name, int openMode, cookie->open_mode = openMode; inode->Open(openMode); - TRACE((" create cookie = %p\n", cookie)); + TRACE((" create cookie = %p, node = %p\n", cookie, inode)); *_cookie = (void *)cookie; *_newVnodeID = inode->ID(); diff --git a/src/kernel/core/fs/vfs.cpp b/src/kernel/core/fs/vfs.cpp index ce1e7af30a..a8525fb375 100644 --- a/src/kernel/core/fs/vfs.cpp +++ b/src/kernel/core/fs/vfs.cpp @@ -2477,8 +2477,10 @@ vfs_exec_io_context(void *_context) mutex_unlock(&context->io_mutex); - if (remove) + if (remove) { + close_fd(descriptor); put_fd(descriptor); + } } }