diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2019-12-13 12:14:16 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-02-14 12:16:20 +0100 |
commit | a18f5ad97df6b3d0768c8b741e85da077f990cc7 (patch) | |
tree | 4ede1aa864abfb7ac84ffb2044b93ec940df65ba /fs | |
parent | 6a1daf5adcefad3d08f97dd85e2917eac12e7202 (diff) | |
download | barebox-a18f5ad97df6b3d0768c8b741e85da077f990cc7.tar.gz barebox-a18f5ad97df6b3d0768c8b741e85da077f990cc7.tar.xz |
cdev: Add discard_range hook
To pass though discard_range() to the underlying drivers add a
discard_range hook to struct cdev_operations.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/devfs.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/devfs.c b/fs/devfs.c index d088c1a66c..e1893d1bd0 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -94,6 +94,26 @@ static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, loff_t of return cdev->ops->protect(cdev, count, offset + cdev->offset, prot); } +static int devfs_discard_range(struct device_d *dev, FILE *f, loff_t count, + loff_t offset) +{ + struct cdev *cdev = f->priv; + + if (!cdev->ops->discard_range) + return -ENOSYS; + + if (cdev->flags & DEVFS_PARTITION_READONLY) + return -EPERM; + + if (offset >= cdev->size) + return 0; + + if (count + offset > cdev->size) + count = cdev->size - offset; + + return cdev->ops->discard_range(cdev, count, offset + cdev->offset); +} + static int devfs_memmap(struct device_d *_dev, FILE *f, void **map, int flags) { struct cdev *cdev = f->priv; @@ -329,6 +349,7 @@ static struct fs_driver_d devfs_driver = { .truncate = devfs_truncate, .erase = devfs_erase, .protect = devfs_protect, + .discard_range = devfs_discard_range, .memmap = devfs_memmap, .flags = FS_DRIVER_NO_DEV, .drv = { |