[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v2 2/5] lib/devfs: Adapt imported devfs to Unikraft
Hey Yuri, Please see my comments inline. Thanks, Vlad On 5/15/19 4:02 PM, Yuri Volchkov wrote: > Hi Vlad, > > a couple of smaller notes remained. Please see inline > > "Vlad-Andrei BĂDOIU (78692)" <vlad_andrei.badoiu@xxxxxxxxxxxxxxx> > writes: > >> Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx> >> --- >> lib/Config.uk | 1 + >> lib/Makefile.uk | 1 + >> lib/devfs/Config.uk | 10 ++ >> lib/devfs/Makefile.uk | 4 + >> lib/devfs/devfs.h | 2 +- >> lib/devfs/devfs_vnops.c | 123 +++++++++++++------ >> lib/devfs/device.c | 239 +++++++++---------------------------- >> lib/devfs/include/device.h | 15 +-- >> 8 files changed, 167 insertions(+), 228 deletions(-) >> create mode 100644 lib/devfs/Config.uk >> create mode 100644 lib/devfs/Makefile.uk >> >> diff --git a/lib/Config.uk b/lib/Config.uk >> index 553d4c6b..ea8b06a3 100644 >> --- a/lib/Config.uk >> +++ b/lib/Config.uk >> @@ -40,6 +40,7 @@ source "lib/ukschedcoop/Config.uk" >> source "lib/fdt/Config.uk" >> source "lib/vfscore/Config.uk" >> source "lib/ramfs/Config.uk" >> +source "lib/devfs/Config.uk" >> source "lib/uklock/Config.uk" >> source "lib/ukmpi/Config.uk" >> source "lib/ukswrand/Config.uk" >> diff --git a/lib/Makefile.uk b/lib/Makefile.uk >> index 54a957de..97fdf7b2 100644 >> --- a/lib/Makefile.uk >> +++ b/lib/Makefile.uk >> @@ -18,6 +18,7 @@ $(eval $(call >> _import_lib,$(CONFIG_UK_BASE)/lib/ukschedcoop)) >> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/fdt)) >> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/vfscore)) >> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ramfs)) >> +$(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/devfs)) >> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/uklock)) >> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukmpi)) >> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukbus)) >> diff --git a/lib/devfs/Config.uk b/lib/devfs/Config.uk >> new file mode 100644 >> index 00000000..e38a616e >> --- /dev/null >> +++ b/lib/devfs/Config.uk >> @@ -0,0 +1,10 @@ >> +config LIBDEVFS >> + bool "devfs: devfs file system" >> + default n >> + depends on LIBVFSCORE >> +if LIBDEVFS >> + config LIBDEVFS_USE_RAMFS >> + bool "Use ramfs as root" >> + default n >> + select LIBRAMFS >> +endif >> diff --git a/lib/devfs/Makefile.uk b/lib/devfs/Makefile.uk >> new file mode 100644 >> index 00000000..f33187f3 >> --- /dev/null >> +++ b/lib/devfs/Makefile.uk >> @@ -0,0 +1,4 @@ >> +$(eval $(call addlib_s,libdevfs,$(CONFIG_LIBDEVFS))) >> + >> +LIBDEVFS_SRCS-y += $(LIBDEVFS_BASE)/device.c >> +LIBDEVFS_SRCS-y += $(LIBDEVFS_BASE)/devfs_vnops.c >> diff --git a/lib/devfs/devfs.h b/lib/devfs/devfs.h >> index bdf50609..c2197f79 100644 >> --- a/lib/devfs/devfs.h >> +++ b/lib/devfs/devfs.h >> @@ -30,7 +30,7 @@ >> #ifndef _DEVFS_H >> #define _DEVFS_H >> >> -#include <assert.h> >> +#include <uk/assert.h> >> >> /* #define DEBUG_DEVFS 1 */ >> >> diff --git a/lib/devfs/devfs_vnops.c b/lib/devfs/devfs_vnops.c >> index 1e69e4a6..70987477 100644 >> --- a/lib/devfs/devfs_vnops.c >> +++ b/lib/devfs/devfs_vnops.c >> @@ -31,6 +31,10 @@ >> * devfs - device file system. >> */ >> >> +#ifndef _GNU_SOURCE >> +#define _GNU_SOURCE >> +#endif >> + >> #include <sys/stat.h> >> >> #include <ctype.h> >> @@ -41,27 +45,32 @@ >> #include <limits.h> >> #include <fcntl.h> >> #include <stdio.h> >> +#include <sys/mount.h> >> >> -#include <osv/prex.h> >> -#include <osv/device.h> >> -#include <osv/vnode.h> >> -#include <osv/mount.h> >> -#include <osv/dentry.h> >> +#include <dirent.h> >> +#include <vfscore/prex.h> >> +#include <vfscore/vnode.h> >> +#include <vfscore/mount.h> >> +#include <vfscore/dentry.h> >> +#include <vfscore/file.h> >> + >> +#include <vfscore/fs.h> >> >> #include "devfs.h" >> +#include "include/device.h" >> + >> +#include <uk/ctors.h> >> >> #ifdef DEBUG_DEVFS >> -#define DPRINTF(a) dprintf a >> +#define DPRINTF(X) uk_pr_debug(X) >> #else >> -#define DPRINTF(a) do {} while (0) >> +#define DPRINTF(X) >> #endif >> >> -#define ASSERT(e) assert(e) >> - >> static uint64_t inode_count = 1; /* inode 0 is reserved to root */ >> >> static int >> -devfs_open(struct file *fp) >> +devfs_open(struct vfscore_file *fp) >> { >> struct vnode *vp = fp->f_dentry->d_vnode; >> char *path = fp->f_dentry->d_path; >> @@ -90,7 +99,7 @@ devfs_open(struct file *fp) >> } >> >> static int >> -devfs_close(struct vnode *vp, struct file *fp) >> +devfs_close(struct vnode *vp, struct vfscore_file *fp) >> { >> >> DPRINTF(("devfs_close: fp=%x\n", fp)); >> @@ -98,27 +107,27 @@ devfs_close(struct vnode *vp, struct file *fp) >> if (!strcmp(fp->f_dentry->d_path, "/")) /* root ? */ >> return 0; >> >> - return device_close((device*)vp->v_data); >> + return device_close((struct device*)vp->v_data); >> } >> >> static int >> -devfs_read(struct vnode *vp, struct file *fp, struct uio *uio, int ioflags) >> +devfs_read(struct vnode *vp, struct vfscore_file *fp, struct uio *uio, int >> ioflags) >> { >> - return device_read((device*)vp->v_data, uio, ioflags); >> + return device_read((struct device*)vp->v_data, uio, ioflags); >> } >> >> static int >> devfs_write(struct vnode *vp, struct uio *uio, int ioflags) >> { >> - return device_write((device*)vp->v_data, uio, ioflags); >> + return device_write((struct device*)vp->v_data, uio, ioflags); >> } >> >> static int >> -devfs_ioctl(struct vnode *vp, struct file *fp, u_long cmd, void *arg) >> +devfs_ioctl(struct vnode *vp, struct vfscore_file *fp, unsigned long cmd, >> void *arg) >> { >> int error; >> >> - error = device_ioctl((device*)vp->v_data, cmd, arg); >> + error = device_ioctl((struct device*)vp->v_data, cmd, arg); >> DPRINTF(("devfs_ioctl: cmd=%x\n", cmd)); >> return error; >> } >> @@ -149,7 +158,7 @@ devfs_lookup(struct vnode *dvp, char *name, struct vnode >> **vpp) >> break; >> i++; >> } >> - if (vget(dvp->v_mount, inode_count++, &vp)) { >> + if (vfscore_vget(dvp->v_mount, inode_count++, &vp)) { >> /* found in cache */ >> *vpp = vp; >> return 0; >> @@ -171,7 +180,7 @@ devfs_lookup(struct vnode *dvp, char *name, struct vnode >> **vpp) >> * @vp: vnode of the directory. >> */ >> static int >> -devfs_readdir(struct vnode *vp, struct file *fp, struct dirent *dir) >> +devfs_readdir(struct vnode *vp, struct vfscore_file *fp, struct dirent *dir) >> { >> struct devinfo info; >> int error, i; >> @@ -204,15 +213,10 @@ devfs_readdir(struct vnode *vp, struct file *fp, >> struct dirent *dir) >> static int >> devfs_unmount(struct mount *mp, int flags) >> { >> - release_mp_dentries(mp); >> + vfscore_release_mp_dentries(mp); >> return 0; >> } >> >> -int >> -devfs_init(void) >> -{ >> - return 0; >> -} >> >> static int >> devfs_getattr(struct vnode *vnode, struct vattr *attr) >> @@ -222,25 +226,37 @@ devfs_getattr(struct vnode *vnode, struct vattr *attr) >> return 0; >> } >> >> -#define devfs_mount ((vfsop_mount_t)vfs_nullop) >> -#define devfs_sync ((vfsop_sync_t)vfs_nullop) >> -#define devfs_vget ((vfsop_vget_t)vfs_nullop) >> -#define devfs_statfs ((vfsop_statfs_t)vfs_nullop) >> +int >> +vop_einval(void) >> +{ >> + return EINVAL; >> +} >> + >> +int >> +vop_eperm(void) >> +{ >> + return EPERM; >> +} >> + >> +#define devfs_mount ((vfsop_mount_t)vfscore_nullop) >> +#define devfs_sync ((vfsop_sync_t)vfscore_nullop) >> +#define devfs_vget ((vfsop_vget_t)vfscore_nullop) >> +#define devfs_statfs ((vfsop_statfs_t)vfscore_nullop) >> >> -#define devfs_seek ((vnop_seek_t)vop_nullop) >> -#define devfs_fsync ((vnop_fsync_t)vop_nullop) >> +#define devfs_seek ((vnop_seek_t)vfscore_vop_nullop) >> +#define devfs_fsync ((vnop_fsync_t)vfscore_vop_nullop) >> #define devfs_create ((vnop_create_t)vop_einval) >> #define devfs_remove ((vnop_remove_t)vop_einval) >> #define devfs_rename ((vnop_rename_t)vop_einval) >> #define devfs_mkdir ((vnop_mkdir_t)vop_einval) >> #define devfs_rmdir ((vnop_rmdir_t)vop_einval) >> #define devfs_setattr ((vnop_setattr_t)vop_eperm) >> -#define devfs_inactive ((vnop_inactive_t)vop_nullop) >> -#define devfs_truncate ((vnop_truncate_t)vop_nullop) >> +#define devfs_inactive ((vnop_inactive_t)vfscore_vop_nullop) >> +#define devfs_truncate ((vnop_truncate_t)vfscore_vop_nullop) >> #define devfs_link ((vnop_link_t)vop_eperm) >> -#define devfs_fallocate ((vnop_fallocate_t)vop_nullop) >> -#define devfs_readlink ((vnop_readlink_t)vop_nullop) >> -#define devfs_symlink ((vnop_symlink_t)vop_nullop) >> +#define devfs_fallocate ((vnop_fallocate_t)vfscore_vop_nullop) >> +#define devfs_readlink ((vnop_readlink_t)vfscore_vop_nullop) >> +#define devfs_symlink ((vnop_symlink_t)vfscore_vop_nullop) >> >> /* >> * vnode operations >> @@ -265,7 +281,7 @@ struct vnops devfs_vnops = { >> devfs_inactive, /* inactive */ >> devfs_truncate, /* truncate */ >> devfs_link, /* link */ >> - (vnop_cache_t) nullptr, /* arc */ >> + (vnop_cache_t) NULL, /* arc */ >> devfs_fallocate, /* fallocate */ >> devfs_readlink, /* read link */ >> devfs_symlink, /* symbolic link */ >> @@ -282,3 +298,36 @@ struct vfsops devfs_vfsops = { >> devfs_statfs, /* statfs */ >> &devfs_vnops, /* vnops */ >> }; >> + >> +static struct vfscore_fs_type fs_devfs = { >> + .vs_name = "devfs", >> + .vs_init = NULL, >> + .vs_op = &devfs_vfsops, >> +}; >> + >> +UK_FS_REGISTER(fs_devfs); >> + >> +__constructor_prio(101) static void devfs_init(void) >> +{ >> +#ifdef CONFIG_LIBDEVFS_USE_RAMFS >> + int ret; >> + >> + ret = mount("", "/", "ramfs", 0, NULL); >> + if (ret != 0) { >> + DPRINTF(("Failed to mount / in %s\n", __func__)); >> + return; >> + } >> + >> + ret = mkdir("/dev", S_IRWXU); >> + if (ret != 0) { >> + DPRINTF(("Failed to mkdir /dev in %s\n", __func__)); >> + return; >> + } >> + >> + ret = mount("", "/dev", "devfs", 0, NULL); >> + if (ret != 0) { >> + DPRINTF(("Failed to mount /dev as devfs in %s\n", __func__)); >> + return; >> + } >> +#endif >> +} >> diff --git a/lib/devfs/device.c b/lib/devfs/device.c >> index a0cd9768..f32b26dc 100644 >> --- a/lib/devfs/device.c >> +++ b/lib/devfs/device.c >> @@ -45,21 +45,16 @@ >> #include <stdio.h> >> #include <unistd.h> >> #include <errno.h> >> -#include <assert.h> >> +#include <uk/assert.h> >> #include <string.h> >> >> -#include <osv/prex.h> >> -#include <osv/mutex.h> >> -#include <osv/device.h> >> -#include <osv/debug.h> >> -#include <osv/buf.h> >> +#include <vfscore/prex.h> >> +#include <uk/essentials.h> >> +#include <uk/mutex.h> >> >> -#include <geom/geom_disk.h> >> - >> -mutex sched_mutex; >> -#define sched_lock() sched_mutex.lock() >> -#define sched_unlock() sched_mutex.unlock() >> +#include "include/device.h" >> >> +static struct uk_mutex devfs_lock = UK_MUTEX_INITIALIZER(devfs_lock); >> >> /* list head of the devices */ >> static struct device *device_list = NULL; >> @@ -92,85 +87,31 @@ struct partition_table_entry { >> uint32_t total_sectors; >> } __attribute__((packed)); >> >> -/* >> - * read_partition_table - given a device @dev, create one subdevice per >> partition >> - * found in that device. >> - * >> - * This function will read a partition table from the canonical location of >> the >> - * device pointed by @dev. For each partition found, a new device will be >> - * created. The newly created device will have most of its data copied from >> - * @dev, except for its name, offset and size. >> - */ >> -void read_partition_table(struct device *dev) >> -{ >> - struct buf *bp; >> - unsigned long offset; >> - int index; >> - >> - if (bread(dev, 0, &bp) != 0) { >> - debugf("read_partition_table failed for %s\n", dev->name); >> - return; >> - } >> - >> - sched_lock(); >> - // A real partition table (MBR) ends in the two bytes 0x55, 0xAA (see >> - // arch/x64/boot16.S on where we put those on the OSv image). If we >> - // don't find those, this is an unpartitioned disk. >> - if (((unsigned char*)bp->b_data)[510] == 0x55 && >> - ((unsigned char*)bp->b_data)[511] == 0xAA) >> - for (offset = 0x1be, index = 0; offset < 0x1fe; offset += 0x10, >> index++) { >> - char dev_name[MAXDEVNAME]; >> - struct device *new_dev; >> - >> - auto* entry = static_cast<struct >> partition_table_entry*>(bp->b_data + offset); >> - >> - if (entry->system_id == 0) { >> - continue; >> - } >> - >> - if (entry->starting_sector == 0) { >> - continue; >> - } >> - >> - snprintf(dev_name, MAXDEVNAME, "%s.%d", dev->name, index); >> - new_dev = device_create(dev->driver, dev_name, dev->flags); >> - free(new_dev->private_data); >> - >> - new_dev->offset = (off_t)entry->rela_sector << 9; >> - new_dev->size = (off_t)entry->total_sectors << 9; >> - new_dev->max_io_size = dev->max_io_size; >> - new_dev->private_data = dev->private_data; >> - device_set_softc(new_dev, device_get_softc(dev)); >> - } >> - >> - sched_unlock(); >> - brelse(bp); >> -} >> >> void device_register(struct device *dev, const char *name, int flags) >> { >> size_t len; >> void *priv = NULL; >> >> - assert(dev->driver != NULL); >> + UK_ASSERT(dev->driver != NULL); >> >> /* Check the length of name. */ >> len = strnlen(name, MAXDEVNAME); >> if (len == 0 || len >= MAXDEVNAME) >> return; >> >> - sched_lock(); >> + uk_mutex_lock(&devfs_lock); >> >> /* Check if specified name is already used. */ >> if (device_lookup(name) != NULL) >> - sys_panic("duplicate device"); >> + UK_CRASH("duplicate device"); >> >> /* >> * Allocate a device and device private data. >> */ >> if (dev->driver->devsz != 0) { >> if ((priv = malloc(dev->driver->devsz)) == NULL) >> - sys_panic("devsz"); >> + UK_CRASH("devsz"); >> memset(priv, 0, dev->driver->devsz); >> } >> >> @@ -184,7 +125,7 @@ void device_register(struct device *dev, const char >> *name, int flags) >> dev->max_io_size = UINT_MAX; >> device_list = dev; >> >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> } >> >> >> @@ -201,7 +142,7 @@ device_create(struct driver *drv, const char *name, int >> flags) >> struct device *dev; >> size_t len; >> >> - assert(drv != NULL); >> + UK_ASSERT(drv != NULL); >> >> /* Check the length of name. */ >> len = strnlen(name, MAXDEVNAME); >> @@ -211,27 +152,14 @@ device_create(struct driver *drv, const char *name, >> int flags) >> /* >> * Allocate a device structure. >> */ >> - if ((dev = new device) == NULL) >> - sys_panic("device_create"); >> + if ((dev = malloc(sizeof(struct device))) == NULL) >> + UK_CRASH("device_create"); >> >> - dev->driver = drv; >> - device_register(dev, name, flags); >> + dev->driver = drv; >> + device_register(dev, name, flags); >> return dev; >> } >> >> -#if 0 >> -/* >> - * Return device's private data. >> - */ >> -static void * >> -device_private(struct device *dev) >> -{ >> - assert(dev != NULL); >> - assert(dev->private_data != NULL); >> - >> - return dev->private_data; >> -} >> -#endif >> >> /* >> * Return true if specified device is valid. >> @@ -260,13 +188,29 @@ static int >> device_reference(struct device *dev) >> { >> >> - sched_lock(); >> + uk_mutex_lock(&devfs_lock); >> if (!device_valid(dev)) { >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> + return ENODEV; >> + } >> + dev->refcnt++; > Alternatively you could just call device_reference_locked() here > >> + uk_mutex_unlock(&devfs_lock); >> + return 0; >> +} >> + >> +/* >> + * Increment the reference count on an active device. >> + */ >> +static int >> +device_reference_locked(struct device *dev) >> +{ >> + UK_ASSERT(uk_mutex_is_locked(&devfs_lock)); >> + >> + if (!device_valid(dev)) { >> + uk_mutex_unlock(&devfs_lock); >> return ENODEV; >> } >> dev->refcnt++; >> - sched_unlock(); >> return 0; >> } >> >> @@ -279,9 +223,10 @@ device_release(struct device *dev) >> { >> struct device **tmp; >> >> - sched_lock(); >> + uk_mutex_lock(&devfs_lock); >> + >> if (--dev->refcnt > 0) { >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> return; >> } >> /* >> @@ -293,22 +238,22 @@ device_release(struct device *dev) >> break; >> } >> } >> - delete dev; >> - sched_unlock(); >> + free(dev); >> + uk_mutex_unlock(&devfs_lock); >> } >> >> int >> device_destroy(struct device *dev) >> { >> >> - sched_lock(); >> + uk_mutex_lock(&devfs_lock); >> if (!device_valid(dev)) { >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> return ENODEV; >> } >> dev->active = 0; >> + uk_mutex_unlock(&devfs_lock); >> device_release(dev); >> - sched_unlock(); > Same problem we had with device_reference. Looks like we need > device_reference_locked as well. I think there is a typo, you mean device_destroy_locked. As a side note, we cannot call from device_destroy the device_destroy_locked since we would have device_release inside the critical region. >> return 0; >> } >> >> @@ -329,20 +274,20 @@ device_open(const char *name, int mode, struct device >> **devp) >> struct device *dev; >> int error; >> >> - sched_lock(); >> + uk_mutex_lock(&devfs_lock); >> if ((dev = device_lookup(name)) == NULL) { >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> return ENXIO; >> } >> - error = device_reference(dev); >> + >> + error = device_reference_locked(dev); >> if (error) { >> - sched_unlock(); > Unlock is still needed here > >> return error; >> } >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> >> ops = dev->driver->devops; >> - assert(ops->open != NULL); >> + UK_ASSERT(ops->open != NULL); >> error = (*ops->open)(dev, mode); >> *devp = dev; >> >> @@ -366,7 +311,7 @@ device_close(struct device *dev) >> return error; >> >> ops = dev->driver->devops; >> - assert(ops->close != NULL); >> + UK_ASSERT(ops->close != NULL); >> error = (*ops->close)(dev); >> >> device_release(dev); >> @@ -383,7 +328,7 @@ device_read(struct device *dev, struct uio *uio, int >> ioflags) >> return error; >> >> ops = dev->driver->devops; >> - assert(ops->read != NULL); >> + UK_ASSERT(ops->read != NULL); >> error = (*ops->read)(dev, uio, ioflags); >> >> device_release(dev); >> @@ -400,7 +345,7 @@ device_write(struct device *dev, struct uio *uio, int >> ioflags) >> return error; >> >> ops = dev->driver->devops; >> - assert(ops->write != NULL); >> + UK_ASSERT(ops->write != NULL); >> error = (*ops->write)(dev, uio, ioflags); >> >> device_release(dev); >> @@ -415,7 +360,7 @@ device_write(struct device *dev, struct uio *uio, int >> ioflags) >> * pointed by the arg value. >> */ >> int >> -device_ioctl(struct device *dev, u_long cmd, void *arg) >> +device_ioctl(struct device *dev, unsigned long cmd, void *arg) >> { >> struct devops *ops; >> int error; >> @@ -424,92 +369,25 @@ device_ioctl(struct device *dev, u_long cmd, void *arg) >> return error; >> >> ops = dev->driver->devops; >> - assert(ops->ioctl != NULL); >> + UK_ASSERT(ops->ioctl != NULL); >> error = (*ops->ioctl)(dev, cmd, arg); >> >> device_release(dev); >> return error; >> } >> >> -#if 0 >> -/* >> - * Device control - devctl is similar to ioctl, but is invoked from >> - * other device driver rather than from user application. >> - */ >> -static int >> -device_control(struct device *dev, u_long cmd, void *arg) >> -{ >> - struct devops *ops; >> - int error; >> - >> - assert(dev != NULL); >> - >> - sched_lock(); >> - ops = dev->driver->devops; >> - assert(ops->devctl != NULL); >> - error = (*ops->devctl)(dev, cmd, arg); >> - sched_unlock(); >> - return error; >> -} >> - >> -/* >> - * device_broadcast - broadcast devctl command to all device objects. >> - * >> - * If "force" argument is true, we will continue command >> - * notification even if some driver returns an error. In this >> - * case, this routine returns EIO error if at least one driver >> - * returns an error. >> - * >> - * If force argument is false, a kernel stops the command processing >> - * when at least one driver returns an error. In this case, >> - * device_broadcast will return the error code which is returned >> - * by the driver. >> - */ >> -static int >> -device_broadcast(u_long cmd, void *arg, int force) >> -{ >> - struct device *dev; >> - struct devops *ops; >> - int error, retval = 0; >> - >> - sched_lock(); >> - >> - for (dev = device_list; dev != NULL; dev = dev->next) { >> - /* >> - * Call driver's devctl() routine. >> - */ >> - ops = dev->driver->devops; >> - if (ops == NULL) >> - continue; >> - >> - assert(ops->devctl != NULL); >> - error = (*ops->devctl)(dev, cmd, arg); >> - if (error) { >> - if (force) >> - retval = EIO; >> - else { >> - retval = error; >> - break; >> - } >> - } >> - } >> - sched_unlock(); >> - return retval; >> -} >> -#endif >> - >> /* >> * Return device information. >> */ >> int >> device_info(struct devinfo *info) >> { >> - u_long target = info->cookie; >> - u_long i = 0; >> + unsigned long target = info->cookie; >> + unsigned long i = 0; >> struct device *dev; >> int error = ESRCH; >> >> - sched_lock(); >> + uk_mutex_lock(&devfs_lock); >> for (dev = device_list; dev != NULL; dev = dev->next) { >> if (i++ == target) { >> info->cookie = i; >> @@ -520,7 +398,7 @@ device_info(struct devinfo *info) >> break; >> } >> } >> - sched_unlock(); >> + uk_mutex_unlock(&devfs_lock); >> return error; >> } >> >> @@ -535,3 +413,4 @@ nullop(void) >> { >> return 0; >> } >> + >> diff --git a/lib/devfs/include/device.h b/lib/devfs/include/device.h >> index 16d2e470..95e247d8 100644 >> --- a/lib/devfs/include/device.h >> +++ b/lib/devfs/include/device.h >> @@ -30,12 +30,9 @@ >> #ifndef _DEVICE_H >> #define _DEVICE_H >> >> -#include <sys/cdefs.h> >> #include <sys/types.h> >> >> -#include <osv/uio.h> >> - >> -__BEGIN_DECLS >> +#include <vfscore/uio.h> >> >> #define MAXDEVNAME 12 >> #define DO_RWMASK 0x3 >> @@ -47,7 +44,7 @@ struct device; >> * Device information >> */ >> struct devinfo { >> - u_long cookie; /* index cookie */ >> + unsigned long cookie; /* index cookie */ >> struct device *id; /* device id */ >> int flags; /* device characteristics flags */ >> char name[MAXDEVNAME]; /* device name */ >> @@ -65,8 +62,8 @@ typedef int (*devop_open_t) (struct device *, int); >> typedef int (*devop_close_t) (struct device *); >> typedef int (*devop_read_t) (struct device *, struct uio *, int); >> typedef int (*devop_write_t) (struct device *, struct uio *, int); >> -typedef int (*devop_ioctl_t) (struct device *, u_long, void *); >> -typedef int (*devop_devctl_t) (struct device *, u_long, void *); >> +typedef int (*devop_ioctl_t) (struct device *, unsigned long, void *); >> +typedef int (*devop_devctl_t) (struct device *, unsigned long, void *); >> typedef void (*devop_strategy_t)(struct bio *); >> >> /* >> @@ -191,7 +188,7 @@ int device_open(const char *, int, struct device >> **); >> int device_close(struct device *); >> int device_read(struct device *, struct uio *, int); >> int device_write(struct device *, struct uio *, int); >> -int device_ioctl(struct device *, u_long, void *); >> +int device_ioctl(struct device *, unsigned long, void *); >> int device_info(struct devinfo *); >> >> int bdev_read(struct device *dev, struct uio *uio, int ioflags); >> @@ -208,6 +205,4 @@ int device_destroy(struct device *dev); >> void device_register(struct device *device, const char *name, int flags); >> void read_partition_table(struct device *device); >> >> -__END_DECLS >> - >> #endif /* !_DEVICE_H */ >> -- >> 2.21.0 >> _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |