Revert commit 6514d561587fd1527fe6a26cb43e6b5742c8c779 in "rtemsbsd/sys/fs/devfs/devfs_devs.c". Using the FreeBSD file descriptors for the device file system is unnecessary.
Update #4475. --- freebsd/sys/fs/devfs/devfs_int.h | 3 +- freebsd/sys/fs/devfs/devfs_vnops.c | 4 +- rtemsbsd/sys/fs/devfs/devfs_devs.c | 181 ++++++++--------------------- 3 files changed, 53 insertions(+), 135 deletions(-) diff --git a/freebsd/sys/fs/devfs/devfs_int.h b/freebsd/sys/fs/devfs/devfs_int.h index e3991cbd..51064ed1 100644 --- a/freebsd/sys/fs/devfs/devfs_int.h +++ b/freebsd/sys/fs/devfs/devfs_int.h @@ -95,7 +95,8 @@ extern struct sx clone_drain_lock; extern struct mtx cdevpriv_mtx; extern TAILQ_HEAD(cdev_priv_list, cdev_priv) cdevp_list; #ifdef __rtems__ -void devfs_fpdrop(struct file *); +struct rtems_libio_tt; +void devfs_fpdrop(struct rtems_libio_tt *); #endif /* __rtems__ */ #endif /* _KERNEL */ diff --git a/freebsd/sys/fs/devfs/devfs_vnops.c b/freebsd/sys/fs/devfs/devfs_vnops.c index f1027e6f..9ca39259 100644 --- a/freebsd/sys/fs/devfs/devfs_vnops.c +++ b/freebsd/sys/fs/devfs/devfs_vnops.c @@ -209,10 +209,12 @@ devfs_destroy_cdevpriv(struct cdev_privdata *p) #ifndef __rtems__ static void +devfs_fpdrop(struct file *fp) #else /* __rtems__ */ +#define f_cdevpriv data1 void +devfs_fpdrop(rtems_libio_t *fp) #endif /* __rtems__ */ -devfs_fpdrop(struct file *fp) { struct cdev_privdata *p; diff --git a/rtemsbsd/sys/fs/devfs/devfs_devs.c b/rtemsbsd/sys/fs/devfs/devfs_devs.c index 39a38d62..c105661b 100644 --- a/rtemsbsd/sys/fs/devfs/devfs_devs.c +++ b/rtemsbsd/sys/fs/devfs/devfs_devs.c @@ -35,7 +35,6 @@ #include <sys/conf.h> #include <sys/kernel.h> #include <sys/file.h> -#include <sys/filedesc.h> #include <sys/malloc.h> #include <sys/proc.h> #include <sys/poll.h> @@ -43,8 +42,6 @@ #include <string.h> #include <unistd.h> -#include <machine/rtems-bsd-libio.h> - #include <fs/devfs/devfs_int.h> #include <machine/pcpu.h> @@ -76,24 +73,15 @@ devfs_imfs_open(rtems_libio_t *iop, const char *path, int oflag, mode_t mode) { struct cdev *cdev = devfs_imfs_get_context_by_iop(iop); struct thread *td = rtems_bsd_get_curthread_or_null(); - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; - int fd = -1; if (td != NULL) { if (cdev == NULL) { error = ENXIO; goto err; } - error = falloc(td, &fp, &fd, oflag); - if (error != 0) - goto err; - finit(fp, FREAD | FWRITE, DTYPE_DEV, NULL, NULL); - rtems_libio_iop_hold(iop); - rtems_bsd_libio_iop_set_bsd_descriptor(iop, fd); - rtems_bsd_libio_iop_set_bsd_file(iop, fp); if (cdev->si_flags & SI_ALIAS) { cdev = cdev->si_parent; } @@ -103,26 +91,19 @@ devfs_imfs_open(rtems_libio_t *iop, const char *path, int oflag, mode_t mode) goto err; } fpop = td->td_fpop; - curthread->td_fpop = fp; - fp->f_cdevpriv = NULL; + curthread->td_fpop = (struct file *)iop; + iop->data1 = NULL; error = dsw->d_open(cdev, oflag + 1, 0, td); /* Clean up any cdevpriv upon error. */ if (error != 0) devfs_clear_cdevpriv(); curthread->td_fpop = fpop; + dev_relthread(cdev, ref); } else { error = ENOMEM; } err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) { - if (error != 0) - fdclose(td, fp, fd); - else - fdrop(fp, td); - } return rtems_bsd_error_to_status_and_errno(error); } @@ -132,9 +113,8 @@ devfs_imfs_close(rtems_libio_t *iop) struct cdev *cdev = devfs_imfs_get_context_by_iop(iop); struct thread *td = rtems_bsd_get_curthread_or_null(); int flags = rtems_libio_to_fcntl_flags(iop->flags); - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; if (td != NULL) { @@ -145,31 +125,23 @@ devfs_imfs_close(rtems_libio_t *iop) if (cdev->si_flags & SI_ALIAS) { cdev = cdev->si_parent; } - fp = rtems_bsd_libio_iop_to_file_hold(iop, td); - if (fp == NULL) { - error = EBADF; - goto err; - } dsw = dev_refthread(cdev, &ref); if (dsw == NULL) { error = ENXIO; goto err; } fpop = td->td_fpop; - curthread->td_fpop = fp; + curthread->td_fpop = (struct file *)iop; error = dsw->d_close(cdev, flags, 0, td); curthread->td_fpop = fpop; - if (fp->f_cdevpriv != NULL) - devfs_fpdrop(fp); + dev_relthread(cdev, ref); + if (iop->data1 != NULL) + devfs_fpdrop(iop); } else { error = ENOMEM; } err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) - fdrop(fp, td); return rtems_bsd_error_to_status_and_errno(error); } @@ -188,9 +160,8 @@ devfs_imfs_readv(rtems_libio_t *iop, const struct iovec *iov, int iovcnt, .uio_rw = UIO_READ, .uio_td = td }; - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; if (td != NULL) { @@ -201,30 +172,22 @@ devfs_imfs_readv(rtems_libio_t *iop, const struct iovec *iov, int iovcnt, if (cdev->si_flags & SI_ALIAS) { cdev = cdev->si_parent; } - fp = rtems_bsd_libio_iop_to_file_hold(iop, td); - if (fp == NULL) { - error = EBADF; - goto err; - } dsw = dev_refthread(cdev, &ref); if (dsw == NULL) { error = ENXIO; goto err; } fpop = td->td_fpop; - curthread->td_fpop = fp; + curthread->td_fpop = (struct file *)iop; error = dsw->d_read(cdev, &uio, rtems_libio_to_fcntl_flags(iop->flags)); td->td_fpop = fpop; + dev_relthread(cdev, ref); } else { error = ENOMEM; } err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) - fdrop(fp, td); if (error == 0) { return (total - uio.uio_resid); } else { @@ -258,9 +221,8 @@ devfs_imfs_writev(rtems_libio_t *iop, const struct iovec *iov, int iovcnt, .uio_rw = UIO_WRITE, .uio_td = td }; - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; if (td != NULL) { @@ -271,30 +233,22 @@ devfs_imfs_writev(rtems_libio_t *iop, const struct iovec *iov, int iovcnt, if (cdev->si_flags & SI_ALIAS) { cdev = cdev->si_parent; } - fp = rtems_bsd_libio_iop_to_file_hold(iop, td); - if (fp == NULL) { - error = EBADF; - goto err; - } dsw = dev_refthread(cdev, &ref); if (dsw == NULL) { error = ENXIO; goto err; } fpop = td->td_fpop; - curthread->td_fpop = fp; + curthread->td_fpop = (struct file *)iop; error = dsw->d_write(cdev, &uio, rtems_libio_to_fcntl_flags(iop->flags)); td->td_fpop = fpop; + dev_relthread(cdev, ref); } else { error = ENOMEM; } err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) - fdrop(fp, td); if (error == 0) { return (total - uio.uio_resid); } else { @@ -318,9 +272,8 @@ devfs_imfs_ioctl(rtems_libio_t *iop, ioctl_command_t request, void *buffer) { struct cdev *cdev = devfs_imfs_get_context_by_iop(iop); struct thread *td = rtems_bsd_get_curthread_or_null(); - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; int flags = rtems_libio_to_fcntl_flags(iop->flags); @@ -332,30 +285,22 @@ devfs_imfs_ioctl(rtems_libio_t *iop, ioctl_command_t request, void *buffer) if (cdev->si_flags & SI_ALIAS) { cdev = cdev->si_parent; } - fp = rtems_bsd_libio_iop_to_file_hold(iop, td); - if (fp == NULL) { - error = EBADF; - goto err; - } dsw = dev_refthread(cdev, &ref); if (dsw == NULL) { error = ENXIO; goto err; } fpop = td->td_fpop; - curthread->td_fpop = fp; + curthread->td_fpop = (struct file *)iop; error = dsw->d_ioctl(cdev, request, buffer, flags, td); td->td_fpop = fpop; + dev_relthread(cdev, ref); } else { error = ENOMEM; } err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) - fdrop(fp, td); return rtems_bsd_error_to_status_and_errno(error); } @@ -379,42 +324,26 @@ devfs_imfs_poll(rtems_libio_t *iop, int events) { struct cdev *cdev = devfs_imfs_get_context_by_iop(iop); struct thread *td = rtems_bsd_get_curthread_or_wait_forever(); - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; - if (td != 0) { - if (cdev == NULL) { - error = POLLERR; - goto err; - } - if (cdev->si_flags & SI_ALIAS) { - cdev = cdev->si_parent; - } - fp = rtems_bsd_libio_iop_to_file_hold(iop, td); - if (fp == NULL) { - error = EBADF; - goto err; - } - dsw = dev_refthread(cdev, &ref); - if (dsw == NULL) { - error = POLLERR; - goto err; - } - fpop = td->td_fpop; - curthread->td_fpop = fp; - error = dsw->d_poll(cdev, events, td); - td->td_fpop = fpop; - } else { - error = ENOMEM; + if (cdev == NULL) { + return POLLERR; } + if (cdev->si_flags & SI_ALIAS) { + cdev = cdev->si_parent; + } + dsw = dev_refthread(cdev, &ref); + if (dsw == NULL) { + return POLLERR; + } + fpop = td->td_fpop; + curthread->td_fpop = (struct file *)iop; + error = dsw->d_poll(cdev, events, td); + td->td_fpop = fpop; + dev_relthread(cdev, ref); -err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) - fdrop(fp, td); return error; } @@ -423,40 +352,26 @@ devfs_imfs_kqfilter(rtems_libio_t *iop, struct knote *kn) { struct cdev *cdev = devfs_imfs_get_context_by_iop(iop); struct thread *td = rtems_bsd_get_curthread_or_wait_forever(); - struct file *fp = NULL; - struct cdevsw *dsw = NULL; struct file *fpop; + struct cdevsw *dsw; int error, ref; - if (td != 0) { - if (cdev == NULL) { - error = EINVAL; - } - fp = rtems_bsd_libio_iop_to_file_hold(iop, td); - if (fp == NULL) { - error = EBADF; - goto err; - } - if (cdev->si_flags & SI_ALIAS) { - cdev = cdev->si_parent; - } - dsw = dev_refthread(cdev, &ref); - if (dsw == NULL) { - error = EINVAL; - } - fpop = td->td_fpop; - curthread->td_fpop = fp; - error = dsw->d_kqfilter(cdev, kn); - td->td_fpop = fpop; - } else { - error = ENOMEM; + if (cdev == NULL) { + return EINVAL; + } + if (cdev->si_flags & SI_ALIAS) { + cdev = cdev->si_parent; } + dsw = dev_refthread(cdev, &ref); + if (dsw == NULL) { + return EINVAL; + } + fpop = td->td_fpop; + curthread->td_fpop = (struct file *)iop; + error = dsw->d_kqfilter(cdev, kn); + td->td_fpop = fpop; + dev_relthread(cdev, ref); -err: - if (dsw != NULL) - dev_relthread(cdev, ref); - if (td != NULL && fp != NULL) - fdrop(fp, td); return error; } -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel