diff options
Diffstat (limited to 'sys/include')
-rw-r--r-- | sys/include/sys/disk.h | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/sys/include/sys/disk.h b/sys/include/sys/disk.h index 0570fe2..4ad068b 100644 --- a/sys/include/sys/disk.h +++ b/sys/include/sys/disk.h @@ -41,6 +41,8 @@ #include <dev/dcdr/cache.h> #endif /* _KERNEL */ +#define DISK_NAME_MAX 64 + /* * V_BSIZE is the virtual block size in bytes used * by the disk framework. The virtual block size is a @@ -74,8 +76,9 @@ _Static_assert((V_BSIZE & 1) == 0, "V_BSIZE must be a power of two"); #define DISK_PARAM_COOKIE 0xD1531001 /* Valid disk operations */ -#define DISK_IO_READ 0x00 -#define DISK_IO_WRITE 0x01 +#define DISK_IO_READ 0x00 /* Read data from the disk */ +#define DISK_IO_WRITE 0x01 /* Write data to disk */ +#define DISK_IO_QUERY 0x02 /* Query disk information */ /* * A disk identifier is a zero-based index into @@ -95,18 +98,30 @@ typedef off_t blkoff_t; typedef uint8_t diskop_t; /* + * Describes basic disk information + * + * @block_size: Hardware block size + * @vblock_size: Virtual block size + * @n_block: Number of blocks total + */ +struct disk_info { + uint32_t block_size; + uint32_t vblock_size; + size_t n_block; +}; + +/* * The disk metadata structure contains information * describing the disk. It is used for Hyra's pbuf * (persistent buffers / sls) support. This structure * is to be stored at the very last sector of the drive. * - * @root_blk: Disk offset to root block - * @n_ublk: Number of usable user blocks + * @canary: Boot canary to verify persistent instance + * @info: Disk attributes */ -struct disk_meta { - char magic[6]; - blkoff_t root_blk; - size_t n_ublk; +struct disk_root { + uint32_t canary; + struct disk_info info; }; /* @@ -141,7 +156,7 @@ struct disk_param { * @res: Pointer to params to be initialized */ __always_inline static inline void -disk_param_init(uint8_t *buf, blkoff_t blk, size_t size, struct disk_param *res) +disk_param_init(void *buf, blkoff_t blk, size_t size, struct disk_param *res) { if (res != NULL) { res->buf = buf; @@ -156,10 +171,13 @@ disk_param_init(uint8_t *buf, blkoff_t blk, size_t size, struct disk_param *res) */ #if !defined(_KERNEL) ssize_t __disk_io(diskid_t id, diskop_t op, const struct disk_param *param); -ssize_t disk_write(diskid_t id, blkoff_t off, const void *buf, size_t len); -ssize_t disk_read(diskid_t id, blkoff_t off, void *buf, size_t len); #endif /* !_KERNEL */ +/* Common disk operations */ +int disk_query(diskid_t id, struct disk_info *res); +ssize_t disk_read(diskid_t id, blkoff_t blk, void *buf, size_t len); +ssize_t disk_write(diskid_t id, blkoff_t blk, const void *buf, size_t len); + #if defined(_KERNEL) /* * Represents a block storage device @@ -173,7 +191,7 @@ ssize_t disk_read(diskid_t id, blkoff_t off, void *buf, size_t len); * @link: TAILQ link */ struct disk { - char name[NAME_MAX]; + char name[DISK_NAME_MAX]; uint32_t cookie; uint16_t bsize; dev_t dev; @@ -185,9 +203,6 @@ struct disk { void *disk_buf_alloc(diskid_t id, size_t len); void disk_buf_free(void *p); -ssize_t disk_read(diskid_t id, blkoff_t blk, void *buf, size_t len); -ssize_t disk_write(diskid_t id, blkoff_t blk, const void *buf, size_t len); - int disk_add(const char *name, dev_t dev, const struct bdevsw *bdev, int flags); int disk_get_id(diskid_t id, struct disk **res); |