summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2019-12-13 12:14:16 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-02-14 12:16:20 +0100
commita18f5ad97df6b3d0768c8b741e85da077f990cc7 (patch)
tree4ede1aa864abfb7ac84ffb2044b93ec940df65ba /fs
parent6a1daf5adcefad3d08f97dd85e2917eac12e7202 (diff)
downloadbarebox-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.c21
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 = {