Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Feb 2013 06:11:39 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r247384 - in user/dchagin/lemul/sys: amd64/linux32 compat/linux i386/linux
Message-ID:  <201302270611.r1R6BdXZ032972@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dchagin
Date: Wed Feb 27 06:11:39 2013
New Revision: 247384
URL: http://svnweb.freebsd.org/changeset/base/247384

Log:
  Implement prlimit64() system call.

Modified:
  user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c
  user/dchagin/lemul/sys/amd64/linux32/syscalls.master
  user/dchagin/lemul/sys/compat/linux/linux_misc.c
  user/dchagin/lemul/sys/i386/linux/linux_dummy.c
  user/dchagin/lemul/sys/i386/linux/syscalls.master

Modified: user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c	Wed Feb 27 05:06:59 2013	(r247383)
+++ user/dchagin/lemul/sys/amd64/linux32/linux32_dummy.c	Wed Feb 27 06:11:39 2013	(r247384)
@@ -139,8 +139,6 @@ DUMMY(perf_event_open);
 DUMMY(recvmmsg);
 DUMMY(fanotify_init);
 DUMMY(fanotify_mark);
-/* linux 2.6.36: */
-DUMMY(prlimit64);
 /* later: */
 DUMMY(name_to_handle_at);
 DUMMY(open_by_handle_at);

Modified: user/dchagin/lemul/sys/amd64/linux32/syscalls.master
==============================================================================
--- user/dchagin/lemul/sys/amd64/linux32/syscalls.master	Wed Feb 27 05:06:59 2013	(r247383)
+++ user/dchagin/lemul/sys/amd64/linux32/syscalls.master	Wed Feb 27 06:11:39 2013	(r247384)
@@ -551,7 +551,10 @@
 338	AUE_NULL	STD	{ int linux_fanotify_init(void); }
 339	AUE_NULL	STD	{ int linux_fanotify_mark(void); }
 ; linux 2.6.36:
-340	AUE_NULL	STD	{ int linux_prlimit64(void); }
+340	AUE_NULL	STD	{ int linux_prlimit64(l_pid_t pid,	\
+					l_uint resource,		\
+					struct rlimit *new,		\
+					struct rlimit *old); }
 ; later:
 341	AUE_NULL	STD	{ int linux_name_to_handle_at(void); }
 342	AUE_NULL	STD	{ int linux_open_by_handle_at(void); }

Modified: user/dchagin/lemul/sys/compat/linux/linux_misc.c
==============================================================================
--- user/dchagin/lemul/sys/compat/linux/linux_misc.c	Wed Feb 27 05:06:59 2013	(r247383)
+++ user/dchagin/lemul/sys/compat/linux/linux_misc.c	Wed Feb 27 06:11:39 2013	(r247384)
@@ -2015,3 +2015,58 @@ linux_to_bsd_waitopts(int options, int *
 		*bsdopts |= WLINUXCLONE;
 }
 
+int
+linux_prlimit64(struct thread *td, struct linux_prlimit64_args *args)
+{
+	struct rlimit rlim;
+	struct proc *p;
+	u_int which;
+	int error;
+
+#ifdef DEBUG
+	if (ldebug(prlimit64))
+		printf(ARGS(prlimit64, "%d, %d, %p, %p"), args->pid,
+		    args->resource, (void *)args->new, (void *)args->old);
+#endif
+
+	if (args->resource >= LINUX_RLIM_NLIMITS)
+		return (EINVAL);
+
+	which = linux_to_bsd_resource[args->resource];
+	if (which == -1)
+		return (EINVAL);
+
+	if (args->pid == 0) {
+		p = td->td_proc;
+		PROC_LOCK(p);
+	} else {
+		p = pfind(args->pid);
+		if (p == NULL)
+			return (ESRCH);
+	}
+	error = p_cansee(td, p);
+	if (error) {
+		PROC_UNLOCK(p);
+		return (EPERM);
+	}
+
+	_PHOLD(p);
+
+	if (args->old) {
+		lim_rlimit(p, which, &rlim);
+		PROC_UNLOCK(p);
+		error = copyout(&rlim, args->old, sizeof(rlim));
+		if (error)
+			goto out;
+	} else
+		PROC_UNLOCK(p);
+
+	if (args->new) {
+		error = copyin(args->new, &rlim, sizeof(rlim));
+		if (error == 0)
+			error = kern_proc_setrlimit(td, p, which, &rlim);
+	}
+out:
+	PRELE(p);
+	return (error);
+}

Modified: user/dchagin/lemul/sys/i386/linux/linux_dummy.c
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/linux_dummy.c	Wed Feb 27 05:06:59 2013	(r247383)
+++ user/dchagin/lemul/sys/i386/linux/linux_dummy.c	Wed Feb 27 06:11:39 2013	(r247384)
@@ -130,8 +130,6 @@ DUMMY(perf_event_open);
 DUMMY(recvmmsg);
 DUMMY(fanotify_init);
 DUMMY(fanotify_mark);
-/* linux 2.6.36: */
-DUMMY(prlimit64);
 /* later: */
 DUMMY(name_to_handle_at);
 DUMMY(open_by_handle_at);

Modified: user/dchagin/lemul/sys/i386/linux/syscalls.master
==============================================================================
--- user/dchagin/lemul/sys/i386/linux/syscalls.master	Wed Feb 27 05:06:59 2013	(r247383)
+++ user/dchagin/lemul/sys/i386/linux/syscalls.master	Wed Feb 27 06:11:39 2013	(r247384)
@@ -561,7 +561,10 @@
 338	AUE_NULL	STD	{ int linux_fanotify_init(void); }
 339	AUE_NULL	STD	{ int linux_fanotify_mark(void); }
 ; linux 2.6.36:
-340	AUE_NULL	STD	{ int linux_prlimit64(void); }
+340	AUE_NULL	STD	{ int linux_prlimit64(l_pid_t pid,	\
+					l_uint resource,		\
+					struct rlimit *new,		\
+					struct rlimit *old); }
 ; later:
 341	AUE_NULL	STD	{ int linux_name_to_handle_at(void); }
 342	AUE_NULL	STD	{ int linux_open_by_handle_at(void); }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302270611.r1R6BdXZ032972>