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