diff options
Diffstat (limited to 'fs/devfs.c')
-rw-r--r-- | fs/devfs.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/fs/devfs.c b/fs/devfs.c index b8b9fa25b1..865b9ccb79 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -47,29 +47,37 @@ struct cdev *cdev_by_name(const char *filename) return NULL; } -int devfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size) +ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags) { - struct cdev *cdev = f->inode; - if (!cdev->ops->read) return -ENOSYS; - return cdev->ops->read(cdev, buf, size, - f->pos + cdev->offset, f->flags); + return cdev->ops->read(cdev, buf, count, cdev->offset +offset, flags); } -int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t size) +ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags) { - struct cdev *cdev = f->inode; - if (!cdev->ops->write) return -ENOSYS; - return cdev->ops->write(cdev, buf, size, - f->pos + cdev->offset, f->flags); + return cdev->ops->write(cdev, buf, count, cdev->offset + offset, flags); +} + +static int devfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size) +{ + struct cdev *cdev = f->inode; + + return cdev_read(cdev, buf, size, f->pos, f->flags); +} + +static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t size) +{ + struct cdev *cdev = f->inode; + + return cdev_write(cdev, buf, size, f->pos, f->flags); } -off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) +static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) { struct cdev *cdev = f->inode; off_t ret = -1; @@ -83,7 +91,7 @@ off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos) return ret; } -int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset) +static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset) { struct cdev *cdev = f->inode; @@ -93,7 +101,7 @@ int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offs return cdev->ops->erase(cdev, count, offset + cdev->offset); } -int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot) +static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot) { struct cdev *cdev = f->inode; @@ -287,6 +295,8 @@ int devfs_create(struct cdev *new) return -EEXIST; list_add_tail(&new->list, &cdev_list); + if (new->dev) + list_add_tail(&new->devices_list, &new->dev->cdevs); return 0; } @@ -294,6 +304,8 @@ int devfs_create(struct cdev *new) void devfs_remove(struct cdev *cdev) { list_del(&cdev->list); + if (cdev->dev) + list_del(&cdev->devices_list); } int devfs_add_partition(const char *devname, unsigned long offset, size_t size, |