svn commit: r284380 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Sun Jun 14 14:08:53 UTC 2015
Author: mjg
Date: Sun Jun 14 14:08:52 2015
New Revision: 284380
URL: https://svnweb.freebsd.org/changeset/base/284380
Log:
fd: move out actual fp installation to _finstall
Use it in fd passing functions as the first step towards fd code cleanup.
Modified:
head/sys/kern/kern_descrip.c
head/sys/kern/uipc_usrreq.c
head/sys/sys/filedesc.h
Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c Sun Jun 14 11:08:27 2015 (r284379)
+++ head/sys/kern/kern_descrip.c Sun Jun 14 14:08:52 2015 (r284380)
@@ -1750,26 +1750,18 @@ falloc_noinstall(struct thread *td, stru
/*
* Install a file in a file descriptor table.
*/
-int
-finstall(struct thread *td, struct file *fp, int *fd, int flags,
+void
+_finstall(struct filedesc *fdp, struct file *fp, int fd, int flags,
struct filecaps *fcaps)
{
- struct filedesc *fdp = td->td_proc->p_fd;
struct filedescent *fde;
- int error;
- KASSERT(fd != NULL, ("%s: fd == NULL", __func__));
- KASSERT(fp != NULL, ("%s: fp == NULL", __func__));
+ MPASS(fp != NULL);
if (fcaps != NULL)
filecaps_validate(fcaps, __func__);
+ FILEDESC_XLOCK_ASSERT(fdp);
- FILEDESC_XLOCK(fdp);
- if ((error = fdalloc(td, 0, fd))) {
- FILEDESC_XUNLOCK(fdp);
- return (error);
- }
- fhold(fp);
- fde = &fdp->fd_ofiles[*fd];
+ fde = &fdp->fd_ofiles[fd];
#ifdef CAPABILITIES
seq_write_begin(&fde->fde_seq);
#endif
@@ -1783,6 +1775,24 @@ finstall(struct thread *td, struct file
#ifdef CAPABILITIES
seq_write_end(&fde->fde_seq);
#endif
+}
+
+int
+finstall(struct thread *td, struct file *fp, int *fd, int flags,
+ struct filecaps *fcaps)
+{
+ struct filedesc *fdp = td->td_proc->p_fd;
+ int error;
+
+ MPASS(fd != NULL);
+
+ FILEDESC_XLOCK(fdp);
+ if ((error = fdalloc(td, 0, fd))) {
+ FILEDESC_XUNLOCK(fdp);
+ return (error);
+ }
+ fhold(fp);
+ _finstall(fdp, fp, *fd, flags, fcaps);
FILEDESC_XUNLOCK(fdp);
return (0);
}
Modified: head/sys/kern/uipc_usrreq.c
==============================================================================
--- head/sys/kern/uipc_usrreq.c Sun Jun 14 11:08:27 2015 (r284379)
+++ head/sys/kern/uipc_usrreq.c Sun Jun 14 14:08:52 2015 (r284380)
@@ -1736,7 +1736,7 @@ unp_externalize(struct mbuf *control, st
int i;
int *fdp;
struct filedesc *fdesc = td->td_proc->p_fd;
- struct filedescent *fde, **fdep;
+ struct filedescent **fdep;
void *data;
socklen_t clen = control->m_len, datalen;
int error, newfds;
@@ -1795,13 +1795,10 @@ unp_externalize(struct mbuf *control, st
goto next;
}
for (i = 0; i < newfds; i++, fdp++) {
- fde = &fdesc->fd_ofiles[*fdp];
- fde->fde_file = fdep[i]->fde_file;
- filecaps_move(&fdep[i]->fde_caps,
- &fde->fde_caps);
- if ((flags & MSG_CMSG_CLOEXEC) != 0)
- fde->fde_flags |= UF_EXCLOSE;
- unp_externalize_fp(fde->fde_file);
+ _finstall(fdesc, fdep[i]->fde_file, *fdp,
+ (flags & MSG_CMSG_CLOEXEC) != 0 ? UF_EXCLOSE : 0,
+ &fdep[i]->fde_caps);
+ unp_externalize_fp(fdep[i]->fde_file);
}
FILEDESC_XUNLOCK(fdesc);
free(fdep[0], M_FILECAPS);
Modified: head/sys/sys/filedesc.h
==============================================================================
--- head/sys/sys/filedesc.h Sun Jun 14 11:08:27 2015 (r284379)
+++ head/sys/sys/filedesc.h Sun Jun 14 14:08:52 2015 (r284380)
@@ -147,7 +147,9 @@ int dupfdopen(struct thread *td, struct
int falloc(struct thread *td, struct file **resultfp, int *resultfd,
int flags);
int falloc_noinstall(struct thread *td, struct file **resultfp);
-int finstall(struct thread *td, struct file *fp, int *resultfp, int flags,
+void _finstall(struct filedesc *fdp, struct file *fp, int fd, int flags,
+ struct filecaps *fcaps);
+int finstall(struct thread *td, struct file *fp, int *resultfd, int flags,
struct filecaps *fcaps);
int fdalloc(struct thread *td, int minfd, int *result);
int fdallocn(struct thread *td, int minfd, int *fds, int n);
More information about the svn-src-all
mailing list