Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Sep 2007 17:01:56 GMT
From:      Roman Divacky <rdivacky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 125976 for review
Message-ID:  <200709021701.l82H1uXT033223@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125976

Change 125976 by rdivacky@rdivacky_witten on 2007/09/02 17:00:56

	Implement F_SETSIG. This is for sockets only now. The LINUX_F_SETSIG will be
	moved to linux_file.h once this is created with *at patch import. This enables
	user-mode linux to mount rootfs.
	
	Tested by: "Yuriy Tsibizov" <yuriy.tsibizov@gmail.com>

Affected files ...

.. //depot/projects/soc2007/rdivacky/linux_fixes/sys/compat/linux/linux_file.c#2 edit
.. //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/kern_descrip.c#3 edit
.. //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/kern_sig.c#2 edit
.. //depot/projects/soc2007/rdivacky/linux_fixes/sys/sys/sigio.h#2 edit

Differences ...

==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/compat/linux/linux_file.c#2 (text+ko) ====

@@ -47,6 +47,7 @@
 #include <sys/proc.h>
 #include <sys/stat.h>
 #include <sys/sx.h>
+#include <sys/socketvar.h>
 #include <sys/syscallsubr.h>
 #include <sys/sysproto.h>
 #include <sys/tty.h>
@@ -1131,8 +1132,29 @@
 	struct file *fp;
 	long arg;
 	int error, result;
+	struct socket *so;
 
 	switch (args->cmd) {
+#define LINUX_F_SETSIG                  10
+	case LINUX_F_SETSIG:
+		error = fget(td, args->fd, &fp);
+		if (error)
+			return (error);
+		/* XXX: should be extended for non-socket files too */
+	   	if (fp->f_type == DTYPE_SOCKET) {
+			so = (struct socket *)fp->f_data;
+			if (so->so_sigio == NULL) {
+				error = fsetown(td->td_proc->p_pid, &so->so_sigio);
+				if (error) {
+					fdrop(fp, td);
+					return (error);
+				}
+			}
+			so->so_sigio->sig = args->arg;
+		}
+			error = EINVAL;
+		fdrop(fp, td);
+		return (error);
 	case LINUX_F_DUPFD:
 		return (kern_fcntl(td, args->fd, F_DUPFD, args->arg));
 

==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/kern_descrip.c#3 (text+ko) ====

@@ -891,6 +891,7 @@
 	sigio->sio_pgid = pgid;
 	sigio->sio_ucred = crhold(curthread->td_ucred);
 	sigio->sio_myref = sigiop;
+	sigio->sig = 0;
 
 	sx_slock(&proctree_lock);
 	if (pgid > 0) {

==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/kern/kern_sig.c#2 (text+ko) ====

@@ -3187,6 +3187,9 @@
 		SIGIO_UNLOCK();
 		return;
 	}
+	if (sigio->sig != 0)
+		sig = sigio->sig;
+
 	if (sigio->sio_pgid > 0) {
 		PROC_LOCK(sigio->sio_proc);
 		if (CANSIGIO(sigio->sio_ucred, sigio->sio_proc->p_ucred))

==== //depot/projects/soc2007/rdivacky/linux_fixes/sys/sys/sigio.h#2 (text+ko) ====

@@ -53,6 +53,7 @@
 					 * 	the reference to this structure */
 	struct	ucred *sio_ucred;	/* (c)	current credentials */
 	pid_t	sio_pgid;		/* (c)	pgid for signals */
+	int	sig;			/* (pg)	signal to be sent */
 };
 #define	sio_proc	sio_u.siu_proc
 #define	sio_pgrp	sio_u.siu_pgrp



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