summaryrefslogtreecommitdiffstats
path: root/fs/devfs.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2008-06-06 09:25:13 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2008-06-06 09:30:48 +0200
commitee6d36a5405305f3bbdb0457948c219731b3d9cc (patch)
tree0a328bd96f2cf2f190372b654515e509c694930a /fs/devfs.c
parent3f73e61600f8fce0b6fa02e9a82124c1c89937c7 (diff)
downloadbarebox-ee6d36a5405305f3bbdb0457948c219731b3d9cc.tar.gz
barebox-ee6d36a5405305f3bbdb0457948c219731b3d9cc.tar.xz
- introduce ioctl call
- pass open/close/lseek through to drivers
Diffstat (limited to 'fs/devfs.c')
-rw-r--r--fs/devfs.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/fs/devfs.c b/fs/devfs.c
index 10c2dfeab6..12abc1829d 100644
--- a/fs/devfs.c
+++ b/fs/devfs.c
@@ -44,6 +44,19 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s
return dev_write(dev, buf, size, f->pos, f->flags);
}
+static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
+{
+ struct device_d *dev = f->inode;
+ int ret;
+
+ ret = dev_lseek(dev, pos);
+
+ if (ret >= 0)
+ f->pos = pos;
+
+ return ret;
+}
+
static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset)
{
struct device_d *dev = f->inode;
@@ -65,21 +78,30 @@ static int devfs_memmap(struct device_d *_dev, FILE *f, void **map, int flags)
return dev_memmap(dev, map, flags);
}
-static int devfs_open(struct device_d *_dev, FILE *file, const char *filename)
+static int devfs_open(struct device_d *_dev, FILE *f, const char *filename)
{
struct device_d *dev = get_device_by_id(filename + 1);
if (!dev)
return -ENOENT;
- file->size = dev->size;
- file->inode = dev;
- return 0;
+ f->size = dev->size;
+ f->inode = dev;
+ return dev_open(dev, f);
}
-static int devfs_close(struct device_d *dev, FILE *f)
+static int devfs_close(struct device_d *_dev, FILE *f)
{
- return 0;
+ struct device_d *dev = f->inode;
+
+ return dev_close(dev, f);
+}
+
+static int devfs_ioctl(struct device_d *_dev, FILE *f, int request, void *buf)
+{
+ struct device_d *dev = f->inode;
+
+ return dev_ioctl(dev, request, buf);
}
static int devfs_truncate(struct device_d *dev, FILE *f, ulong size)
@@ -156,8 +178,10 @@ static struct fs_driver_d devfs_driver = {
.type = FS_TYPE_DEVFS,
.read = devfs_read,
.write = devfs_write,
+ .lseek = devfs_lseek,
.open = devfs_open,
.close = devfs_close,
+ .ioctl = devfs_ioctl,
.opendir = devfs_opendir,
.readdir = devfs_readdir,
.truncate = devfs_truncate,