User interface for fsync and posix_fadvise (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 26 May 2015 15:45:08 +0000 (11:45 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Jun 2015 13:40:33 +0000 (09:40 -0400)
Using fcntl() for fsync and fadvise.  Not sure why POSIX/glibc didn't do
this already.

Part of it might be that fcntl, despite the ... declaration, supposedly
always takes one va_arg of type int, and it's ignored for certain
commands (e.g. F_GETFD).  That's pretty silly, so I extended it to take
up to four args.

Rebuild glibc.

kern/include/ros/fs.h
kern/src/syscall.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bits/fcntl.h
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/fcntl.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/fsync.c [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/posix_fadvise.c [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/posix_fadvise64.c [new file with mode: 0644]

index b37e7f2..e994043 100644 (file)
@@ -75,14 +75,22 @@ struct kstat {
 #define OEXCL                  O_EXCL
 #define ORCLOSE                        O_REMCLO
 
-/* fcntl flags that we support, keep in sync with glibc */
 #define F_DUPFD                0       /* Duplicate file descriptor */
 #define F_GETFD                1       /* Get file descriptor flags */
 #define F_SETFD                2       /* Set file descriptor flags */
 #define F_GETFL                3       /* Get file status flags */
 #define F_SETFL                4       /* Set file status flags */
+#define F_SYNC         101     /* fsync() */
+#define F_ADVISE       102     /* posix_fadvise{,64}() */
 /* For F_[GET|SET]FD */
 #define FD_CLOEXEC     1
+/* Advise to `posix_fadvise'.  */
+#define POSIX_FADV_NORMAL              0       /* No further special treatment */
+#define POSIX_FADV_RANDOM              1       /* Expect random page references */
+#define POSIX_FADV_SEQUENTIAL  2       /* Expect sequential page references */
+#define POSIX_FADV_WILLNEED            3       /* Will need these pages */
+#define POSIX_FADV_DONTNEED            4       /* Don't need these pages */
+#define POSIX_FADV_NOREUSE             5       /* Data will be accessed once */
 
 /* TODO: have userpsace use our stuff from bits/stats.h */
 #ifdef ROS_KERNEL
index 1a59a7d..d2c2e66 100644 (file)
@@ -1462,7 +1462,8 @@ static intreg_t sys_lstat(struct proc *p, const char *path, size_t path_l,
        return stat_helper(p, path, path_l, u_stat, 0);
 }
 
-intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
+intreg_t sys_fcntl(struct proc *p, int fd, int cmd, unsigned long arg1,
+                   unsigned long arg2, unsigned long arg3, unsigned long arg4)
 {
        int retval = 0;
        int newfd;
@@ -1475,11 +1476,14 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
                                return sysdup(fd, -1);
                        case (F_GETFD):
                        case (F_SETFD):
+                       case (F_SYNC):
+                       case (F_ADVISE):
+                               /* TODO: 9ns versions */
                                return 0;
                        case (F_GETFL):
                                return fd_getfl(fd);
                        case (F_SETFL):
-                               return fd_setfl(fd, arg);
+                               return fd_setfl(fd, arg1);
                        default:
                                warn("Unsupported fcntl cmd %d\n", cmd);
                }
@@ -1491,7 +1495,7 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
        /* TODO: these are racy */
        switch (cmd) {
                case (F_DUPFD):
-                       retval = insert_file(&p->open_files, file, arg, FALSE, FALSE);
+                       retval = insert_file(&p->open_files, file, arg1, FALSE, FALSE);
                        if (retval < 0) {
                                set_errno(-retval);
                                retval = -1;
@@ -1504,7 +1508,7 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
                        /* I'm considering not supporting this at all.  They must do it at
                         * open time or fix their buggy/racy code. */
                        spin_lock(&p->open_files.lock);
-                       if (arg & FD_CLOEXEC)
+                       if (arg1 & FD_CLOEXEC)
                                p->open_files.fd[fd].fd_flags |= FD_CLOEXEC;
                        retval = p->open_files.fd[fd].fd_flags;
                        spin_unlock(&p->open_files.lock);
@@ -1514,8 +1518,16 @@ intreg_t sys_fcntl(struct proc *p, int fd, int cmd, int arg)
                        break;
                case (F_SETFL):
                        /* only allowed to set certain flags. */
-                       arg &= O_FCNTL_FLAGS;
-                       file->f_flags = (file->f_flags & ~O_FCNTL_FLAGS) | arg;
+                       arg1 &= O_FCNTL_FLAGS;
+                       file->f_flags = (file->f_flags & ~O_FCNTL_FLAGS) | arg1;
+                       break;
+               case (F_SYNC):
+                       /* TODO (if we keep the VFS) */
+                       retval = 0;
+                       break;
+               case (F_ADVISE):
+                       /* TODO  (if we keep the VFS)*/
+                       retval = 0;
                        break;
                default:
                        warn("Unsupported fcntl cmd %d\n", cmd);
index f5f3777..75574bb 100644 (file)
@@ -57,13 +57,3 @@ struct flock
 #define        F_RDLCK 1       /* Read lock.  */
 #define        F_WRLCK 2       /* Write lock.  */
 #define        F_UNLCK 3       /* Remove lock.  */
-
-/* Advise to `posix_fadvise'.  */
-#ifdef __USE_XOPEN2K
-# define POSIX_FADV_NORMAL     0 /* No further special treatment.  */
-# define POSIX_FADV_RANDOM     1 /* Expect random page references.  */
-# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references.  */
-# define POSIX_FADV_WILLNEED   3 /* Will need these pages.  */
-# define POSIX_FADV_DONTNEED   4 /* Don't need these pages.  */
-# define POSIX_FADV_NOREUSE    5 /* Data will be accessed once.  */
-#endif
index 25fdf43..ea6df98 100644 (file)
 int
 __fcntl(int fd, int cmd, ...)
 {
-  va_list vl;
-  va_start(vl,cmd);
-  int arg = va_arg(vl,int);
-  va_end(vl);
-
-  switch(cmd)
-  {
-    case F_DUPFD:
-    case F_GETFD:
-    case F_SETFD:
-    case F_GETFL:
-    case F_SETFL:
-      return ros_syscall(SYS_fcntl, fd, cmd, arg, 0, 0, 0);
-    default:
-      errno = ENOSYS;
-      return -1;
-  }
+       int ret, arg, advise;
+       __off64_t offset, len;
+       va_list vl;
+       va_start(vl, cmd);
+       switch (cmd) {
+               case F_GETFD:
+               case F_SYNC:
+                       ret = ros_syscall(SYS_fcntl, fd, cmd, 0, 0, 0, 0);
+                       break;
+               case F_DUPFD:
+               case F_SETFD:
+               case F_GETFL:
+               case F_SETFL:
+                       arg = va_arg(vl, int);
+                       ret = ros_syscall(SYS_fcntl, fd, cmd, arg, 0, 0, 0);
+                       break;
+               case F_ADVISE:
+                       offset = va_arg(vl, __off64_t);
+                       len = va_arg(vl, __off64_t);
+                       advise = va_arg(vl, int);
+                       ret = ros_syscall(SYS_fcntl, fd, cmd, offset, len, advise, 0);
+                       break;
+               default:
+                       errno = ENOSYS;
+                       ret = -1;
+       }
+       va_end(vl);
+       return ret;
 }
 
 libc_hidden_def (__fcntl)
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/fsync.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/fsync.c
new file mode 100644 (file)
index 0000000..bbbb95e
--- /dev/null
@@ -0,0 +1,27 @@
+/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+#include <fcntl.h>
+
+/* Make all changes done to FD actually appear on disk.  */
+int
+fsync (fd)
+     int fd;
+{
+  return fcntl(fd, F_SYNC);
+}
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/posix_fadvise.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/posix_fadvise.c
new file mode 100644 (file)
index 0000000..e7b48d8
--- /dev/null
@@ -0,0 +1,27 @@
+/* Copyright (C) 2000-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fcntl.h>
+
+/* Advice the system about the expected behaviour of the application with
+   respect to the file associated with FD.  */
+
+int
+posix_fadvise (int fd, __off_t offset, __off_t len, int advise)
+{
+  return fcntl(fd, F_ADVISE, (__off64_t)offset, (__off64_t)len, advise);
+}
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/posix_fadvise64.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/posix_fadvise64.c
new file mode 100644 (file)
index 0000000..2bb8741
--- /dev/null
@@ -0,0 +1,27 @@
+/* Copyright (C) 2000-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <fcntl.h>
+
+/* Advice the system about the expected behaviour of the application with
+   respect to the file associated with FD.  */
+
+int
+posix_fadvise64 (int fd, __off64_t offset, __off64_t len, int advise)
+{
+  return fcntl(fd, F_ADVISE, offset, len, advise);
+}