Changeset 817cbf7 in rtems-libbsd


Ignore:
Timestamp:
May 12, 2017, 12:16:27 PM (2 years ago)
Author:
Kevin Kirspel <kevin-kirspel@…>
Branches:
fd86c091b97759106da7355ce1dd81ebe030e285, f020f08430150c1656a0ad0a1de13699db9b980b
Children:
67de3b5
Parents:
6afe73d
git-author:
Kevin Kirspel <kevin-kirspel@…> (05/12/17 12:16:27)
git-committer:
Sebastian Huber <sebastian.huber@…> (05/12/17 12:20:33)
Message:

devfs: Fix some issues

Fix issue with cdev private data usage with RTEMS iop structure. Add
support for cdev alias device names. Add support for cdev fstat.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/fs/devfs/devfs_vnops.c

    r6afe73d r817cbf7  
    205205}
    206206
     207#ifndef __rtems__
    207208static void
     209#else /* __rtems__ */
     210void
     211#endif /* __rtems__ */
    208212devfs_fpdrop(struct file *fp)
    209213{
  • freebsd/sys/kern/kern_conf.c

    r6afe73d r817cbf7  
    855855
    856856        devfs_create(dev);
    857 #ifndef __rtems__
    858857        clean_unrhdrl(devfs_inos);
    859 #endif /* __rtems__ */
    860858        dev_unlock_and_free();
    861859
     
    10211019        devfs_create(dev);
    10221020        dev_dependsl(pdev, dev);
    1023 #ifndef __rtems__
    10241021        clean_unrhdrl(devfs_inos);
    1025 #endif /* __rtems__ */
    10261022        dev_unlock();
    10271023
  • freebsd/sys/sys/file.h

    r6afe73d r817cbf7  
    200200#else /* __rtems__ */
    201201        rtems_libio_t   f_io;
    202         union {
    203                 struct cdev_privdata *fvn_cdevpriv;
    204                                         /* (d) Private data for the cdev. */
    205         } f_vnun;
    206202#endif /* __rtems__ */
    207203};
    208204#ifdef __rtems__
    209205#define f_data f_io.pathinfo.node_access_2
     206#define f_cdevpriv      f_io.data1
    210207
    211208static inline struct file *
     
    284281#endif /* __rtems__ */
    285282
     283#ifndef __rtems__
    286284#define f_cdevpriv      f_vnun.fvn_cdevpriv
    287285#define f_advice        f_vnun.fvn_advice
     286#endif /* __rtems__ */
    288287
    289288#define FOFFSET_LOCKED       0x1
  • rtemsbsd/sys/fs/devfs/devfs_devs.c

    r6afe73d r817cbf7  
    3838#include <sys/malloc.h>
    3939#include <sys/proc.h>
     40#include <sys/poll.h>
    4041#include <stdlib.h>
    4142#include <string.h>
     
    7576        struct thread *td = rtems_bsd_get_curthread_or_null();
    7677        struct file *fpop;
    77         int error;
     78        struct cdevsw *dsw;
     79        int error, ref;
    7880
    7981        if (td != NULL) {
     82                if (cdev == NULL) {
     83                        error = ENXIO;
     84                        goto err;
     85                }
     86                if (cdev->si_flags & SI_ALIAS) {
     87                        cdev = cdev->si_parent;
     88                }
     89                dsw = dev_refthread(cdev, &ref);
     90                if (dsw == NULL) {
     91                        error = ENXIO;
     92                        goto err;
     93                }
     94                if (fp == NULL) {
     95                        dev_relthread(cdev, ref);
     96                        error = ENXIO;
     97                        goto err;
     98                }
    8099                fpop = td->td_fpop;
    81100                curthread->td_fpop = fp;
    82                 error = cdev->si_devsw->d_open(cdev, oflag, 0, td);
     101                error = dsw->d_open(cdev, oflag + 1, 0, td);
    83102                /* Clean up any cdevpriv upon error. */
    84103                if (error != 0)
    85104                        devfs_clear_cdevpriv();
    86105                curthread->td_fpop = fpop;
     106                dev_relthread(cdev, ref);
    87107        } else {
    88108                error = ENOMEM;
    89109        }
    90110
     111err:
    91112        return rtems_bsd_error_to_status_and_errno(error);
    92113}
     
    100121        int flags = rtems_libio_to_fcntl_flags(iop->flags);
    101122        struct file *fpop;
    102         int error;
     123        struct cdevsw *dsw;
     124        int error, ref;
    103125
    104126        if (td != NULL) {
     127                if (cdev == NULL) {
     128                        error = ENXIO;
     129                        goto err;
     130                }
     131                if (cdev->si_flags & SI_ALIAS) {
     132                        cdev = cdev->si_parent;
     133                }
     134                dsw = dev_refthread(cdev, &ref);
     135                if (dsw == NULL) {
     136                        error = ENXIO;
     137                        goto err;
     138                }
    105139                fpop = td->td_fpop;
    106140                curthread->td_fpop = fp;
    107                 error = cdev->si_devsw->d_close(cdev, flags, 0, td);
     141                error = dsw->d_close(cdev, flags, 0, td);
    108142                curthread->td_fpop = fpop;
     143                dev_relthread(cdev, ref);
     144                if (fp->f_cdevpriv != NULL)
     145                        devfs_fpdrop(fp);
    109146        } else {
    110147                error = ENOMEM;
    111148        }
    112149
     150err:
    113151        return rtems_bsd_error_to_status_and_errno(error);
    114152}
     
    131169        };
    132170        struct file *fpop;
    133         int error;
     171        struct cdevsw *dsw;
     172        int error, ref;
    134173
    135174        if (td != NULL) {
     175                if (cdev == NULL) {
     176                        error = ENXIO;
     177                        goto err;
     178                }
     179                if (cdev->si_flags & SI_ALIAS) {
     180                        cdev = cdev->si_parent;
     181                }
     182                dsw = dev_refthread(cdev, &ref);
     183                if (dsw == NULL) {
     184                        error = ENXIO;
     185                        goto err;
     186                }
    136187                fpop = td->td_fpop;
    137188                curthread->td_fpop = fp;
    138                 error = cdev->si_devsw->d_read(cdev, &uio,
     189                error = dsw->d_read(cdev, &uio,
    139190                    rtems_libio_to_fcntl_flags(iop->flags));
    140191                td->td_fpop = fpop;
     192                dev_relthread(cdev, ref);
    141193        } else {
    142194                error = ENOMEM;
    143195        }
    144196
     197err:
    145198        if (error == 0) {
    146199                return (total - uio.uio_resid);
     
    178231        };
    179232        struct file *fpop;
    180         int error;
     233        struct cdevsw *dsw;
     234        int error, ref;
    181235
    182236        if (td != NULL) {
     237                if (cdev == NULL) {
     238                        error = ENXIO;
     239                        goto err;
     240                }
     241                if (cdev->si_flags & SI_ALIAS) {
     242                        cdev = cdev->si_parent;
     243                }
     244                dsw = dev_refthread(cdev, &ref);
     245                if (dsw == NULL) {
     246                        error = ENXIO;
     247                        goto err;
     248                }
    183249                fpop = td->td_fpop;
    184250                curthread->td_fpop = fp;
    185                 error = cdev->si_devsw->d_write(cdev, &uio,
     251                error = dsw->d_write(cdev, &uio,
    186252                    rtems_libio_to_fcntl_flags(iop->flags));
    187253                td->td_fpop = fpop;
     254                dev_relthread(cdev, ref);
    188255        } else {
    189256                error = ENOMEM;
    190257        }
    191258
     259err:
    192260        if (error == 0) {
    193261                return (total - uio.uio_resid);
     
    215283        struct thread *td = rtems_bsd_get_curthread_or_null();
    216284        struct file *fpop;
    217         int error;
     285        struct cdevsw *dsw;
     286        int error, ref;
    218287        int flags = rtems_libio_to_fcntl_flags(iop->flags);
    219288
    220289        if (td != 0) {
     290                if (cdev == NULL) {
     291                        error = ENXIO;
     292                        goto err;
     293                }
     294                if (cdev->si_flags & SI_ALIAS) {
     295                        cdev = cdev->si_parent;
     296                }
     297                dsw = dev_refthread(cdev, &ref);
     298                if (dsw == NULL) {
     299                        error = ENXIO;
     300                        goto err;
     301                }
    221302                fpop = td->td_fpop;
    222303                curthread->td_fpop = fp;
    223                 error = cdev->si_devsw->d_ioctl(cdev, request, buffer, flags,
     304                error = dsw->d_ioctl(cdev, request, buffer, flags,
    224305                    td);
    225306                td->td_fpop = fpop;
     307                dev_relthread(cdev, ref);
    226308        } else {
    227309                error = ENOMEM;
    228310        }
    229311
    230         return (rtems_bsd_error_to_status_and_errno(error));
     312err:
     313        return rtems_bsd_error_to_status_and_errno(error);
     314}
     315
     316static int
     317devfs_imfs_fstat(const rtems_filesystem_location_info_t *loc, struct stat *buf)
     318{
     319        int rv = 0;
     320        const IMFS_jnode_t *the_dev = loc->node_access;
     321
     322        if (the_dev != NULL) {
     323                buf->st_mode = the_dev->st_mode;
     324        } else {
     325                rv = rtems_filesystem_default_fstat(loc, buf);
     326        }
     327
     328        return rv;
    231329}
    232330
     
    238336        struct thread *td = rtems_bsd_get_curthread_or_wait_forever();
    239337        struct file *fpop;
    240         int error;
    241 
     338        struct cdevsw *dsw;
     339        int error, ref;
     340
     341        if (cdev == NULL) {
     342                return POLLERR;
     343        }
     344        if (cdev->si_flags & SI_ALIAS) {
     345                cdev = cdev->si_parent;
     346        }
     347        dsw = dev_refthread(cdev, &ref);
     348        if (dsw == NULL) {
     349                return POLLERR;
     350        }
    242351        fpop = td->td_fpop;
    243352        curthread->td_fpop = fp;
    244         error = cdev->si_devsw->d_poll(cdev, events, td);
     353        error = dsw->d_poll(cdev, events, td);
    245354        td->td_fpop = fpop;
     355        dev_relthread(cdev, ref);
    246356
    247357        return error;
     
    255365        struct thread *td = rtems_bsd_get_curthread_or_wait_forever();
    256366        struct file *fpop;
    257         int error;
    258 
     367        struct cdevsw *dsw;
     368        int error, ref;
     369
     370        if (cdev == NULL) {
     371                return EINVAL;
     372        }
     373        if (cdev->si_flags & SI_ALIAS) {
     374                cdev = cdev->si_parent;
     375        }
     376        dsw = dev_refthread(cdev, &ref);
     377        if (dsw == NULL) {
     378                return EINVAL;
     379        }
    259380        fpop = td->td_fpop;
    260381        curthread->td_fpop = fp;
    261         error = cdev->si_devsw->d_kqfilter(cdev, kn);
     382        error = dsw->d_kqfilter(cdev, kn);
    262383        td->td_fpop = fpop;
     384        dev_relthread(cdev, ref);
    263385
    264386        return error;
     
    272394        .ioctl_h = devfs_imfs_ioctl,
    273395        .lseek_h = rtems_filesystem_default_lseek_file,
    274         .fstat_h = rtems_filesystem_default_fstat,
     396        .fstat_h = devfs_imfs_fstat,
    275397        .ftruncate_h = rtems_filesystem_default_ftruncate,
    276398        .fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
Note: See TracChangeset for help on using the changeset viewer.