|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [mini-os master] mini-os: kexec: add O_CLOEXEC support
commit 23cec6dac9057a98b0f7727f9d7b9a97bacff41c
Author: Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Wed Jul 9 16:41:45 2025 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jul 9 16:41:45 2025 +0200
mini-os: kexec: add O_CLOEXEC support
Define O_CLOEXEC as a non-zero value and add a kexec callback to cycle
over all open files to close them in case O_CLOEXEC was specified when
opening the file.
This requires the addition of a cloexec boolean in struct file.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx>
---
include/fcntl.h | 6 ++++++
include/lib.h | 1 +
lib/sys.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/include/fcntl.h b/include/fcntl.h
index cc59b3c..3205dae 100644
--- a/include/fcntl.h
+++ b/include/fcntl.h
@@ -3,6 +3,9 @@
#ifdef HAVE_LIBC
#include_next <fcntl.h>
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0x40000 /* Use newlib's value for WIN32 and CYGWIN. */
+#endif
#else
/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
@@ -25,6 +28,9 @@
#define O_DIRECTORY 0200000 /* must be a directory */
#define O_NOFOLLOW 0400000 /* don't follow links */
#define O_NOATIME 01000000
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 02000000
+#endif
#define F_DUPFD 0 /* dup */
#define F_GETFD 1 /* get close_on_exec */
diff --git a/include/lib.h b/include/lib.h
index de67bab..ea14649 100644
--- a/include/lib.h
+++ b/include/lib.h
@@ -174,6 +174,7 @@ extern struct wait_queue_head event_queue;
struct file {
unsigned int type;
bool read; /* maybe available for read */
+ bool cloexec;
off_t offset;
union {
int fd; /* Any fd from an upper layer. */
diff --git a/lib/sys.c b/lib/sys.c
index 481067f..7dc236e 100644
--- a/lib/sys.c
+++ b/lib/sys.c
@@ -26,6 +26,7 @@
#include <sched.h>
#include <events.h>
#include <wait.h>
+#include <kexec.h>
#include <netfront.h>
#include <blkfront.h>
#include <fbfront.h>
@@ -221,6 +222,7 @@ int alloc_fd(unsigned int type)
if (files[i].type == FTYPE_NONE) {
files[i].type = type;
files[i].offset = 0;
+ files[i].cloexec = false;
pthread_mutex_unlock(&fd_lock);
return i;
}
@@ -231,6 +233,39 @@ int alloc_fd(unsigned int type)
}
EXPORT_SYMBOL(alloc_fd);
+#ifdef CONFIG_KEXEC
+static int kexec_close_files(bool undo)
+{
+ unsigned int i;
+ static int closed = 0;
+
+ if ( undo )
+ {
+ if ( closed )
+ printk("Can't undo closing files!\n");
+ closed = 0;
+
+ return 0;
+ }
+
+ pthread_mutex_lock(&fd_lock);
+
+ for ( i = 0; i < NOFILE; i++ )
+ {
+ if ( files[i].type != FTYPE_NONE && files[i].cloexec )
+ {
+ close(i);
+ closed++;
+ }
+ }
+
+ pthread_mutex_unlock(&fd_lock);
+
+ return 0;
+}
+kexec_call(kexec_close_files);
+#endif
+
void close_all_files(void)
{
int i;
@@ -374,6 +409,7 @@ int open(const char *pathname, int flags, ...)
struct mount_point *mnt;
mode_t mode = 0;
va_list ap;
+ int fd;
if ( flags & O_CREAT )
{
@@ -390,7 +426,13 @@ int open(const char *pathname, int flags, ...)
mlen = strlen(mnt->path);
if ( !strncmp(pathname, mnt->path, mlen) &&
(pathname[mlen] == '/' || pathname[mlen] == 0) )
- return mnt->open(mnt, pathname + mlen, flags, mode);
+ {
+ fd = mnt->open(mnt, pathname + mlen, flags, mode);
+ if ( fd >= 0 && (flags & O_CLOEXEC) )
+ files[fd].cloexec = true;
+
+ return fd;
+ }
}
errno = EIO;
--
generated by git-patchbot for /home/xen/git/mini-os.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |