summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-08-18 03:03:18 +0000
committerIan Moffett <ian@osmora.org>2025-08-18 03:03:18 +0000
commit50013e9da3036dbd8f36a2e1a8bfdc81d707d11f (patch)
treed05d022a80e203955b03b1f9300c9c4da7f37eb7 /sys
parent62c2199871975942247758d57a65ca384fa67832 (diff)
kernel: disk: Implement disk_query()
Introduce disk_query() implementation which allows information about a specific disk to be retrieved. Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_disk.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/sys/kern/kern_disk.c b/sys/kern/kern_disk.c
index 5c09c81..a3fa05e 100644
--- a/sys/kern/kern_disk.c
+++ b/sys/kern/kern_disk.c
@@ -433,3 +433,43 @@ disk_write(diskid_t id, blkoff_t blk, const void *buf, size_t len)
disk_buf_free(tmp);
return retval;
}
+
+/*
+ * Attempt to request attributes from a specific
+ * device.
+ *
+ * @id: ID of disk to query
+ * @res: Resulting information goes here
+ *
+ * This function returns zero on success, otherwise
+ * a less than zero value is returned.
+ */
+int
+disk_query(diskid_t id, struct disk_info *res)
+{
+ const struct bdevsw *bdev;
+ struct disk *dp;
+ int error;
+
+ if (res == NULL) {
+ return -EINVAL;
+ }
+
+ /* Attempt to grab the disk */
+ error = disk_get_id(id, &dp);
+ if (error < 0) {
+ pr_error("disk_query: bad disk ID %d\n", id);
+ return error;
+ }
+
+ bdev = dp->bdev;
+ if (__unlikely(bdev == NULL)) {
+ pr_error("disk_query: no bdev for disk %d\n", id);
+ return -EIO;
+ }
+
+ res->block_size = dp->bsize;
+ res->vblock_size = V_BSIZE;
+ res->n_block = bdev->bsize(dp->dev);
+ return 0;
+}