fs: store pointer to fsdev instead of dev in struct filep
The struct device_d * in struct filep is never of interest, instead it is always converted to a struct fs_device_d *, so simplify the code by storing the struct fs_device_d * directly. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
86ef8cb8fb
commit
bfef6cd5f2
|
@ -168,9 +168,9 @@ static int devfs_ioctl(struct device_d *_dev, FILE *f, int request, void *buf)
|
|||
|
||||
static int devfs_truncate(struct device_d *dev, FILE *f, ulong size)
|
||||
{
|
||||
if (f->dev->num_resources < 1)
|
||||
if (f->fsdev->dev.num_resources < 1)
|
||||
return -ENOSPC;
|
||||
if (size > resource_size(&f->dev->resource[0]))
|
||||
if (size > resource_size(&f->fsdev->dev.resource[0]))
|
||||
return -ENOSPC;
|
||||
return 0;
|
||||
}
|
||||
|
|
75
fs/fs.c
75
fs/fs.c
|
@ -653,7 +653,7 @@ int open(const char *pathname, int flags, ...)
|
|||
|
||||
fsdrv = fsdev->driver;
|
||||
|
||||
f->dev = &fsdev->dev;
|
||||
f->fsdev = fsdev;
|
||||
f->flags = flags;
|
||||
|
||||
if ((flags & O_ACCMODE) && !fsdrv->write) {
|
||||
|
@ -705,7 +705,6 @@ EXPORT_SYMBOL(creat);
|
|||
|
||||
int ioctl(int fd, int request, void *buf)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
int ret;
|
||||
|
@ -714,12 +713,11 @@ int ioctl(int fd, int request, void *buf)
|
|||
return -errno;
|
||||
|
||||
f = &files[fd];
|
||||
dev = f->dev;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
|
||||
if (fsdrv->ioctl)
|
||||
ret = fsdrv->ioctl(dev, f, request, buf);
|
||||
ret = fsdrv->ioctl(&f->fsdev->dev, f, request, buf);
|
||||
else
|
||||
ret = -ENOSYS;
|
||||
if (ret)
|
||||
|
@ -729,13 +727,10 @@ int ioctl(int fd, int request, void *buf)
|
|||
|
||||
static ssize_t __read(FILE *f, void *buf, size_t count)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
int ret;
|
||||
|
||||
dev = f->dev;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
|
||||
if (f->size != FILE_SIZE_STREAM && f->pos + count > f->size)
|
||||
count = f->size - f->pos;
|
||||
|
@ -743,7 +738,7 @@ static ssize_t __read(FILE *f, void *buf, size_t count)
|
|||
if (!count)
|
||||
return 0;
|
||||
|
||||
ret = fsdrv->read(dev, f, buf, count);
|
||||
ret = fsdrv->read(&f->fsdev->dev, f, buf, count);
|
||||
|
||||
if (ret < 0)
|
||||
errno = -ret;
|
||||
|
@ -790,15 +785,12 @@ EXPORT_SYMBOL(read);
|
|||
|
||||
static ssize_t __write(FILE *f, const void *buf, size_t count)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
int ret;
|
||||
|
||||
dev = f->dev;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
if (f->size != FILE_SIZE_STREAM && f->pos + count > f->size) {
|
||||
ret = fsdrv->truncate(dev, f, f->pos + count);
|
||||
ret = fsdrv->truncate(&f->fsdev->dev, f, f->pos + count);
|
||||
if (ret) {
|
||||
if (ret != -ENOSPC)
|
||||
goto out;
|
||||
|
@ -809,7 +801,7 @@ static ssize_t __write(FILE *f, const void *buf, size_t count)
|
|||
f->size = f->pos + count;
|
||||
}
|
||||
}
|
||||
ret = fsdrv->write(dev, f, buf, count);
|
||||
ret = fsdrv->write(&f->fsdev->dev, f, buf, count);
|
||||
out:
|
||||
if (ret < 0)
|
||||
errno = -ret;
|
||||
|
@ -856,7 +848,6 @@ EXPORT_SYMBOL(write);
|
|||
|
||||
int flush(int fd)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
int ret;
|
||||
|
@ -865,11 +856,10 @@ int flush(int fd)
|
|||
return -errno;
|
||||
|
||||
f = &files[fd];
|
||||
dev = f->dev;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
if (fsdrv->flush)
|
||||
ret = fsdrv->flush(dev, f);
|
||||
ret = fsdrv->flush(&f->fsdev->dev, f);
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
|
@ -881,7 +871,6 @@ int flush(int fd)
|
|||
|
||||
loff_t lseek(int fildes, loff_t offset, int whence)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
loff_t pos;
|
||||
|
@ -891,8 +880,7 @@ loff_t lseek(int fildes, loff_t offset, int whence)
|
|||
return -1;
|
||||
|
||||
f = &files[fildes];
|
||||
dev = f->dev;
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
if (!fsdrv->lseek) {
|
||||
ret = -ENOSYS;
|
||||
goto out;
|
||||
|
@ -920,7 +908,7 @@ loff_t lseek(int fildes, loff_t offset, int whence)
|
|||
goto out;
|
||||
}
|
||||
|
||||
return fsdrv->lseek(dev, f, pos);
|
||||
return fsdrv->lseek(&f->fsdev->dev, f, pos);
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
|
@ -932,7 +920,6 @@ EXPORT_SYMBOL(lseek);
|
|||
|
||||
int erase(int fd, size_t count, unsigned long offset)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
int ret;
|
||||
|
@ -945,10 +932,9 @@ int erase(int fd, size_t count, unsigned long offset)
|
|||
if (count > f->size - offset)
|
||||
count = f->size - offset;
|
||||
|
||||
dev = f->dev;
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
if (fsdrv->erase)
|
||||
ret = fsdrv->erase(dev, f, count, offset);
|
||||
ret = fsdrv->erase(&f->fsdev->dev, f, count, offset);
|
||||
else
|
||||
ret = -ENOSYS;
|
||||
|
||||
|
@ -961,7 +947,6 @@ EXPORT_SYMBOL(erase);
|
|||
|
||||
int protect(int fd, size_t count, unsigned long offset, int prot)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
int ret;
|
||||
|
@ -974,10 +959,9 @@ int protect(int fd, size_t count, unsigned long offset, int prot)
|
|||
if (count > f->size - offset)
|
||||
count = f->size - offset;
|
||||
|
||||
dev = f->dev;
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
if (fsdrv->protect)
|
||||
ret = fsdrv->protect(dev, f, count, offset, prot);
|
||||
ret = fsdrv->protect(&f->fsdev->dev, f, count, offset, prot);
|
||||
else
|
||||
ret = -ENOSYS;
|
||||
|
||||
|
@ -1005,7 +989,6 @@ int protect_file(const char *file, int prot)
|
|||
|
||||
void *memmap(int fd, int flags)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
void *retp = (void *)-1;
|
||||
|
@ -1015,12 +998,11 @@ void *memmap(int fd, int flags)
|
|||
return retp;
|
||||
|
||||
f = &files[fd];
|
||||
dev = f->dev;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = f->fsdev->driver;
|
||||
|
||||
if (fsdrv->memmap)
|
||||
ret = fsdrv->memmap(dev, f, &retp, flags);
|
||||
ret = fsdrv->memmap(&f->fsdev->dev, f, &retp, flags);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
|
@ -1033,7 +1015,6 @@ EXPORT_SYMBOL(memmap);
|
|||
|
||||
int close(int fd)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
FILE *f;
|
||||
int ret;
|
||||
|
@ -1042,10 +1023,9 @@ int close(int fd)
|
|||
return -errno;
|
||||
|
||||
f = &files[fd];
|
||||
dev = f->dev;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
ret = fsdrv->close(dev, f);
|
||||
fsdrv = f->fsdev->driver;
|
||||
ret = fsdrv->close(&f->fsdev->dev, f);
|
||||
|
||||
put_file(f);
|
||||
|
||||
|
@ -1152,7 +1132,8 @@ static int fs_match(struct device_d *dev, struct driver_d *drv)
|
|||
static int fs_probe(struct device_d *dev)
|
||||
{
|
||||
struct fs_device_d *fsdev = dev_to_fs_device(dev);
|
||||
struct fs_driver_d *fsdrv = dev_to_fs_driver(dev);
|
||||
struct driver_d *drv = dev->driver;
|
||||
struct fs_driver_d *fsdrv = container_of(drv, struct fs_driver_d, drv);
|
||||
int ret;
|
||||
|
||||
ret = dev->driver->probe(dev);
|
||||
|
@ -1449,7 +1430,6 @@ EXPORT_SYMBOL(stat);
|
|||
|
||||
int lstat(const char *filename, struct stat *s)
|
||||
{
|
||||
struct device_d *dev;
|
||||
struct fs_driver_d *fsdrv;
|
||||
struct fs_device_d *fsdev;
|
||||
char *f = normalise_path(filename);
|
||||
|
@ -1466,18 +1446,17 @@ int lstat(const char *filename, struct stat *s)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (fsdev != fs_dev_root && strcmp(f, fsdev->path)) {
|
||||
if (fsdev != fs_dev_root && strcmp(f, fsdev->path))
|
||||
f += strlen(fsdev->path);
|
||||
dev = &fsdev->dev;
|
||||
} else
|
||||
dev = &fs_dev_root->dev;
|
||||
else
|
||||
fsdev = fs_dev_root;
|
||||
|
||||
fsdrv = dev_to_fs_driver(dev);
|
||||
fsdrv = fsdev->driver;
|
||||
|
||||
if (*f == 0)
|
||||
f = "/";
|
||||
|
||||
ret = fsdrv->stat(dev, f, s);
|
||||
ret = fsdrv->stat(&fsdev->dev, f, s);
|
||||
out:
|
||||
free(freep);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ typedef struct dir {
|
|||
} DIR;
|
||||
|
||||
typedef struct filep {
|
||||
struct device_d *dev; /* The device this FILE belongs to */
|
||||
struct fs_device_d *fsdev; /* The device this FILE belongs to */
|
||||
loff_t pos; /* current position in stream */
|
||||
#define FILE_SIZE_STREAM ((loff_t) -1)
|
||||
loff_t size; /* The size of this inode */
|
||||
|
@ -82,7 +82,6 @@ struct fs_driver_d {
|
|||
unsigned long flags;
|
||||
};
|
||||
|
||||
#define dev_to_fs_driver(d) container_of(d->driver, struct fs_driver_d, drv)
|
||||
#define dev_to_fs_device(d) container_of(d, struct fs_device_d, dev)
|
||||
|
||||
extern struct list_head fs_device_list;
|
||||
|
|
Loading…
Reference in New Issue