PERFORCE change 46502 for review
John Baldwin
jhb at FreeBSD.org
Wed Feb 4 14:22:00 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=46502
Change 46502 by jhb at jhb_slimer on 2004/02/04 14:20:53
IFC @46501, loop back limit locking.
Affected files ...
.. //depot/projects/smpng/sys/alpha/linux/linux_machdep.c#16 integrate
.. //depot/projects/smpng/sys/alpha/linux/linux_proto.h#10 integrate
.. //depot/projects/smpng/sys/alpha/linux/linux_syscall.h#8 integrate
.. //depot/projects/smpng/sys/alpha/linux/linux_sysent.c#8 integrate
.. //depot/projects/smpng/sys/alpha/linux/syscalls.master#9 integrate
.. //depot/projects/smpng/sys/alpha/osf1/osf1_misc.c#25 integrate
.. //depot/projects/smpng/sys/alpha/osf1/osf1_proto.h#6 integrate
.. //depot/projects/smpng/sys/alpha/osf1/osf1_syscall.h#5 integrate
.. //depot/projects/smpng/sys/alpha/osf1/osf1_sysent.c#5 integrate
.. //depot/projects/smpng/sys/alpha/osf1/syscalls.master#5 integrate
.. //depot/projects/smpng/sys/compat/ia32/ia32_sysvec.c#8 integrate
.. //depot/projects/smpng/sys/compat/linux/linux_misc.c#45 integrate
.. //depot/projects/smpng/sys/compat/ndis/subr_ndis.c#8 integrate
.. //depot/projects/smpng/sys/compat/svr4/imgact_svr4.c#10 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_filio.c#14 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#30 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_proto.h#5 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_resource.c#9 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_syscall.h#4 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_syscallnames.c#4 integrate
.. //depot/projects/smpng/sys/compat/svr4/svr4_sysent.c#4 integrate
.. //depot/projects/smpng/sys/compat/svr4/syscalls.master#4 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.c#18 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.h#15 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.reg#13 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx.seq#12 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx_inline.h#12 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic79xx_pci.c#16 integrate
.. //depot/projects/smpng/sys/dev/aic7xxx/aic7xxx.c#18 integrate
.. //depot/projects/smpng/sys/dev/ofw/ofw_disk.c#9 integrate
.. //depot/projects/smpng/sys/dev/puc/pucdata.c#23 integrate
.. //depot/projects/smpng/sys/fs/fdescfs/fdesc_vfsops.c#11 integrate
.. //depot/projects/smpng/sys/fs/msdosfs/msdosfs_vnops.c#23 integrate
.. //depot/projects/smpng/sys/fs/nwfs/nwfs_io.c#11 integrate
.. //depot/projects/smpng/sys/fs/procfs/procfs_rlimit.c#4 integrate
.. //depot/projects/smpng/sys/fs/smbfs/smbfs_io.c#15 integrate
.. //depot/projects/smpng/sys/gnu/ext2fs/ext2_readwrite.c#5 integrate
.. //depot/projects/smpng/sys/i386/i386/apic_vector.s#6 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_isc_syscall.h#3 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_isc_sysent.c#4 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_misc.c#13 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_proto.h#5 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_syscall.h#4 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_sysent.c#5 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix.h#5 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix_syscall.h#4 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_xenix_sysent.c#5 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/syscalls.isc#3 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/syscalls.master#4 integrate
.. //depot/projects/smpng/sys/i386/ibcs2/syscalls.xenix#3 integrate
.. //depot/projects/smpng/sys/i386/isa/atpic_vector.s#6 integrate
.. //depot/projects/smpng/sys/i386/linux/imgact_linux.c#14 integrate
.. //depot/projects/smpng/sys/i386/linux/linux_machdep.c#24 integrate
.. //depot/projects/smpng/sys/i386/linux/linux_proto.h#14 integrate
.. //depot/projects/smpng/sys/i386/linux/linux_syscall.h#13 integrate
.. //depot/projects/smpng/sys/i386/linux/linux_sysent.c#14 integrate
.. //depot/projects/smpng/sys/i386/linux/syscalls.master#13 integrate
.. //depot/projects/smpng/sys/kern/imgact_aout.c#21 integrate
.. //depot/projects/smpng/sys/kern/imgact_elf.c#31 integrate
.. //depot/projects/smpng/sys/kern/imgact_gzip.c#9 integrate
.. //depot/projects/smpng/sys/kern/init_main.c#41 integrate
.. //depot/projects/smpng/sys/kern/kern_acct.c#31 integrate
.. //depot/projects/smpng/sys/kern/kern_descrip.c#56 integrate
.. //depot/projects/smpng/sys/kern/kern_exit.c#70 integrate
.. //depot/projects/smpng/sys/kern/kern_fork.c#71 integrate
.. //depot/projects/smpng/sys/kern/kern_resource.c#40 integrate
.. //depot/projects/smpng/sys/kern/kern_sig.c#86 integrate
.. //depot/projects/smpng/sys/kern/kern_subr.c#30 integrate
.. //depot/projects/smpng/sys/kern/kern_sx.c#21 integrate
.. //depot/projects/smpng/sys/kern/subr_trap.c#61 integrate
.. //depot/projects/smpng/sys/kern/sys_generic.c#30 integrate
.. //depot/projects/smpng/sys/kern/tty.c#39 integrate
.. //depot/projects/smpng/sys/kern/uipc_mbuf.c#25 integrate
.. //depot/projects/smpng/sys/kern/uipc_socket2.c#30 integrate
.. //depot/projects/smpng/sys/kern/uipc_syscalls.c#46 integrate
.. //depot/projects/smpng/sys/net/if.c#42 integrate
.. //depot/projects/smpng/sys/netinet/ip_output.c#49 integrate
.. //depot/projects/smpng/sys/netinet/raw_ip.c#35 integrate
.. //depot/projects/smpng/sys/netinet/tcp_input.c#46 integrate
.. //depot/projects/smpng/sys/netinet/tcp_output.c#20 integrate
.. //depot/projects/smpng/sys/netinet/udp_usrreq.c#38 integrate
.. //depot/projects/smpng/sys/netinet6/icmp6.c#21 integrate
.. //depot/projects/smpng/sys/netinet6/in6_src.c#17 integrate
.. //depot/projects/smpng/sys/netinet6/ip6_output.c#28 integrate
.. //depot/projects/smpng/sys/netinet6/ipsec.c#14 integrate
.. //depot/projects/smpng/sys/netinet6/ipsec.h#8 integrate
.. //depot/projects/smpng/sys/netinet6/ipsec6.h#4 integrate
.. //depot/projects/smpng/sys/netinet6/nd6_nbr.c#10 integrate
.. //depot/projects/smpng/sys/netinet6/raw_ip6.c#23 integrate
.. //depot/projects/smpng/sys/netinet6/udp6_output.c#15 integrate
.. //depot/projects/smpng/sys/netinet6/udp6_usrreq.c#26 integrate
.. //depot/projects/smpng/sys/nfsclient/nfs_bio.c#24 integrate
.. //depot/projects/smpng/sys/opencrypto/rijndael.c#3 integrate
.. //depot/projects/smpng/sys/posix4/_semaphore.h#3 integrate
.. //depot/projects/smpng/sys/posix4/semaphore.h#6 integrate
.. //depot/projects/smpng/sys/powerpc/include/pcpu.h#5 integrate
.. //depot/projects/smpng/sys/powerpc/powermac/openpic_macio.c#3 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/genassym.c#19 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/locore.S#3 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/machdep.c#48 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/nexus.c#6 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/pmap.c#36 integrate
.. //depot/projects/smpng/sys/powerpc/powerpc/trap_subr.S#9 integrate
.. //depot/projects/smpng/sys/powerpc/psim/psim-tree#2 integrate
.. //depot/projects/smpng/sys/sys/proc.h#110 integrate
.. //depot/projects/smpng/sys/sys/resource.h#9 integrate
.. //depot/projects/smpng/sys/sys/resourcevar.h#14 integrate
.. //depot/projects/smpng/sys/sys/sockio.h#7 integrate
.. //depot/projects/smpng/sys/sys/sx.h#12 integrate
.. //depot/projects/smpng/sys/sys/ttycom.h#2 integrate
.. //depot/projects/smpng/sys/sys/uio.h#15 integrate
.. //depot/projects/smpng/sys/ufs/ffs/ffs_vnops.c#26 integrate
.. //depot/projects/smpng/sys/vm/vm_glue.c#37 integrate
.. //depot/projects/smpng/sys/vm/vm_map.c#54 integrate
.. //depot/projects/smpng/sys/vm/vm_mmap.c#39 integrate
.. //depot/projects/smpng/sys/vm/vm_pageout.c#40 integrate
.. //depot/projects/smpng/sys/vm/vm_unix.c#9 integrate
Differences ...
==== //depot/projects/smpng/sys/alpha/linux/linux_machdep.c#16 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/linux/linux_machdep.c,v 1.32 2003/08/22 07:20:26 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/linux/linux_machdep.c,v 1.33 2004/02/04 21:52:52 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -382,7 +382,7 @@
if ((error =
copyin(uap->rlim, &rlim, sizeof (struct rlimit))))
return (error);
- return dosetrlimit(td, which, &rlim);
+ return (kern_setrlimit(td, which, &rlim));
}
int
@@ -390,7 +390,9 @@
struct thread *td;
struct linux_getrlimit_args *uap;
{
+ struct rlimit rlim;
u_int which;
+ int error;
#ifdef DEBUG
if (ldebug(getrlimit))
@@ -405,6 +407,9 @@
if (which == -1)
return EINVAL;
- return (copyout(&td->td_proc->p_rlimit[which],
- uap->rlim, sizeof (struct rlimit)));
+ PROC_LOCK(td->td_proc);
+ lim_rlimit(td->td_proc, which, &rlim);
+ PROC_UNLOCK(td->td_proc);
+ error = copyout(&rlim, uap->rlim, sizeof (struct rlimit));
+ return (error);
}
==== //depot/projects/smpng/sys/alpha/linux/linux_proto.h#10 (text+ko) ====
@@ -2,8 +2,8 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/alpha/linux/linux_proto.h,v 1.14 2003/12/23 03:53:50 peter Exp $
- * created from FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.54 2003/12/23 03:53:21 peter Exp
+ * $FreeBSD: src/sys/alpha/linux/linux_proto.h,v 1.15 2004/02/04 22:00:41 jhb Exp $
+ * created from FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.55 2004/02/04 21:56:59 jhb Exp
*/
#ifndef _LINUX_SYSPROTO_H_
==== //depot/projects/smpng/sys/alpha/linux/linux_syscall.h#8 (text+ko) ====
@@ -2,8 +2,8 @@
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/alpha/linux/linux_syscall.h,v 1.12 2003/12/23 03:53:50 peter Exp $
- * created from FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.54 2003/12/23 03:53:21 peter Exp
+ * $FreeBSD: src/sys/alpha/linux/linux_syscall.h,v 1.13 2004/02/04 22:00:41 jhb Exp $
+ * created from FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.55 2004/02/04 21:56:59 jhb Exp
*/
#define LINUX_SYS_exit 1
==== //depot/projects/smpng/sys/alpha/linux/linux_sysent.c#8 (text+ko) ====
@@ -2,8 +2,8 @@
* System call switch table.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/alpha/linux/linux_sysent.c,v 1.12 2003/12/23 03:53:50 peter Exp $
- * created from FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.54 2003/12/23 03:53:21 peter Exp
+ * $FreeBSD: src/sys/alpha/linux/linux_sysent.c,v 1.13 2004/02/04 22:00:41 jhb Exp $
+ * created from FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.55 2004/02/04 21:56:59 jhb Exp
*/
#include "opt_compat.h"
@@ -161,8 +161,8 @@
{ AS(ogetpeername_args), (sy_call_t *)ogetpeername }, /* 141 = ogetpeername */
{ 0, (sy_call_t *)nosys }, /* 142 = */
{ 0, (sy_call_t *)nosys }, /* 143 = */
- { AS(linux_getrlimit_args), (sy_call_t *)linux_getrlimit }, /* 144 = linux_getrlimit */
- { AS(linux_setrlimit_args), (sy_call_t *)linux_setrlimit }, /* 145 = linux_setrlimit */
+ { SYF_MPSAFE | AS(linux_getrlimit_args), (sy_call_t *)linux_getrlimit }, /* 144 = linux_getrlimit */
+ { SYF_MPSAFE | AS(linux_setrlimit_args), (sy_call_t *)linux_setrlimit }, /* 145 = linux_setrlimit */
{ 0, (sy_call_t *)nosys }, /* 146 = */
{ SYF_MPSAFE | 0, (sy_call_t *)setsid }, /* 147 = setsid */
{ 0, (sy_call_t *)linux_quotactl }, /* 148 = linux_quotactl */
==== //depot/projects/smpng/sys/alpha/linux/syscalls.master#9 (text+ko) ====
@@ -1,4 +1,4 @@
- $FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.54 2003/12/23 03:53:21 peter Exp $
+ $FreeBSD: src/sys/alpha/linux/syscalls.master,v 1.55 2004/02/04 21:56:59 jhb Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
; System call name/number master file (or rather, slave, from LINUX).
@@ -194,9 +194,9 @@
141 NOPROTO { int ogetpeername(int fdes, caddr_t asa, int *alen); }
142 UNIMPL
143 UNIMPL
-144 STD { int linux_getrlimit(l_uint resource, \
+144 MSTD { int linux_getrlimit(l_uint resource, \
struct l_rlimit *rlim); }
-145 STD { int linux_setrlimit(l_uint resource, \
+145 MSTD { int linux_setrlimit(l_uint resource, \
struct l_rlimit *rlim); }
146 UNIMPL
147 MNOPROTO { int setsid(void); }
==== //depot/projects/smpng/sys/alpha/osf1/osf1_misc.c#25 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/alpha/osf1/osf1_misc.c,v 1.44 2004/02/02 12:57:49 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/alpha/osf1/osf1_misc.c,v 1.45 2004/02/04 21:52:52 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -390,23 +390,25 @@
struct thread *td;
struct osf1_getrlimit_args *uap;
{
- struct __getrlimit_args /* {
- syscallarg(u_int) which;
- syscallarg(struct rlimit *) rlp;
- } */ a;
+ struct rlimit bsd_rlim;
+ struct proc *p;
+ int which;
if (uap->which >= OSF1_RLIMIT_NLIMITS)
return (EINVAL);
if (uap->which <= OSF1_RLIMIT_LASTCOMMON)
- a.which = uap->which;
+ which = uap->which;
else if (uap->which == OSF1_RLIMIT_NOFILE)
- a.which = RLIMIT_NOFILE;
+ which = RLIMIT_NOFILE;
else
return (0);
- a.rlp = (struct rlimit *)uap->rlp;
- return getrlimit(td, &a);
+ p = td->td_proc;
+ PROC_LOCK(p);
+ lim_rlimit(p, which, &bsd_rlim);
+ PROC_UNLOCK(p);
+ return (copyout(&bsd_rlim, uap->rlp, sizeof(bsd_rlim)));
}
@@ -415,23 +417,24 @@
struct thread *td;
struct osf1_setrlimit_args *uap;
{
- struct __setrlimit_args /* {
- syscallarg(u_int) which;
- syscallarg(struct rlimit *) rlp;
- } */ a;
+ struct rlimit bsd_rlim;
+ int error, which;
if (uap->which >= OSF1_RLIMIT_NLIMITS)
return (EINVAL);
if (uap->which <= OSF1_RLIMIT_LASTCOMMON)
- a.which = uap->which;
+ which = uap->which;
else if (uap->which == OSF1_RLIMIT_NOFILE)
- a.which = RLIMIT_NOFILE;
+ which = RLIMIT_NOFILE;
else
return (0);
- a.rlp = (struct rlimit *)uap->rlp;
+
+ error = copyin(uap->rlp, &bsd_rlim, sizeof(bsd_rlim));
+ if (error)
+ return (error);
- return setrlimit(td, &a);
+ return (kern_setrlimit(td, which, &bsd_rlim));
}
==== //depot/projects/smpng/sys/alpha/osf1/osf1_proto.h#6 (text+ko) ====
@@ -2,8 +2,8 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/alpha/osf1/osf1_proto.h,v 1.8 2003/12/24 00:26:34 peter Exp $
- * created from; FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.7 2003/12/24 00:26:09 peter Exp
+ * $FreeBSD: src/sys/alpha/osf1/osf1_proto.h,v 1.9 2004/02/04 22:00:41 jhb Exp $
+ * created from; FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.8 2004/02/04 21:57:00 jhb Exp
*/
#ifndef _OSF1_SYSPROTO_H_
==== //depot/projects/smpng/sys/alpha/osf1/osf1_syscall.h#5 (text+ko) ====
@@ -2,8 +2,8 @@
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/alpha/osf1/osf1_syscall.h,v 1.7 2003/12/24 00:26:34 peter Exp $
- * created from; FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.7 2003/12/24 00:26:09 peter Exp
+ * $FreeBSD: src/sys/alpha/osf1/osf1_syscall.h,v 1.8 2004/02/04 22:00:41 jhb Exp $
+ * created from; FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.8 2004/02/04 21:57:00 jhb Exp
*/
#define OSF1_SYS_nosys 0
==== //depot/projects/smpng/sys/alpha/osf1/osf1_sysent.c#5 (text+ko) ====
@@ -2,8 +2,8 @@
* System call switch table.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/alpha/osf1/osf1_sysent.c,v 1.7 2003/12/24 00:26:34 peter Exp $
- * created from; FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.7 2003/12/24 00:26:09 peter Exp
+ * $FreeBSD: src/sys/alpha/osf1/osf1_sysent.c,v 1.8 2004/02/04 22:00:41 jhb Exp $
+ * created from; FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.8 2004/02/04 21:57:00 jhb Exp
*/
#include "opt_compat.h"
@@ -162,8 +162,8 @@
{ AS(ogetpeername_args), (sy_call_t *)ogetpeername }, /* 141 = ogetpeername */
{ SYF_MPSAFE | 0, (sy_call_t *)ogethostid }, /* 142 = ogethostid */
{ SYF_MPSAFE | AS(osethostid_args), (sy_call_t *)osethostid }, /* 143 = osethostid */
- { AS(osf1_getrlimit_args), (sy_call_t *)osf1_getrlimit }, /* 144 = osf1_getrlimit */
- { AS(osf1_setrlimit_args), (sy_call_t *)osf1_setrlimit }, /* 145 = osf1_setrlimit */
+ { SYF_MPSAFE | AS(osf1_getrlimit_args), (sy_call_t *)osf1_getrlimit }, /* 144 = osf1_getrlimit */
+ { SYF_MPSAFE | AS(osf1_setrlimit_args), (sy_call_t *)osf1_setrlimit }, /* 145 = osf1_setrlimit */
{ 0, (sy_call_t *)nosys }, /* 146 = old killpg */
{ SYF_MPSAFE | 0, (sy_call_t *)setsid }, /* 147 = setsid */
{ 0, (sy_call_t *)nosys }, /* 148 = quotactl */
==== //depot/projects/smpng/sys/alpha/osf1/syscalls.master#5 (text+ko) ====
@@ -1,4 +1,4 @@
-; $FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.7 2003/12/24 00:26:09 peter Exp $
+; $FreeBSD: src/sys/alpha/osf1/syscalls.master,v 1.8 2004/02/04 21:57:00 jhb Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
; System call name/number master file (or rather, slave, from OSF1).
@@ -199,8 +199,8 @@
141 NOPROTO { int ogetpeername(int fdes, caddr_t asa, int *alen); }
142 MNOPROTO { int32_t ogethostid(void); }
143 MNOPROTO { int osethostid(int32_t hostid); }
-144 STD { int osf1_getrlimit(u_int which, struct rlimit *rlp); }
-145 STD { int osf1_setrlimit(u_int which, struct rlimit *rlp); }
+144 MSTD { int osf1_getrlimit(u_int which, struct rlimit *rlp); }
+145 MSTD { int osf1_setrlimit(u_int which, struct rlimit *rlp); }
146 UNIMPL old killpg
147 MNOPROTO { int setsid(void); }
148 UNIMPL quotactl
==== //depot/projects/smpng/sys/compat/ia32/ia32_sysvec.c#8 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ia32/ia32_sysvec.c,v 1.15 2003/12/23 02:42:38 peter Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ia32/ia32_sysvec.c,v 1.16 2004/02/04 21:52:52 jhb Exp $");
#include "opt_compat.h"
@@ -273,50 +273,33 @@
ia32_fixlimits(struct image_params *imgp)
{
struct proc *p = imgp->proc;
+ struct plimit *oldlim, *newlim;
+ if (ia32_maxdsiz == 0 && ia32_maxssiz == 0 && ia32_maxvmem == 0)
+ return;
+ newlim = lim_alloc();
+ PROC_LOCK(p);
+ oldlim = p->p_limit;
+ lim_copy(newlim, oldlim);
if (ia32_maxdsiz != 0) {
- if (p->p_rlimit[RLIMIT_DATA].rlim_cur > ia32_maxdsiz ||
- p->p_rlimit[RLIMIT_DATA].rlim_max > ia32_maxdsiz) {
- if (p->p_limit->p_refcnt > 1) {
- p->p_limit->p_refcnt--;
- p->p_limit = limcopy(p->p_limit);
- }
- if (p->p_rlimit[RLIMIT_DATA].rlim_cur > ia32_maxdsiz)
- p->p_rlimit[RLIMIT_DATA].rlim_cur =
- ia32_maxdsiz;
- if (p->p_rlimit[RLIMIT_DATA].rlim_max > ia32_maxdsiz)
- p->p_rlimit[RLIMIT_DATA].rlim_max =
- ia32_maxdsiz;
- }
+ if (newlim->pl_rlimit[RLIMIT_DATA].rlim_cur > ia32_maxdsiz)
+ newlim->pl_rlimit[RLIMIT_DATA].rlim_cur = ia32_maxdsiz;
+ if (newlim->pl_rlimit[RLIMIT_DATA].rlim_max > ia32_maxdsiz)
+ newlim->pl_rlimit[RLIMIT_DATA].rlim_max = ia32_maxdsiz;
}
if (ia32_maxssiz != 0) {
- if (p->p_rlimit[RLIMIT_STACK].rlim_cur > ia32_maxssiz ||
- p->p_rlimit[RLIMIT_STACK].rlim_max > ia32_maxssiz) {
- if (p->p_limit->p_refcnt > 1) {
- p->p_limit->p_refcnt--;
- p->p_limit = limcopy(p->p_limit);
- }
- if (p->p_rlimit[RLIMIT_STACK].rlim_cur > ia32_maxssiz)
- p->p_rlimit[RLIMIT_STACK].rlim_cur =
- ia32_maxssiz;
- if (p->p_rlimit[RLIMIT_STACK].rlim_max > ia32_maxssiz)
- p->p_rlimit[RLIMIT_STACK].rlim_max =
- ia32_maxssiz;
- }
+ if (newlim->pl_rlimit[RLIMIT_STACK].rlim_cur > ia32_maxssiz)
+ newlim->pl_rlimit[RLIMIT_STACK].rlim_cur = ia32_maxssiz;
+ if (newlim->pl_rlimit[RLIMIT_STACK].rlim_max > ia32_maxssiz)
+ newlim->pl_rlimit[RLIMIT_STACK].rlim_max = ia32_maxssiz;
}
if (ia32_maxvmem != 0) {
- if (p->p_rlimit[RLIMIT_VMEM].rlim_cur > ia32_maxvmem ||
- p->p_rlimit[RLIMIT_VMEM].rlim_max > ia32_maxvmem) {
- if (p->p_limit->p_refcnt > 1) {
- p->p_limit->p_refcnt--;
- p->p_limit = limcopy(p->p_limit);
- }
- if (p->p_rlimit[RLIMIT_VMEM].rlim_cur > ia32_maxvmem)
- p->p_rlimit[RLIMIT_VMEM].rlim_cur =
- ia32_maxvmem;
- if (p->p_rlimit[RLIMIT_VMEM].rlim_max > ia32_maxvmem)
- p->p_rlimit[RLIMIT_VMEM].rlim_max =
- ia32_maxvmem;
- }
+ if (newlim->pl_rlimit[RLIMIT_VMEM].rlim_cur > ia32_maxvmem)
+ newlim->pl_rlimit[RLIMIT_VMEM].rlim_cur = ia32_maxvmem;
+ if (newlim->pl_rlimit[RLIMIT_VMEM].rlim_max > ia32_maxvmem)
+ newlim->pl_rlimit[RLIMIT_VMEM].rlim_max = ia32_maxvmem;
}
+ p->p_limit = newlim;
+ PROC_UNLOCK(p);
+ lim_free(oldlim);
}
==== //depot/projects/smpng/sys/compat/linux/linux_misc.c#45 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.151 2004/01/02 19:29:31 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.152 2004/02/04 21:52:53 jhb Exp $");
#include "opt_mac.h"
@@ -378,20 +378,19 @@
goto cleanup;
}
- /* To protect td->td_proc->p_rlimit in the if condition. */
- mtx_assert(&Giant, MA_OWNED);
-
/*
* text/data/bss must not exceed limits
* XXX - this is not complete. it should check current usage PLUS
* the resources needed by this library.
*/
+ PROC_LOCK(td->td_proc);
if (a_out->a_text > maxtsiz ||
- a_out->a_data + bss_size >
- td->td_proc->p_rlimit[RLIMIT_DATA].rlim_cur) {
+ a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA)) {
+ PROC_UNLOCK(td->td_proc);
error = ENOMEM;
goto cleanup;
}
+ PROC_UNLOCK(td->td_proc);
mp_fixme("Unlocked vflags access.");
/* prevent more writers */
@@ -1111,7 +1110,7 @@
bsd_rlim.rlim_cur = (rlim_t)rlim.rlim_cur;
bsd_rlim.rlim_max = (rlim_t)rlim.rlim_max;
- return (dosetrlimit(td, which, &bsd_rlim));
+ return (kern_setrlimit(td, which, &bsd_rlim));
}
int
@@ -1119,7 +1118,7 @@
{
struct l_rlimit rlim;
struct proc *p = td->td_proc;
- struct rlimit *bsd_rlp;
+ struct rlimit bsd_rlim;
u_int which;
#ifdef DEBUG
@@ -1134,12 +1133,15 @@
which = linux_to_bsd_resource[args->resource];
if (which == -1)
return (EINVAL);
- bsd_rlp = &p->p_rlimit[which];
+
+ PROC_LOCK(p);
+ lim_rlimit(p, which, &bsd_rlim);
+ PROC_UNLOCK(p);
- rlim.rlim_cur = (unsigned long)bsd_rlp->rlim_cur;
+ rlim.rlim_cur = (unsigned long)bsd_rlim.rlim_cur;
if (rlim.rlim_cur == ULONG_MAX)
rlim.rlim_cur = LONG_MAX;
- rlim.rlim_max = (unsigned long)bsd_rlp->rlim_max;
+ rlim.rlim_max = (unsigned long)bsd_rlim.rlim_max;
if (rlim.rlim_max == ULONG_MAX)
rlim.rlim_max = LONG_MAX;
return (copyout(&rlim, args->rlim, sizeof(rlim)));
@@ -1150,7 +1152,7 @@
{
struct l_rlimit rlim;
struct proc *p = td->td_proc;
- struct rlimit *bsd_rlp;
+ struct rlimit bsd_rlim;
u_int which;
#ifdef DEBUG
@@ -1165,10 +1167,13 @@
which = linux_to_bsd_resource[args->resource];
if (which == -1)
return (EINVAL);
- bsd_rlp = &p->p_rlimit[which];
+
+ PROC_LOCK(p);
+ lim_rlimit(p, which, &bsd_rlim);
+ PROC_UNLOCK(p);
- rlim.rlim_cur = (l_ulong)bsd_rlp->rlim_cur;
- rlim.rlim_max = (l_ulong)bsd_rlp->rlim_max;
+ rlim.rlim_cur = (l_ulong)bsd_rlim.rlim_cur;
+ rlim.rlim_max = (l_ulong)bsd_rlim.rlim_max;
return (copyout(&rlim, args->rlim, sizeof(rlim)));
}
#endif /*!__alpha__*/
==== //depot/projects/smpng/sys/compat/ndis/subr_ndis.c#8 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.41 2004/02/03 07:39:23 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.42 2004/02/04 04:44:16 wpaul Exp $");
/*
* This file implements a translation layer between the BSD networking
@@ -171,7 +171,8 @@
static void ndis_mapshared_cb(void *, bus_dma_segment_t *, int, int);
__stdcall static void ndis_alloc_sharedmem(ndis_handle, uint32_t,
uint8_t, void **, ndis_physaddr *);
-__stdcall static void ndis_alloc_sharedmem_async(ndis_handle,
+static void ndis_asyncmem_complete(void *);
+__stdcall static ndis_status ndis_alloc_sharedmem_async(ndis_handle,
uint32_t, uint8_t, void *);
__stdcall static void ndis_free_sharedmem(ndis_handle, uint32_t,
uint8_t, void *, ndis_physaddr);
@@ -1319,32 +1320,68 @@
return;
}
-__stdcall static void
-ndis_alloc_sharedmem_async(adapter, len, cached, ctx)
- ndis_handle adapter;
- uint32_t len;
- uint8_t cached;
- void *ctx;
+struct ndis_allocwork {
+ ndis_handle na_adapter;
+ uint32_t na_len;
+ uint8_t na_cached;
+ void *na_ctx;
+};
+
+static void
+ndis_asyncmem_complete(arg)
+ void *arg;
{
ndis_miniport_block *block;
struct ndis_softc *sc;
+ struct ndis_allocwork *w;
void *vaddr;
ndis_physaddr paddr;
__stdcall ndis_allocdone_handler donefunc;
- if (adapter == NULL)
- return;
+ w = arg;
+ block = (ndis_miniport_block *)w->na_adapter;
+ sc = (struct ndis_softc *)(block->nmb_ifp);
+
+ vaddr = NULL;
+ paddr.np_quad = 0;
- block = (ndis_miniport_block *)adapter;
- sc = (struct ndis_softc *)(block->nmb_ifp);
donefunc = sc->ndis_chars.nmc_allocate_complete_func;
+ ndis_alloc_sharedmem(w->na_adapter, w->na_len,
+ w->na_cached, &vaddr, &paddr);
+ donefunc(w->na_adapter, vaddr, &paddr, w->na_len, w->na_ctx);
- ndis_alloc_sharedmem(adapter, len, cached, &vaddr, &paddr);
- donefunc(adapter, vaddr, &paddr, len, ctx);
+ free(arg, M_TEMP);
return;
}
+__stdcall static ndis_status
+ndis_alloc_sharedmem_async(adapter, len, cached, ctx)
+ ndis_handle adapter;
+ uint32_t len;
+ uint8_t cached;
+ void *ctx;
+{
+ struct ndis_allocwork *w;
+
+ if (adapter == NULL)
+ return(NDIS_STATUS_FAILURE);
+
+ w = malloc(sizeof(struct ndis_allocwork), M_TEMP, M_NOWAIT);
+
+ if (w == NULL)
+ return(NDIS_STATUS_FAILURE);
+
+ w->na_adapter = adapter;
+ w->na_cached = cached;
+ w->na_len = len;
+ w->na_ctx = ctx;
+
+ ndis_sched(ndis_asyncmem_complete, w, NDIS_TASKQUEUE);
+
+ return(NDIS_STATUS_PENDING);
+}
+
__stdcall static void
ndis_free_sharedmem(adapter, len, cached, vaddr, paddr)
ndis_handle adapter;
==== //depot/projects/smpng/sys/compat/svr4/imgact_svr4.c#10 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/imgact_svr4.c,v 1.21 2003/06/10 21:35:15 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/imgact_svr4.c,v 1.22 2004/02/04 21:52:53 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -104,14 +104,16 @@
/* text + data can't exceed file size */
if (a_out->a_data + a_out->a_text > imgp->attr->va_size)
return (EFAULT);
- /* For p_rlimit below. */
- mtx_assert(&Giant, MA_OWNED);
/*
* text/data/bss must not exceed limits
*/
+ PROC_LOCK(imgp->proc);
if (a_out->a_text > maxtsiz ||
- a_out->a_data + bss_size > imgp->proc->p_rlimit[RLIMIT_DATA].rlim_cur)
+ a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) {
+ PROC_UNLOCK(imgp->proc);
return (ENOMEM);
+ }
+ PROC_UNLOCK(imgp->proc);
VOP_UNLOCK(imgp->vp, 0, td);
==== //depot/projects/smpng/sys/compat/svr4/svr4_filio.c#14 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_filio.c,v 1.30 2003/10/20 10:38:48 tjr Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_filio.c,v 1.31 2004/02/04 21:52:53 jhb Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -66,10 +66,13 @@
int idx = 0, cerr;
u_long siz;
- mtx_assert(&Giant, MA_OWNED);
- if (uap->nfds > td->td_proc->p_rlimit[RLIMIT_NOFILE].rlim_cur &&
- uap->nfds > FD_SETSIZE)
- return (EINVAL);
+ PROC_LOCK(td->td_proc);
+ if (uap->nfds > lim_cur(td->td_proc, RLIMIT_NOFILE) &&
+ uap->nfds > FD_SETSIZE) {
+ PROC_UNLOCK(td->td_proc);
+ return (EINVAL);
+ }
+ PROC_UNLOCK(td->td_proc);
pa.fds = uap->fds;
pa.nfds = uap->nfds;
==== //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#30 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_misc.c,v 1.69 2004/01/21 17:10:47 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_misc.c,v 1.70 2004/02/04 21:52:53 jhb Exp $");
#include "opt_mac.h"
@@ -820,15 +820,15 @@
base = round_page((vm_offset_t) vm->vm_daddr);
ns = (vm_offset_t)uap->nsize;
new = round_page(ns);
- /* For p_rlimit. */
- mtx_assert(&Giant, MA_OWNED);
if (new > base) {
- if ((new - base) > (unsigned) td->td_proc->p_rlimit[RLIMIT_DATA].rlim_cur) {
+ PROC_LOCK(p);
+ if ((new - base) > (unsigned)lim_cur(p, RLIMIT_DATA)) {
+ PROC_UNLOCK(p);
return ENOMEM;
- }
- if (new >= VM_MAXUSER_ADDRESS) {
- return (ENOMEM);
- }
+ }
+ PROC_UNLOCK(p);
+ if (new >= VM_MAXUSER_ADDRESS)
+ return (ENOMEM);
} else if (new < base) {
/*
* This is simply an invalid value. If someone wants to
@@ -843,8 +843,12 @@
if (new > old) {
vm_size_t diff;
diff = new - old;
- if (vm->vm_map.size + diff > p->p_rlimit[RLIMIT_VMEM].rlim_cur)
+ PROC_LOCK(p);
+ if (vm->vm_map.size + diff > lim_cur(p, RLIMIT_VMEM)) {
+ PROC_UNLOCK(p);
return(ENOMEM);
+ }
+ PROC_UNLOCK(p);
rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE,
VM_PROT_ALL, VM_PROT_ALL, 0);
if (rv != KERN_SUCCESS) {
@@ -922,42 +926,33 @@
struct svr4_sys_ulimit_args *uap;
{
int *retval = td->td_retval;
+ int error;
switch (uap->cmd) {
case SVR4_GFILLIM:
- /* For p_rlimit below. */
- mtx_assert(&Giant, MA_OWNED);
- *retval = td->td_proc->p_rlimit[RLIMIT_FSIZE].rlim_cur / 512;
+ PROC_LOCK(td->td_proc);
+ *retval = lim_cur(td->td_proc, RLIMIT_FSIZE) / 512;
+ PROC_UNLOCK(td->td_proc);
if (*retval == -1)
*retval = 0x7fffffff;
return 0;
case SVR4_SFILLIM:
{
- int error;
- struct __setrlimit_args srl;
struct rlimit krl;
- caddr_t sg = stackgap_init();
- struct rlimit *url = (struct rlimit *)
- stackgap_alloc(&sg, sizeof *url);
krl.rlim_cur = uap->newlimit * 512;
- mtx_assert(&Giant, MA_OWNED);
- krl.rlim_max = td->td_proc->p_rlimit[RLIMIT_FSIZE].rlim_max;
+ PROC_LOCK(td->td_proc);
+ krl.rlim_max = lim_max(td->td_proc, RLIMIT_FSIZE);
+ PROC_UNLOCK(td->td_proc);
- error = copyout(&krl, url, sizeof(*url));
+ error = kern_setrlimit(td, RLIMIT_FSIZE, &krl);
if (error)
return error;
- srl.which = RLIMIT_FSIZE;
- srl.rlp = url;
-
- error = setrlimit(td, &srl);
- if (error)
- return error;
-
- mtx_assert(&Giant, MA_OWNED);
- *retval = td->td_proc->p_rlimit[RLIMIT_FSIZE].rlim_cur;
+ PROC_LOCK(td->td_proc);
+ *retval = lim_cur(td->td_proc, RLIMIT_FSIZE);
+ PROC_UNLOCK(td->td_proc);
if (*retval == -1)
*retval = 0x7fffffff;
return 0;
@@ -968,12 +963,15 @@
struct vmspace *vm = td->td_proc->p_vmspace;
register_t r;
- mtx_assert(&Giant, MA_OWNED);
- r = td->td_proc->p_rlimit[RLIMIT_DATA].rlim_cur;
+ PROC_LOCK(td->td_proc);
+ r = lim_cur(td->td_proc, RLIMIT_DATA);
+ PROC_UNLOCK(td->td_proc);
if (r == -1)
r = 0x7fffffff;
+ mtx_lock(&Giant); /* XXX */
r += (long) vm->vm_daddr;
+ mtx_unlock(&Giant);
if (r < 0)
r = 0x7fffffff;
*retval = r;
@@ -981,8 +979,9 @@
}
case SVR4_GDESLIM:
- mtx_assert(&Giant, MA_OWNED);
- *retval = td->td_proc->p_rlimit[RLIMIT_NOFILE].rlim_cur;
+ PROC_LOCK(td->td_proc);
+ *retval = lim_cur(td->td_proc, RLIMIT_NOFILE);
+ PROC_UNLOCK(td->td_proc);
if (*retval == -1)
*retval = 0x7fffffff;
return 0;
==== //depot/projects/smpng/sys/compat/svr4/svr4_proto.h#5 (text+ko) ====
@@ -2,8 +2,8 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/compat/svr4/svr4_proto.h,v 1.13 2003/12/24 00:02:08 peter Exp $
- * created from FreeBSD: src/sys/compat/svr4/syscalls.master,v 1.13 2003/12/24 00:00:47 peter Exp
+ * $FreeBSD: src/sys/compat/svr4/svr4_proto.h,v 1.14 2004/02/04 22:00:41 jhb Exp $
+ * created from FreeBSD: src/sys/compat/svr4/syscalls.master,v 1.14 2004/02/04 21:57:00 jhb Exp
*/
#ifndef _SVR4_SYSPROTO_H_
==== //depot/projects/smpng/sys/compat/svr4/svr4_resource.c#9 (text+ko) ====
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_resource.c,v 1.15 2003/06/10 21:35:15 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_resource.c,v 1.16 2004/02/04 21:52:53 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -136,9 +136,9 @@
if (rl == -1)
return EINVAL;
- /* For p_rlimit. */
- mtx_assert(&Giant, MA_OWNED);
- blim = td->td_proc->p_rlimit[rl];
+ PROC_LOCK(td->td_proc);
+ lim_rlimit(td->td_proc, rl, &blim);
+ PROC_UNLOCK(td->td_proc);
/*
* Our infinity, is their maxfiles.
@@ -177,20 +177,20 @@
struct svr4_sys_setrlimit_args *uap;
{
int rl = svr4_to_native_rl(uap->which);
- struct rlimit blim, *limp;
+ struct rlimit blim, curlim;
struct svr4_rlimit slim;
int error;
if (rl == -1)
return EINVAL;
- /* For p_rlimit. */
- mtx_assert(&Giant, MA_OWNED);
- limp = &td->td_proc->p_rlimit[rl];
-
if ((error = copyin(uap->rlp, &slim, sizeof(slim))) != 0)
return error;
+ PROC_LOCK(td->td_proc);
+ lim_rlimit(td->td_proc, rl, &curlim);
+ PROC_UNLOCK(td->td_proc);
+
/*
* if the limit is SVR4_RLIM_INFINITY, then we set it to our
* unlimited.
@@ -205,20 +205,20 @@
else if (OKLIMIT(slim.rlim_max))
blim.rlim_max = (rlim_t) slim.rlim_max;
else if (slim.rlim_max == SVR4_RLIM_SAVED_MAX)
- blim.rlim_max = limp->rlim_max;
+ blim.rlim_max = curlim.rlim_max;
else if (slim.rlim_max == SVR4_RLIM_SAVED_CUR)
- blim.rlim_max = limp->rlim_cur;
+ blim.rlim_max = curlim.rlim_cur;
if (slim.rlim_cur == SVR4_RLIM_INFINITY)
blim.rlim_cur = RLIM_INFINITY;
else if (OKLIMIT(slim.rlim_cur))
blim.rlim_cur = (rlim_t) slim.rlim_cur;
else if (slim.rlim_cur == SVR4_RLIM_SAVED_MAX)
- blim.rlim_cur = limp->rlim_max;
+ blim.rlim_cur = curlim.rlim_max;
else if (slim.rlim_cur == SVR4_RLIM_SAVED_CUR)
- blim.rlim_cur = limp->rlim_cur;
+ blim.rlim_cur = curlim.rlim_cur;
- return dosetrlimit(td, rl, &blim);
+ return (kern_setrlimit(td, rl, &blim));
}
@@ -234,9 +234,9 @@
if (rl == -1)
return EINVAL;
- /* For p_rlimit. */
- mtx_assert(&Giant, MA_OWNED);
- blim = td->td_proc->p_rlimit[rl];
+ PROC_LOCK(td->td_proc);
+ lim_rlimit(td->td_proc, rl, &blim);
+ PROC_UNLOCK(td->td_proc);
/*
* Our infinity, is their maxfiles.
@@ -275,20 +275,20 @@
struct svr4_sys_setrlimit64_args *uap;
{
int rl = svr4_to_native_rl(uap->which);
- struct rlimit blim, *limp;
+ struct rlimit blim, curlim;
struct svr4_rlimit64 slim;
int error;
if (rl == -1)
return EINVAL;
- /* For p_rlimit. */
- mtx_assert(&Giant, MA_OWNED);
- limp = &td->td_proc->p_rlimit[rl];
-
if ((error = copyin(uap->rlp, &slim, sizeof(slim))) != 0)
return error;
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list