summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-05-26 01:51:22 -0400
committerIan Moffett <ian@osmora.org>2025-05-26 01:51:22 -0400
commit6b52b61f5bde1bcc1e08d760b6650009e9f1cab4 (patch)
tree8b807f62328afc186e79383f585595f4833727c5 /sys
parent08d925bce8a18361655a56bf5b38d6f9e9134b8a (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.c11
-rw-r--r--sys/include/sys/device.h4
-rw-r--r--sys/kern/kern_stub.c6
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;
+}