Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.26-rc1 /kernel/sys.c

Filename:/kernel/sys.c
Lines Added:79
Lines Deleted:71
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25-git18  2.6.25-git17  2.6.25-git16  2.6.25-git15 
(Following) 2.6.26-rc2  2.6.26-rc3  2.6.26-rc3-git7  2.6.26-rc3-git8  2.6.26-rc4  2.6.26-rc5 

Location
[  2.6.26-rc1
  [  kernel
     o  sys.c

Patch

diff --git a/kernel/sys.c b/kernel/sys.c
index a626116..895d2d4 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -67,6 +67,12 @@
 #ifndef SET_ENDIAN
 # define SET_ENDIAN(a,b)   (-EINVAL)
 #endif
+#ifndef GET_TSC_CTL
+# define GET_TSC_CTL(a)      (-EINVAL)
+#endif
+#ifndef SET_TSC_CTL
+# define SET_TSC_CTL(a)      (-EINVAL)
+#endif
 
 /*
  * this is where the system-wide overflow UID and GID are defined, for
@@ -972,8 +978,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
       goto out;
 
    if (task_pgrp(p) != pgrp) {
-      detach_pid(p, PIDTYPE_PGID);
-      attach_pid(p, PIDTYPE_PGID, pgrp);
+      change_pid(p, PIDTYPE_PGID, pgrp);
       set_task_pgrp(p, pid_nr(pgrp));
    }
 
@@ -986,54 +991,67 @@ out:
 
 asmlinkage long sys_getpgid(pid_t pid)
 {
+   struct task_struct *p;
+   struct pid *grp;
+   int retval;
+
+   rcu_read_lock();
    if (!pid)
-      return task_pgrp_vnr(current);
+      grp = task_pgrp(current);
    else {
-      int retval;
-      struct task_struct *p;
-
-      read_lock(&tasklist_lock);
-      p = find_task_by_vpid(pid);
       retval = -ESRCH;
-      if (p) {
-         retval = security_task_getpgid(p);
-         if (!retval)
-            retval = task_pgrp_vnr(p);
-      }
-      read_unlock(&tasklist_lock);
-      return retval;
+      p = find_task_by_vpid(pid);
+      if (!p)
+         goto out;
+      grp = task_pgrp(p);
+      if (!grp)
+         goto out;
+
+      retval = security_task_getpgid(p);
+      if (retval)
+         goto out;
    }
+   retval = pid_vnr(grp);
+out:
+   rcu_read_unlock();
+   return retval;
 }
 
 #ifdef __ARCH_WANT_SYS_GETPGRP
 
 asmlinkage long sys_getpgrp(void)
 {
-   /* SMP - assuming writes are word atomic this is fine */
-   return task_pgrp_vnr(current);
+   return sys_getpgid(0);
 }
 
 #endif
 
 asmlinkage long sys_getsid(pid_t pid)
 {
+   struct task_struct *p;
+   struct pid *sid;
+   int retval;
+
+   rcu_read_lock();
    if (!pid)
-      return task_session_vnr(current);
+      sid = task_session(current);
    else {
-      int retval;
-      struct task_struct *p;
-
-      rcu_read_lock();
-      p = find_task_by_vpid(pid);
       retval = -ESRCH;
-      if (p) {
-         retval = security_task_getsid(p);
-         if (!retval)
-            retval = task_session_vnr(p);
-      }
-      rcu_read_unlock();
-      return retval;
+      p = find_task_by_vpid(pid);
+      if (!p)
+         goto out;
+      sid = task_session(p);
+      if (!sid)
+         goto out;
+
+      retval = security_task_getsid(p);
+      if (retval)
+         goto out;
    }
+   retval = pid_vnr(sid);
+out:
+   rcu_read_unlock();
+   return retval;
 }
 
 asmlinkage long sys_setsid(void)
@@ -1539,6 +1557,19 @@ out:
  *
  */
 
+static void accumulate_thread_rusage(struct task_struct *t, struct rusage *r,
+                 cputime_t *utimep, cputime_t *stimep)
+{
+   *utimep = cputime_add(*utimep, t->utime);
+   *stimep = cputime_add(*stimep, t->stime);
+   r->ru_nvcsw += t->nvcsw;
+   r->ru_nivcsw += t->nivcsw;
+   r->ru_minflt += t->min_flt;
+   r->ru_majflt += t->maj_flt;
+   r->ru_inblock += task_io_get_inblock(t);
+   r->ru_oublock += task_io_get_oublock(t);
+}
+
 static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
 {
    struct task_struct *t;
@@ -1548,12 +1579,14 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
    memset((char *) r, 0, sizeof *r);
    utime = stime = cputime_zero;
 
-   rcu_read_lock();
-   if (!lock_task_sighand(p, &flags)) {
-      rcu_read_unlock();
-      return;
+   if (who == RUSAGE_THREAD) {
+      accumulate_thread_rusage(p, r, &utime, &stime);
+      goto out;
    }
 
+   if (!lock_task_sighand(p, &flags))
+      return;
+
    switch (who) {
       case RUSAGE_BOTH:
       case RUSAGE_CHILDREN:
@@ -1580,14 +1613,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
          r->ru_oublock += p->signal->oublock;
          t = p;
          do {
-            utime = cputime_add(utime, t->utime);
-            stime = cputime_add(stime, t->stime);
-            r->ru_nvcsw += t->nvcsw;
-            r->ru_nivcsw += t->nivcsw;
-            r->ru_minflt += t->min_flt;
-            r->ru_majflt += t->maj_flt;
-            r->ru_inblock += task_io_get_inblock(t);
-            r->ru_oublock += task_io_get_oublock(t);
+            accumulate_thread_rusage(t, r, &utime, &stime);
             t = next_thread(t);
          } while (t != p);
          break;
@@ -1595,10 +1621,9 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)
       default:
          BUG();
    }
-
    unlock_task_sighand(p, &flags);
-   rcu_read_unlock();
 
+out:
    cputime_to_timeval(utime, &r->ru_utime);
    cputime_to_timeval(stime, &r->ru_stime);
 }
@@ -1612,7 +1637,8 @@ int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
 
 asmlinkage long sys_getrusage(int who, struct rusage __user *ru)
 {
-   if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)
+   if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN &&
+       who != RUSAGE_THREAD)
       return -EINVAL;
    return getrusage(current, who, ru);
 }
@@ -1626,10 +1652,9 @@ asmlinkage long sys_umask(int mask)
 asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
            unsigned long arg4, unsigned long arg5)
 {
-   long error;
+   long uninitialized_var(error);
 
-   error = security_task_prctl(option, arg2, arg3, arg4, arg5);
-   if (error)
+   if (security_task_prctl(option, arg2, arg3, arg4, arg5, &error))
       return error;
 
    switch (option) {
@@ -1682,17 +1707,6 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
             error = -EINVAL;
          break;
 
-      case PR_GET_KEEPCAPS:
-         if (current->keep_capabilities)
-            error = 1;
-         break;
-      case PR_SET_KEEPCAPS:
-         if (arg2 != 0 && arg2 != 1) {
-            error = -EINVAL;
-            break;
-         }
-         current->keep_capabilities = arg2;
-         break;
       case PR_SET_NAME: {
          struct task_struct *me = current;
          unsigned char ncomm[sizeof(me->comm)];
@@ -1726,18 +1740,12 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
       case PR_SET_SECCOMP:
          error = prctl_set_seccomp(arg2);
          break;
-
-      case PR_CAPBSET_READ:
-         if (!cap_valid(arg2))
-            return -EINVAL;
-         return !!cap_raised(current->cap_bset, arg2);
-      case PR_CAPBSET_DROP:
-#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
-         return cap_prctl_drop(arg2);
-#else
-         return -EINVAL;
-#endif
-
+      case PR_GET_TSC:
+         error = GET_TSC_CTL(arg2);
+         break;
+      case PR_SET_TSC:
+         error = SET_TSC_CTL(arg2);
+         break;
       default:
          error = -EINVAL;
          break;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.