diff --git a/fs/devfs.c b/fs/devfs.c index d088c1a..e1893d1 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -94,6 +94,26 @@ 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 @@ .truncate = devfs_truncate, .erase = devfs_erase, .protect = devfs_protect, + .discard_range = devfs_discard_range, .memmap = devfs_memmap, .flags = FS_DRIVER_NO_DEV, .drv = { diff --git a/include/driver.h b/include/driver.h index 74be1b3..c9ad95f 100644 --- a/include/driver.h +++ b/include/driver.h @@ -441,6 +441,7 @@ int (*flush)(struct cdev*); int (*erase)(struct cdev*, loff_t count, loff_t offset); int (*protect)(struct cdev*, size_t count, loff_t offset, int prot); + int (*discard_range)(struct cdev*, loff_t count, loff_t offset); int (*memmap)(struct cdev*, void **map, int flags); int (*truncate)(struct cdev*, size_t size); };