]> Zhao Yanbai Git Server - minix.git/commitdiff
Message type for VFS_FCNTL
authorLionel Sambuc <lionel@minix3.org>
Mon, 12 May 2014 12:58:20 +0000 (14:58 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:33 +0000 (17:05 +0200)
Change-Id: I079f3d7902cf5501fbc594a5610acd370abea095

include/minix/callnr.h
include/minix/ipc.h
lib/libc/sys-minix/fcntl.c
servers/vfs/lock.c
servers/vfs/main.c
servers/vfs/misc.c

index 4501b012a455d6572a413cce37b4a0d5b838d79e..1b1ec4b618af9a079390c0e5b9b24c5792be7636 100644 (file)
 
 #define NR_VFS_CALLS           49      /* highest number from base plus one */
 
-/* Field names for the fcntl(2) call. */
-#define VFS_FCNTL_FD           m1_i1   /* int */
-#define VFS_FCNTL_CMD          m1_i2   /* int */
-#define VFS_FCNTL_ARG_INT      m1_i3   /* int */
-#define VFS_FCNTL_ARG_PTR      m1_p1   /* struct flock * */
-
 /* Field names for the mknod(2) call. */
 #define VFS_MKNOD_NAME         m1_p1   /* const char * */
 #define VFS_MKNOD_LEN          m1_i1   /* size_t */
index 5721a6337e206789e39a7276b43deddae1944b5b..bfb2c0ef49d52245bdfa52b90133656812a58303 100644 (file)
@@ -146,6 +146,16 @@ typedef struct {
 } mess_sigcalls;
 _ASSERT_MSG_SIZE(mess_sigcalls);
 
+typedef struct {
+       int fd;
+       int cmd;
+       int arg_int;
+       vir_bytes arg_ptr;      /* struct flock * */
+
+       uint8_t padding[40];
+} mess_lc_vfs_fcntl;
+_ASSERT_MSG_SIZE(mess_lc_vfs_fcntl);
+
 typedef struct {
        int fd;
        vir_bytes buf;          /* struct stat * */
@@ -777,6 +787,7 @@ typedef struct {
                mess_fs_vfs_readsuper   m_fs_vfs_readsuper;
                mess_fs_vfs_readwrite   m_fs_vfs_readwrite;
 
+               mess_lc_vfs_fcntl       m_lc_vfs_fcntl;
                mess_lc_vfs_fstat       m_lc_vfs_fstat;
                mess_lc_vfs_fsync       m_lc_vfs_fsync;
                mess_lc_vfs_getvfsstat  m_lc_vfs_getvfsstat;
index 514dfe007d7a4e7b765d511d9f8a8e7730f5a229..496dd9a5bc7af60f5e0389848ef1ee878945df38 100644 (file)
@@ -23,19 +23,19 @@ int fcntl(int fd, int cmd, ...)
      case F_DUPFD:
      case F_SETFD:
      case F_SETFL:
-       m.VFS_FCNTL_ARG_INT = va_arg(argp, int);
+       m.m_lc_vfs_fcntl.arg_int = va_arg(argp, int);
        break;
      case F_GETLK:
      case F_SETLK:
      case F_SETLKW:
      case F_FREESP:
-       m.VFS_FCNTL_ARG_PTR = (char *) va_arg(argp, struct flock *);
+       m.m_lc_vfs_fcntl.arg_ptr = va_arg(argp, struct flock *);
        break;
   }
 
   /* Clean up and make the system call. */
   va_end(argp);
-  m.VFS_FCNTL_FD = fd;
-  m.VFS_FCNTL_CMD = cmd;
+  m.m_lc_vfs_fcntl.fd = fd;
+  m.m_lc_vfs_fcntl.cmd = cmd;
   return(_syscall(VFS_PROC_NR, VFS_FCNTL, &m));
 }
index e9c63fcdd57303619781fdd4dc2acab5fd59a912..197d5d0c4764afb7f14278e506dab0a7b7c639f6 100644 (file)
@@ -31,7 +31,7 @@ int req;                      /* either F_SETLK or F_SETLKW */
   struct file_lock *flp, *flp2, *empty;
 
   /* Fetch the flock structure from user space. */
-  r = sys_datacopy_wrapper(who_e, (vir_bytes) scratch(fp).io.io_buffer, VFS_PROC_NR,
+  r = sys_datacopy_wrapper(who_e, (vir_bytes)scratch(fp).io.io_buffer, VFS_PROC_NR,
                   (vir_bytes) &flock, sizeof(flock));
   if (r != OK) return(EINVAL);
 
@@ -142,7 +142,7 @@ int req;                    /* either F_SETLK or F_SETLKW */
 
        /* Copy the flock structure back to the caller. */
        r = sys_datacopy_wrapper(VFS_PROC_NR, (vir_bytes) &flock, who_e,
-               (vir_bytes) scratch(fp).io.io_buffer, sizeof(flock));
+               (vir_bytes)scratch(fp).io.io_buffer, sizeof(flock));
        return(r);
   }
 
index e781a49975745efe5b953fde25d86fe8ecab4742..70877605b91977b229ffc628d8330f0e16e0c47c 100644 (file)
@@ -828,10 +828,10 @@ struct fproc *rfp;
        break;
   case VFS_FCNTL:
        assert(blocked_on == FP_BLOCKED_ON_LOCK);
-       m_in.VFS_FCNTL_FD = scratch(rfp).file.fd_nr;
-       m_in.VFS_FCNTL_CMD = scratch(rfp).io.io_nbytes;
-       m_in.VFS_FCNTL_ARG_PTR = scratch(rfp).io.io_buffer;
-       assert(m_in.VFS_FCNTL_CMD == F_SETLKW);
+       m_in.m_lc_vfs_fcntl.fd = scratch(rfp).file.fd_nr;
+       m_in.m_lc_vfs_fcntl.cmd = scratch(rfp).io.io_nbytes;
+       m_in.m_lc_vfs_fcntl.arg_ptr = (vir_bytes)scratch(rfp).io.io_buffer;
+       assert(m_in.m_lc_vfs_fcntl.cmd == F_SETLKW);
        break;
   default:
        panic("unblocking call %d blocked on %d ??", m_in.m_type, blocked_on);
index 0775a4b4e4d5569ab1a5445a648b53d85c38fd22..d41d54786fb5dc0c7b3fa0491382d83b9b53daff 100644 (file)
@@ -103,11 +103,13 @@ int do_fcntl(void)
   int new_fd, fl, r = OK, fcntl_req, fcntl_argx;
   tll_access_t locktype;
 
-  scratch(fp).file.fd_nr = job_m_in.VFS_FCNTL_FD;
-  scratch(fp).io.io_buffer = job_m_in.VFS_FCNTL_ARG_PTR;
-  scratch(fp).io.io_nbytes = job_m_in.VFS_FCNTL_CMD;
-  fcntl_req = job_m_in.VFS_FCNTL_CMD;
-  fcntl_argx = job_m_in.VFS_FCNTL_ARG_INT;
+  scratch(fp).file.fd_nr = job_m_in.m_lc_vfs_fcntl.fd;
+  /* LSC: io_buffer is used everywhere as a valid VFS memory space pointer.
+   * Seems downright scary to me. */
+  scratch(fp).io.io_buffer = (char *)job_m_in.m_lc_vfs_fcntl.arg_ptr;
+  scratch(fp).io.io_nbytes = job_m_in.m_lc_vfs_fcntl.cmd;
+  fcntl_req = job_m_in.m_lc_vfs_fcntl.cmd;
+  fcntl_argx = job_m_in.m_lc_vfs_fcntl.arg_int;
 
   /* Is the file descriptor valid? */
   locktype = (fcntl_req == F_FREESP) ? VNODE_WRITE : VNODE_READ;
@@ -170,7 +172,7 @@ int do_fcntl(void)
        else if (!(f->filp_mode & W_BIT)) r = EBADF;
        else {
                /* Copy flock data from userspace. */
-               r = sys_datacopy_wrapper(who_e, (vir_bytes) scratch(fp).io.io_buffer,
+               r = sys_datacopy_wrapper(who_e, (vir_bytes)scratch(fp).io.io_buffer,
                        SELF, (vir_bytes) &flock_arg, sizeof(flock_arg));
        }