]> Zhao Yanbai Git Server - minix.git/commitdiff
Calls and functionality for get/setpriority() and fsync().
authorBen Gras <ben@minix3.org>
Fri, 1 Jul 2005 17:58:29 +0000 (17:58 +0000)
committerBen Gras <ben@minix3.org>
Fri, 1 Jul 2005 17:58:29 +0000 (17:58 +0000)
servers/fs/misc.c
servers/fs/proto.h
servers/fs/table.c
servers/pm/main.c
servers/pm/misc.c
servers/pm/mproc.h
servers/pm/proto.h
servers/pm/table.c
servers/pm/utility.c

index 773a89ebb6f5d24da5f8fdde5e4ce7317f8870cc..78a209918db8ea8b6592babe5b56f5aa9a572110 100644 (file)
@@ -6,6 +6,7 @@
  *   do_dup:     perform the DUP system call
  *   do_fcntl:   perform the FCNTL system call
  *   do_sync:    perform the SYNC system call
+ *   do_fsync:   perform the FSYNC system call
  *   do_reboot:          sync disks and prepare for shutdown
  *   do_fork:    adjust the tables after MM has performed a FORK system call
  *   do_exec:    handle files with FD_CLOEXEC on after MM has done an EXEC
@@ -187,6 +188,19 @@ PUBLIC int do_sync()
   return(OK);          /* sync() can't fail */
 }
 
+/*===========================================================================*
+ *                             do_fsync                                             *
+ *===========================================================================*/
+PUBLIC int do_fsync()
+{
+/* Perform the fsync() system call. For now, don't be unnecessarily smart. */
+
+  do_sync();
+
+  return(OK);
+}
+
+
 
 /*===========================================================================*
  *                             do_reboot                                    *
index 915501e5f21cfe094ccb6d2e2257e91fff79ea8e..0f813ddc04f2bbed4b822d634b0def6c8274e371 100644 (file)
@@ -87,6 +87,7 @@ _PROTOTYPE( int do_exec, (void)                                               );
 _PROTOTYPE( int do_revive, (void)                                      );
 _PROTOTYPE( int do_set, (void)                                         );
 _PROTOTYPE( int do_sync, (void)                                                );
+_PROTOTYPE( int do_fsync, (void)                                               );
 _PROTOTYPE( int do_reboot, (void)                                      );
 _PROTOTYPE( int do_svrctl, (void)                                      );
 _PROTOTYPE( int do_getsysinfo, (void)                                  );
index 9e9c463af029b2b4ef8303013bd518549e064de3..cc8bbbf4e5759e8c996699900b9268fe615f55d3 100644 (file)
@@ -104,6 +104,9 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = {
        no_sys,         /* 84 = memfree */
        do_select,      /* 85 = select */
        do_fchdir,      /* 86 = fchdir */
+       do_fsync,       /* 87 = fsync */
+       no_sys,         /* 88 = getpriority */
+       no_sys,         /* 89 = setpriority */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index fd40d7697c85cd64469165e84acb9a079c2d006b..6d12bae32e08234695516ca21fd52deb21ba2385 100644 (file)
@@ -210,6 +210,7 @@ PRIVATE void pm_init()
    * handling behaviour for PM, since PM cannot call sigaction() as others.
    */
   mproc[INIT_PROC_NR].mp_pid = INIT_PID;
+  mproc[INIT_PROC_NR].mp_nice = 0;
   mproc[INIT_PROC_NR].mp_parent = PM_PROC_NR;
   sigemptyset(&mproc[INIT_PROC_NR].mp_ignore);
   sigemptyset(&mproc[INIT_PROC_NR].mp_sigmask);
index bf22f52c4efde792084388196b821b1a3dc9e4cc..69b825b14776a13262901d25257e65faf572740f 100644 (file)
@@ -7,12 +7,14 @@
  *   do_getprocnr: lookup process slot number  (Jorrit N. Herder)
  *   do_memalloc: allocate a chunk of memory  (Jorrit N. Herder)
  *   do_memfree: deallocate a chunk of memory  (Jorrit N. Herder)
+ *   do_getsetpriority: get/set process priority
  */
 
 #include "pm.h"
 #include <minix/callnr.h>
 #include <signal.h>
 #include <sys/svrctl.h>
+#include <sys/resource.h>
 #include <minix/com.h>
 #include <minix/utils.h>
 #include <string.h>
@@ -164,6 +166,52 @@ PUBLIC int do_reboot()
   return(SUSPEND);                     /* don't reply to killed process */
 }
 
+/*=====================================================================*
+ *                         do_getsetpriority                          *
+ *=====================================================================*/
+PUBLIC int do_getsetpriority()
+{
+       int arg_which, arg_who, arg_pri;
+       int rmp_nr;
+       struct mproc *rmp;
+
+       arg_which = m_in.m1_i1;
+       arg_who = m_in.m1_i2;
+       arg_pri = m_in.m1_i3;   /* for SETPRIORITY */
+
+       /* Code common to GETPRIORITY and SETPRIORITY. */
+
+       /* Only support PRIO_PROCESS for now. */
+       if(arg_which != PRIO_PROCESS)
+               return EINVAL;
+
+       if(arg_who == 0)
+               rmp_nr = who;
+       else
+               if((rmp_nr = proc_from_pid(arg_who)) < 0)
+                       return ESRCH;
+
+       rmp = &mproc[rmp_nr];
+
+       if(mp->mp_effuid != SUPER_USER &&
+          mp->mp_effuid != rmp->mp_effuid && mp->mp_effuid != rmp->mp_realuid)
+               return EPERM;
+
+       /* If GET, that's it. */
+
+       if(call_nr == GETPRIORITY) {
+               return rmp->mp_nice - PRIO_MIN;
+       }
+
+       /* Only root is allowed to reduce the nice level. */
+       if(rmp->mp_nice > arg_pri && mp->mp_effuid != SUPER_USER)
+               return EACCES;
+
+       /* We're SET, and it's allowed. Do it and tell kernel. */
+       rmp->mp_nice = arg_pri;
+       return sys_setpriority(rmp_nr, arg_pri);
+}
+
 /*=====================================================================*
  *                         do_svrctl                                  *
  *=====================================================================*/
index b873e35fdd2eb15bf2fd2e19466c0fc092ef90b9..755fd2ba0bc752e73c7a535c1304105bbb1988e2 100644 (file)
@@ -46,6 +46,9 @@ EXTERN struct mproc {
   struct mproc *mp_swapq;      /* queue of procs waiting to be swapped in */
   message mp_reply;            /* reply message to be sent to one */
 
+  /* Scheduling priority. */
+  signed int mp_nice;          /* nice is PRIO_MIN..PRIO_MAX, standard 0. */
+
   char mp_name[PROC_NAME_LEN]; /* process name */
 } mproc[NR_PROCS];
 
index 2e29ebee3a06d19bb1db6f3e276feec3ceb917bb..108992b4318e1f1b5b62e2284915b7d0bf48415f 100644 (file)
@@ -59,7 +59,7 @@ _PROTOTYPE( int do_getprocnr, (void)                                  );
 _PROTOTYPE( int do_svrctl, (void)                                      );
 _PROTOTYPE( int do_allocmem, (void)                                    );
 _PROTOTYPE( int do_freemem, (void)                                     );
-_PROTOTYPE( int do_mstats, (void)                                      );
+_PROTOTYPE( int do_getsetpriority, (void)                                      );
 
 #if (MACHINE == MACINTOSH)
 _PROTOTYPE( phys_clicks start_click, (void)                            );
@@ -100,4 +100,5 @@ _PROTOTYPE( void tell_fs, (int what, int p1, int p2, int p3)                );
 _PROTOTYPE( int get_stack_ptr, (int proc_nr, vir_bytes *sp)            );
 _PROTOTYPE( int get_mem_map, (int proc_nr, struct mem_map *mem_map)    );
 _PROTOTYPE( char *find_param, (const char *key));
+_PROTOTYPE( int proc_from_pid, (pid_t p));
 
index 3adec3153334ce99b2a44e1343354f3904d3f487..1768dd41417a94bcfea93c52f5c95963e53952ea 100644 (file)
@@ -103,6 +103,9 @@ _PROTOTYPE (int (*call_vec[NCALLS]), (void) ) = {
        do_freemem,     /* 84 = memfree */
        no_sys,         /* 85 = select */
        no_sys,         /* 86 = fchdir */
+       no_sys,         /* 87 = fsync */
+       do_getsetpriority,      /* 88 = getpriority */
+       do_getsetpriority,      /* 89 = setpriority */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index 0e8c577c91e0b64cae5bdd594df797627dc86641..8301adda0f90c4aeece9224d32afec30be64aa09 100644 (file)
@@ -9,6 +9,7 @@
  *   tell_fs:          interface to FS
  *   get_mem_map:      get memory map of given process
  *   get_stack_ptr:    get stack pointer of given process      
+ *   proc_from_pid:    return process pointer from pid number
  */
 
 #include "pm.h"
@@ -200,3 +201,18 @@ vir_bytes *sp;                                     /* put stack pointer here */
   return(OK);
 }
 
+/*===========================================================================*
+ *                             proc_from_pid                                *
+ *===========================================================================*/
+PUBLIC int proc_from_pid(mp_pid)
+pid_t mp_pid;
+{
+       int rmp;
+
+       for (rmp = 0; rmp < NR_PROCS; rmp++)
+               if (mproc[rmp].mp_pid == mp_pid)
+                       return rmp;
+
+       return -1;
+}
+