Clean up usage of fcntl flags (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 10 Sep 2015 18:22:23 +0000 (14:22 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
The usage of O_FCNTL_FLAGS wasn't clear, nor was the distinction between
those flags (now with 'set' in the name) and the CEXTERNAL_FLAGS.  This
area needs a bit of work, especially since many of those flags aren't
supported.  Also, it's a little weird that 9ns tracks CLOEXEC on the
chan, instead of the FD, as was previously noted.

A kernel header changed, though it shouldn't affect anyone.

kern/include/ns.h
kern/include/ros/fs.h
kern/include/vfs.h
kern/src/syscall.c

index 334d156..d63a7e3 100644 (file)
@@ -311,8 +311,9 @@ enum {
        CCACHE =                0x0008, /* client cache */
        CINTERNAL_FLAGS = (COPEN | CMSG | CFREE | CCACHE),
 
-       /* chan/file flags, setably via open and sometimes fcntl/setfl.  these are
-        * the internal names used in some parts of 9ns */
+       /* chan/file flags, getable via fcntl/getfl and setably via open and
+        * sometimes fcntl/setfl.  those that can't be set cause an error() in
+        * fd_setfl. */
        CCEXEC =                O_CLOEXEC,      /* (prob should be on the FD, 9ns has it here) */
        CRCLOSE =               O_REMCLO,       /* remove on close (also, maybe should be on FD) */
        CAPPEND =               O_APPEND,       /* append on write */
index 3327f10..8b1f462 100644 (file)
@@ -62,8 +62,6 @@ struct kstat {
 #define O_NOATIME              01000000        /* Do not set atime. */
 #define O_CLOEXEC              02000000        /* Set close_on_exec. */
 #define O_REMCLO               04000000        /* Remove on close (unsupported). */
-#define O_CREAT_FLAGS (O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC)
-#define O_FCNTL_FLAGS (O_APPEND | O_ASYNC | O_DIRECT | O_NOATIME | O_NONBLOCK)
 
 /* Plan9 names for these flags */
 #define OREAD                  O_RDONLY
index 2c126bc..1fc871e 100644 (file)
@@ -41,6 +41,13 @@ struct poll_table_struct {int x;};
 
 #include <ros/fs.h>
 
+/* Create flags are those used only during creation, and not saved for later
+ * lookup or use.  Everything other than them is viewable via getfl */
+#define O_CREAT_FLAGS (O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC)
+/* These flags are those you can attempt to set via setfl for the VFS. */
+#define O_FCNTL_SET_FLAGS (O_APPEND | O_ASYNC | O_DIRECT | O_NOATIME |         \
+                           O_NONBLOCK)
+
 struct super_block;
 struct super_operations;
 struct dentry;
index 53ae09c..b3933a8 100644 (file)
@@ -1582,8 +1582,8 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, unsigned long arg1,
                        break;
                case (F_SETFL):
                        /* only allowed to set certain flags. */
-                       arg1 &= O_FCNTL_FLAGS;
-                       file->f_flags = (file->f_flags & ~O_FCNTL_FLAGS) | arg1;
+                       arg1 &= O_FCNTL_SET_FLAGS;
+                       file->f_flags = (file->f_flags & ~O_FCNTL_SET_FLAGS) | arg1;
                        break;
                case (F_SYNC):
                        /* TODO (if we keep the VFS) */