From 784319236fdb1c67b2ac6bcdd01349acdaa1cebc Mon Sep 17 00:00:00 2001 From: Lei Huang Date: Mon, 13 Nov 2023 16:14:40 +0000 Subject: [PATCH] DAOS-14556 client: rely on dup2() to allocate desired fd. Do not land yet. Skip-test: true Skip-unit-tests: true Required-githooks: true Signed-off-by: Lei Huang --- src/client/dfuse/pil4dfs/int_dfs.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/client/dfuse/pil4dfs/int_dfs.c b/src/client/dfuse/pil4dfs/int_dfs.c index 56b3036053c..4495cee7d9b 100644 --- a/src/client/dfuse/pil4dfs/int_dfs.c +++ b/src/client/dfuse/pil4dfs/int_dfs.c @@ -4867,22 +4867,35 @@ dup2(int oldfd, int newfd) else fd_directed = query_fd_forward_dest(oldfd); if (fd_directed >= FD_FILE_BASE) { - rc = close(newfd); - if (rc != 0 && errno != EBADF) - return -1; - fd = allocate_a_fd_from_kernel(); + int fd_tmp; + + fd_tmp = allocate_a_fd_from_kernel(); + if (fd_tmp < 0) { + /* failed to allocate an fd from kernel */ + errno_save = errno; + DS_ERROR(errno_save, "failed to get a fd from kernel"); + errno = errno_save; + return (-1); + } + /* rely on dup2() to get the desired fd */ + fd = next_dup2(fd_tmp, newfd); if (fd < 0) { /* failed to allocate an fd from kernel */ errno_save = errno; DS_ERROR(errno_save, "failed to get a fd from kernel"); + close(fd_tmp); errno = errno_save; return (-1); } else if (fd != newfd) { close(fd); + close(fd_tmp); DS_ERROR(EBUSY, "failed to get the desired fd in dup2()"); errno = EBUSY; return (-1); } + rc = close(fd_tmp); + if (rc != 0) + return -1; idx = allocate_dup2ed_fd(fd, fd_directed); if (idx >= 0) return fd;