From 02ba8a0542f119e02e63a3b4cd6ae5abfd8331f3 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 11 Jun 2009 15:33:49 +0200 Subject: get rid of device ids Signed-off-by: Sascha Hauer --- fs/devfs.c | 38 +++++++++++++++++++++++++------------- fs/fs.c | 13 ++++++++----- 2 files changed, 33 insertions(+), 18 deletions(-) (limited to 'fs') 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, diff --git a/fs/fs.c b/fs/fs.c index fc7ada064f..148e3a35cb 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -698,16 +698,16 @@ int mount(const char *device, const char *fsname, const char *_path) } } + fsdev = xzalloc(sizeof(struct fs_device_d)); if (!fs_drv->flags & FS_DRIVER_NO_DEV) { - parent_device = get_device_by_id(device + 5); - if (!parent_device) { + fsdev->backingstore = strdup(device); + if (!device) { printf("need a device for driver %s\n", fsname); errno = -ENODEV; + free(fsdev); goto out; } } - fsdev = xzalloc(sizeof(struct fs_device_d)); - fsdev->parent = parent_device; sprintf(fsdev->dev.name, "%s", fsname); fsdev->dev.type_data = fsdev; @@ -755,6 +755,7 @@ int umount(const char *pathname) struct mtab_entry *entry = mtab; struct mtab_entry *last = mtab; char *p = normalise_path(pathname); + struct fs_device_d *fsdev; while(entry && strcmp(p, entry->path)) { last = entry; @@ -774,7 +775,9 @@ int umount(const char *pathname) last->next = entry->next; unregister_device(entry->dev); - free(entry->dev->type_data); + fsdev = entry->dev->type_data; + free(fsdev->backingstore); + free(fsdev); return 0; } -- cgit v1.2.3