diff options
author | Ian Moffett <ian@osmora.org> | 2025-05-26 01:51:22 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-05-26 01:51:22 -0400 |
commit | 6b52b61f5bde1bcc1e08d760b6650009e9f1cab4 (patch) | |
tree | 8b807f62328afc186e79383f585595f4833727c5 /sys | |
parent | 08d925bce8a18361655a56bf5b38d6f9e9134b8a (diff) |
kernel: devfs: Add callback to request block size
Add bsize() callback within the bdevsw structure. This returns the
number of blocks a block device supports at maximum. This result is *not*
in bytes.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/devfs.c | 11 | ||||
-rw-r--r-- | sys/include/sys/device.h | 4 | ||||
-rw-r--r-- | sys/kern/kern_stub.c | 6 |
3 files changed, 20 insertions, 1 deletions
diff --git a/sys/fs/devfs.c b/sys/fs/devfs.c index 15a2864..1dfc10d 100644 --- a/sys/fs/devfs.c +++ b/sys/fs/devfs.c @@ -137,6 +137,8 @@ devfs_getattr(struct vop_getattr_args *args) struct vnode *vp; struct vattr *attr; struct devfs_node *dnp; + struct bdevsw *bdev; + size_t size = 0; vp = args->vp; if ((dnp = vp->data) == NULL) { @@ -146,6 +148,13 @@ devfs_getattr(struct vop_getattr_args *args) return -EIO; } + if (dnp->is_block) { + bdev = dev_get(dnp->major, dnp->dev); + if (bdev->bsize != NULL) { + size = bdev->bsize(dnp->dev); + } + } + /* * Set stat attributes from device node structure * found within vnode data. @@ -154,7 +163,7 @@ devfs_getattr(struct vop_getattr_args *args) * size is hardwired to 0. */ attr->mode = dnp->mode; - attr->size = 0; + attr->size = size; return 0; } diff --git a/sys/include/sys/device.h b/sys/include/sys/device.h index f5f92ad..fcafdab 100644 --- a/sys/include/sys/device.h +++ b/sys/include/sys/device.h @@ -42,6 +42,7 @@ typedef uint8_t devmajor_t; /* Device operation typedefs */ typedef int(*dev_read_t)(dev_t, struct sio_txn *, int); typedef int(*dev_write_t)(dev_t, struct sio_txn *, int); +typedef int(*dev_bsize_t)(dev_t); struct cdevsw { int(*read)(dev_t dev, struct sio_txn *sio, int flags); @@ -51,6 +52,7 @@ struct cdevsw { struct bdevsw { int(*read)(dev_t dev, struct sio_txn *sio, int flags); int(*write)(dev_t dev, struct sio_txn *sio, int flags); + int(*bsize)(dev_t dev); }; void *dev_get(devmajor_t major, dev_t dev); @@ -61,10 +63,12 @@ int dev_register(devmajor_t major, dev_t dev, void *devsw); int dev_noread(void); int dev_nowrite(void); +int dev_nobsize(void); /* Device operation stubs */ #define noread ((dev_read_t)dev_noread) #define nowrite ((dev_write_t)dev_nowrite) +#define nobsize ((dev_bsize_t)dev_nobsize) #endif /* _KERNEL */ #endif /* !_SYS_DEVICE_H_ */ diff --git a/sys/kern/kern_stub.c b/sys/kern/kern_stub.c index 8603fd5..1a5fb0e 100644 --- a/sys/kern/kern_stub.c +++ b/sys/kern/kern_stub.c @@ -75,3 +75,9 @@ dev_nowrite(void) { return -ENOTSUP; } + +int +dev_nobsize(void) +{ + return -ENOTSUP; +} |