diff options
author | Ian Moffett <ian@osmora.org> | 2025-08-18 03:03:18 +0000 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-08-18 03:03:18 +0000 |
commit | 50013e9da3036dbd8f36a2e1a8bfdc81d707d11f (patch) | |
tree | d05d022a80e203955b03b1f9300c9c4da7f37eb7 /sys/kern | |
parent | 62c2199871975942247758d57a65ca384fa67832 (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/kern')
-rw-r--r-- | sys/kern/kern_disk.c | 40 |
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; +} |