svn commit: r202053 - user/kmacy/releng_8_rump/lib/libunet

Kip Macy kmacy at FreeBSD.org
Mon Jan 11 00:11:17 UTC 2010


Author: kmacy
Date: Mon Jan 11 00:11:16 2010
New Revision: 202053
URL: http://svn.freebsd.org/changeset/base/202053

Log:
  add basic descriptor management

Modified:
  user/kmacy/releng_8_rump/lib/libunet/unet_kern_descrip.c

Modified: user/kmacy/releng_8_rump/lib/libunet/unet_kern_descrip.c
==============================================================================
--- user/kmacy/releng_8_rump/lib/libunet/unet_kern_descrip.c	Sun Jan 10 23:51:02 2010	(r202052)
+++ user/kmacy/releng_8_rump/lib/libunet/unet_kern_descrip.c	Mon Jan 11 00:11:16 2010	(r202053)
@@ -76,6 +76,15 @@ __FBSDID("$FreeBSD$");
 #include <sys/unistd.h>
 #include <sys/user.h>
 
+static MALLOC_DEFINE(M_FILEDESC, "filedesc", "Open file descriptor table");
+
+static uma_zone_t file_zone;
+
+volatile int openfiles;			/* actual number of open files */
+
+/* A mutex to protect the association between a proc and filedesc. */
+static struct mtx	fdesc_mtx;
+
 
 /*
  * This is common code for FIOSETOWN ioctl called by fcntl(fd, F_SETOWN, arg).
@@ -87,16 +96,13 @@ int
 fsetown(pid_t pgid, struct sigio **sigiop)
 {
 
-	panic("");
-
 	return (0);
 }
 	
 pid_t
 fgetown(struct sigio **sigiop)
 {
-	
-	panic("");
+
 	return (0);
 }
 
@@ -104,8 +110,7 @@ fgetown(struct sigio **sigiop)
 void
 funsetown(struct sigio **sigiop)
 {
-
-	panic("");
+	/* nothing to do here */
 }
 
 
@@ -119,8 +124,52 @@ funsetown(struct sigio **sigiop)
 int
 falloc(struct thread *td, struct file **resultfp, int *resultfd)
 {
-	panic("");
 
+	struct proc *p = td->td_proc;
+	struct file *fp;
+	int error, i;
+	int maxuserfiles = maxfiles - (maxfiles / 20);
+	static struct timeval lastfail;
+	static int curfail;
+
+	fp = uma_zalloc(file_zone, M_WAITOK | M_ZERO);
+	if ((openfiles >= maxuserfiles &&
+	    priv_check(td, PRIV_MAXFILES) != 0) ||
+	    openfiles >= maxfiles) {
+		if (ppsratecheck(&lastfail, &curfail, 1)) {
+			printf("kern.maxfiles limit exceeded by uid %i, please see tuning(7).\n",
+				td->td_ucred->cr_ruid);
+		}
+		uma_zfree(file_zone, fp);
+		return (ENFILE);
+	}
+	atomic_add_int(&openfiles, 1);
+	/*
+	 * If the process has file descriptor zero open, add the new file
+	 * descriptor to the list of open files at that point, otherwise
+	 * put it at the front of the list of open files.
+	 */
+	refcount_init(&fp->f_count, 1);
+	if (resultfp)
+		fhold(fp);
+	fp->f_cred = crhold(td->td_ucred);
+	fp->f_ops = &badfileops;
+	fp->f_data = NULL;
+	fp->f_vnode = NULL;
+	FILEDESC_XLOCK(p->p_fd);
+	if ((error = fdalloc(td, 0, &i))) {
+		FILEDESC_XUNLOCK(p->p_fd);
+		fdrop(fp, td);
+		if (resultfp)
+			fdrop(fp, td);
+		return (error);
+	}
+	p->p_fd->fd_ofiles[i] = fp;
+	FILEDESC_XUNLOCK(p->p_fd);
+	if (resultfp)
+		*resultfp = fp;
+	if (resultfd)
+		*resultfd = i;	
 	return (0);
 }
 
@@ -131,9 +180,24 @@ falloc(struct thread *td, struct file **
 int
 _fdrop(struct file *fp, struct thread *td)
 {
+	int error;
 
-	panic("");
-	return (0);
+	error = 0;
+	if (fp->f_count != 0)
+		panic("fdrop: count %d", fp->f_count);
+	if (fp->f_ops != &badfileops)
+		error = fo_close(fp, td);
+	/*
+	 * The f_cdevpriv cannot be assigned non-NULL value while we
+	 * are destroying the file.
+	 */
+	if (fp->f_cdevpriv != NULL)
+		devfs_fpdrop(fp);
+	atomic_subtract_int(&openfiles, 1);
+	crfree(fp->f_cred);
+	uma_zfree(file_zone, fp);
+
+	return (error);
 }
 	
 void
@@ -245,6 +309,18 @@ fget_write(struct thread *td, int fd, st
 }
 
 
+/* ARGSUSED*/
+static void
+filelistinit(void *dummy)
+{
+
+	file_zone = uma_zcreate("Files", sizeof(struct file), NULL, NULL,
+	    NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE);
+	mtx_init(&sigio_lock, "sigio lock", NULL, MTX_DEF);
+	mtx_init(&fdesc_mtx, "fdesc", NULL, MTX_DEF);
+}
+SYSINIT(select, SI_SUB_LOCK, SI_ORDER_FIRST, filelistinit, NULL);
+
 /*-------------------------------------------------------------------*/
 
 static int


More information about the svn-src-user mailing list