O_CLOEXEC

Kostik Belousov kostikbel at gmail.com
Fri Mar 25 14:56:20 UTC 2011


On Fri, Mar 25, 2011 at 09:36:56AM -0400, John Baldwin wrote:
> On Friday, March 25, 2011 8:34:22 am Kostik Belousov wrote:
> > On Fri, Mar 25, 2011 at 08:14:47AM -0400, John Baldwin wrote:
> > > On Thursday, March 24, 2011 8:59:24 pm Kostik Belousov wrote:
> > > > Hi,
> > > > below is the implementation of O_CLOEXEC flag for open(2). I also
> > > > handle the fhopen(2), since the man page states that fhopen(2) takes
> > > > the same flags as open(2), and it is more logical to change code
> > > > then man page.
> > > > 
> > > > It is somewhat curious that SUSv4 did not specified O_CLOEXEC behaviour
> > > > for posix_openpt(). I left it out, but it probably makes sense to
> > > > allow O_CLOEXEC there ?
> > > > 
> > > > The falloc() KPI is left as is because the function is often used
> > > > in the kernel and probably in the third-party modules. fdallocf()
> > > > takes additional flag argument to set close-on-exec before any other
> > > > thread might see new file descriptor.
> > > 
> > > Hmm, I don't actually expect falloc() to be used in 3rd party modules and 
> > > would be fine with just adding a new flags parameter to it.
> > 
> > The calls to falloc() appear in such modules as cryptodev(4).
> > I do not mind changing falloc interface, but I also intend to merge
> > O_CLOEXEC to stable/8. Are you fine with merging your suggestion to
> > stable branch, while falloc() is called from cryptodev, zlib,
> > linux (later is not a big issue if I bump __FreeBSD_version) ?
> 
> Hmmm, there are a few ways, but perhaps the simplest is to commit the
> current approach (and MFC it), but to do a followup commit to HEAD to
> remove fallocf() and add the flags argument to falloc(). That changes
> the KPI for 9+, but avoids growing the future KPI.

I will commit the change below after r219999 is merged to 8.

diff --git a/sys/dev/streams/streams.c b/sys/dev/streams/streams.c
index 7b99d20..00f65a3 100644
--- a/sys/dev/streams/streams.c
+++ b/sys/dev/streams/streams.c
@@ -241,7 +241,7 @@ streamsopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
 	}
 
 	fdp = td->td_proc->p_fd;
-	if ((error = falloc(td, &fp, &fd)) != 0)
+	if ((error = falloc(td, &fp, &fd, 0)) != 0)
 	  return error;
 	/* An extra reference on `fp' has been held for us by falloc(). */
 
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 21590d3..b69460a 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -1516,7 +1516,7 @@ fdavail(struct thread *td, int n)
  * release the FILEDESC lock.
  */
 int
-fallocf(struct thread *td, struct file **resultfp, int *resultfd, int flags)
+falloc(struct thread *td, struct file **resultfp, int *resultfd, int flags)
 {
 	struct proc *p = td->td_proc;
 	struct file *fp;
@@ -1569,13 +1569,6 @@ fallocf(struct thread *td, struct file **resultfp, int *resultfd, int flags)
 	return (0);
 }
 
-int
-falloc(struct thread *td, struct file **resultfp, int *resultfd)
-{
-
-	return (fallocf(td, resultfp, resultfd, 0));
-}
-
 /*
  * Build a new filedesc structure from another.
  * Copy the current, root, and jail root vnode references.
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 5df669d..e14ae02 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -684,7 +684,7 @@ kqueue(struct thread *td, struct kqueue_args *uap)
 	int fd, error;
 
 	fdp = td->td_proc->p_fd;
-	error = falloc(td, &fp, &fd);
+	error = falloc(td, &fp, &fd, 0);
 	if (error)
 		goto done2;
 
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index d3929b4..50b0389 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -348,7 +348,7 @@ kern_pipe(struct thread *td, int fildes[2])
 	rpipe->pipe_state |= PIPE_DIRECTOK;
 	wpipe->pipe_state |= PIPE_DIRECTOK;
 
-	error = falloc(td, &rf, &fd);
+	error = falloc(td, &rf, &fd, 0);
 	if (error) {
 		pipeclose(rpipe);
 		pipeclose(wpipe);
@@ -364,7 +364,7 @@ kern_pipe(struct thread *td, int fildes[2])
 	 * side while we are blocked trying to allocate the write side.
 	 */
 	finit(rf, FREAD | FWRITE, DTYPE_PIPE, rpipe, &pipeops);
-	error = falloc(td, &wf, &fd);
+	error = falloc(td, &wf, &fd, 0);
 	if (error) {
 		fdclose(fdp, rf, fildes[0], td);
 		fdrop(rf, td);
diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c
index afbef1f..b749f3f 100644
--- a/sys/kern/tty_pts.c
+++ b/sys/kern/tty_pts.c
@@ -805,7 +805,7 @@ posix_openpt(struct thread *td, struct posix_openpt_args *uap)
 	if (uap->flags & ~(O_RDWR|O_NOCTTY))
 		return (EINVAL);
 	
-	error = falloc(td, &fp, &fd);
+	error = falloc(td, &fp, &fd, 0);
 	if (error)
 		return (error);
 
diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c
index f757cc5..9b334ac 100644
--- a/sys/kern/uipc_mqueue.c
+++ b/sys/kern/uipc_mqueue.c
@@ -1974,7 +1974,7 @@ kern_kmq_open(struct thread *td, const char *upath, int flags, mode_t mode,
 	if (len < 2  || path[0] != '/' || index(path + 1, '/') != NULL)
 		return (EINVAL);
 
-	error = falloc(td, &fp, &fd);
+	error = falloc(td, &fp, &fd, 0);
 	if (error)
 		return (error);
 
diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 6ade212..917c343 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -422,7 +422,7 @@ ksem_create(struct thread *td, const char *name, semid_t *semidp, mode_t mode,
 
 	fdp = td->td_proc->p_fd;
 	mode = (mode & ~fdp->fd_cmask) & ACCESSPERMS;
-	error = falloc(td, &fp, &fd);
+	error = falloc(td, &fp, &fd, 0);
 	if (error) {
 		if (name == NULL)
 			error = ENOSPC;
diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index cef8317..00496af 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -496,7 +496,7 @@ shm_open(struct thread *td, struct shm_open_args *uap)
 	fdp = td->td_proc->p_fd;
 	cmode = (uap->mode & ~fdp->fd_cmask) & ACCESSPERMS;
 
-	error = falloc(td, &fp, &fd);
+	error = falloc(td, &fp, &fd, 0);
 	if (error)
 		return (error);
 
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index d3326d4..a4bbdba 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -176,7 +176,7 @@ socket(td, uap)
 		return (error);
 #endif
 	fdp = td->td_proc->p_fd;
-	error = falloc(td, &fp, &fd);
+	error = falloc(td, &fp, &fd, 0);
 	if (error)
 		return (error);
 	/* An extra reference on `fp' has been held for us by falloc(). */
@@ -358,7 +358,7 @@ kern_accept(struct thread *td, int s, struct sockaddr **name,
 	if (error != 0)
 		goto done;
 #endif
-	error = falloc(td, &nfp, &fd);
+	error = falloc(td, &nfp, &fd, 0);
 	if (error)
 		goto done;
 	ACCEPT_LOCK();
@@ -606,12 +606,12 @@ kern_socketpair(struct thread *td, int domain, int type, int protocol,
 	if (error)
 		goto free1;
 	/* On success extra reference to `fp1' and 'fp2' is set by falloc. */
-	error = falloc(td, &fp1, &fd);
+	error = falloc(td, &fp1, &fd, 0);
 	if (error)
 		goto free2;
 	rsv[0] = fd;
 	fp1->f_data = so1;	/* so1 already has ref count */
-	error = falloc(td, &fp2, &fd);
+	error = falloc(td, &fp2, &fd, 0);
 	if (error)
 		goto free3;
 	fp2->f_data = so2;	/* so2 already has ref count */
@@ -2299,7 +2299,7 @@ sctp_peeloff(td, uap)
 	 * but that is ok.
 	 */
 
-	error = falloc(td, &nfp, &fd);
+	error = falloc(td, &nfp, &fd, 0);
 	if (error)
 		goto done;
 	td->td_retval[0] = fd;
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index fe66591..dc1e262 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -1069,7 +1069,7 @@ kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg,
 	else
 		flags = FFLAGS(flags);
 
-	error = fallocf(td, &nfp, &indx, flags);
+	error = falloc(td, &nfp, &indx, flags);
 	if (error)
 		return (error);
 	/* An extra reference on `nfp' has been held for us by falloc(). */
@@ -4488,7 +4488,7 @@ fhopen(td, uap)
 	 * end of vn_open code
 	 */
 
-	if ((error = fallocf(td, &nfp, &indx, fmode)) != 0) {
+	if ((error = falloc(td, &nfp, &indx, fmode)) != 0) {
 		if (fmode & FWRITE)
 			vp->v_writecount--;
 		goto bad;
diff --git a/sys/opencrypto/cryptodev.c b/sys/opencrypto/cryptodev.c
index 6a10f9a..2c0c503 100644
--- a/sys/opencrypto/cryptodev.c
+++ b/sys/opencrypto/cryptodev.c
@@ -1109,7 +1109,7 @@ cryptoioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread
 		TAILQ_INIT(&fcr->csessions);
 		fcr->sesn = 0;
 
-		error = falloc(td, &f, &fd);
+		error = falloc(td, &f, &fd, 0);
 
 		if (error) {
 			free(fcr, M_XDATA);
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
index c96d6f9..33dddca 100644
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -111,8 +111,7 @@ struct thread;
 int	closef(struct file *fp, struct thread *td);
 int	dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd,
 	    int mode, int error);
-int	falloc(struct thread *td, struct file **resultfp, int *resultfd);
-int	fallocf(struct thread *td, struct file **resultfp, int *resultfd,
+int	falloc(struct thread *td, struct file **resultfp, int *resultfd,
 	    int flags);
 int	fdalloc(struct thread *td, int minfd, int *result);
 int	fdavail(struct thread *td, int n);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-fs/attachments/20110325/121ec9c8/attachment.pgp


More information about the freebsd-fs mailing list