libblockdriver: allow for not handling partitions
Each block driver now gets to specify whether it is a disk block driver, which implies it wants the library to handle getting and setting partitions for it.
This commit is contained in:
parent
a03f679e88
commit
e2758c6759
7 changed files with 62 additions and 27 deletions
|
@ -5,8 +5,15 @@
|
||||||
|
|
||||||
typedef int thread_id_t;
|
typedef int thread_id_t;
|
||||||
|
|
||||||
|
/* Types supported for the 'type' field of struct blockdriver. */
|
||||||
|
typedef enum {
|
||||||
|
BLOCKDRIVER_TYPE_DISK, /* handle partition requests */
|
||||||
|
BLOCKDRIVER_TYPE_OTHER /* do not handle partition requests */
|
||||||
|
} blockdriver_type_t;
|
||||||
|
|
||||||
/* Entry points into the device dependent code of block drivers. */
|
/* Entry points into the device dependent code of block drivers. */
|
||||||
struct blockdriver {
|
struct blockdriver {
|
||||||
|
blockdriver_type_t bdr_type;
|
||||||
_PROTOTYPE( int (*bdr_open), (dev_t minor, int access) );
|
_PROTOTYPE( int (*bdr_open), (dev_t minor, int access) );
|
||||||
_PROTOTYPE( int (*bdr_close), (dev_t minor) );
|
_PROTOTYPE( int (*bdr_close), (dev_t minor) );
|
||||||
_PROTOTYPE( ssize_t (*bdr_transfer), (dev_t minor, int do_write, u64_t pos,
|
_PROTOTYPE( ssize_t (*bdr_transfer), (dev_t minor, int do_write, u64_t pos,
|
||||||
|
|
|
@ -208,6 +208,7 @@ PRIVATE struct port_state *ahci_get_port(dev_t minor);
|
||||||
|
|
||||||
/* AHCI driver table. */
|
/* AHCI driver table. */
|
||||||
PRIVATE struct blockdriver ahci_dtab = {
|
PRIVATE struct blockdriver ahci_dtab = {
|
||||||
|
BLOCKDRIVER_TYPE_DISK,
|
||||||
ahci_open,
|
ahci_open,
|
||||||
ahci_close,
|
ahci_close,
|
||||||
ahci_transfer,
|
ahci_transfer,
|
||||||
|
|
|
@ -200,6 +200,7 @@ FORWARD _PROTOTYPE( int at_in, (int line, u32_t port, unsigned long *value,
|
||||||
|
|
||||||
/* Entry points to this driver. */
|
/* Entry points to this driver. */
|
||||||
PRIVATE struct blockdriver w_dtab = {
|
PRIVATE struct blockdriver w_dtab = {
|
||||||
|
BLOCKDRIVER_TYPE_DISK,/* handle partition requests */
|
||||||
w_do_open, /* open or mount request, initialize device */
|
w_do_open, /* open or mount request, initialize device */
|
||||||
w_do_close, /* release device */
|
w_do_close, /* release device */
|
||||||
w_transfer, /* do the I/O */
|
w_transfer, /* do the I/O */
|
||||||
|
|
|
@ -70,6 +70,7 @@ FORWARD _PROTOTYPE( int w_ioctl, (dev_t minor, unsigned int request,
|
||||||
|
|
||||||
/* Entry points to this driver. */
|
/* Entry points to this driver. */
|
||||||
PRIVATE struct blockdriver w_dtab = {
|
PRIVATE struct blockdriver w_dtab = {
|
||||||
|
BLOCKDRIVER_TYPE_DISK, /* handle partition requests */
|
||||||
w_do_open, /* open or mount request, initialize device */
|
w_do_open, /* open or mount request, initialize device */
|
||||||
w_do_close, /* release device */
|
w_do_close, /* release device */
|
||||||
w_transfer, /* do the I/O */
|
w_transfer, /* do the I/O */
|
||||||
|
|
|
@ -267,6 +267,7 @@ FORWARD _PROTOTYPE( void f_geometry, (dev_t minor,
|
||||||
|
|
||||||
/* Entry points to this driver. */
|
/* Entry points to this driver. */
|
||||||
PRIVATE struct blockdriver f_dtab = {
|
PRIVATE struct blockdriver f_dtab = {
|
||||||
|
BLOCKDRIVER_TYPE_DISK, /* handle partition requests */
|
||||||
f_do_open, /* open or mount request, sense type of diskette */
|
f_do_open, /* open or mount request, sense type of diskette */
|
||||||
f_do_close, /* nothing on a close */
|
f_do_close, /* nothing on a close */
|
||||||
f_transfer, /* do the I/O */
|
f_transfer, /* do the I/O */
|
||||||
|
|
|
@ -76,6 +76,7 @@ PRIVATE struct chardriver m_cdtab = {
|
||||||
|
|
||||||
/* Entry points to the BLOCK part of this driver. */
|
/* Entry points to the BLOCK part of this driver. */
|
||||||
PRIVATE struct blockdriver m_bdtab = {
|
PRIVATE struct blockdriver m_bdtab = {
|
||||||
|
BLOCKDRIVER_TYPE_DISK,/* handle partition requests */
|
||||||
m_block_open, /* open or mount */
|
m_block_open, /* open or mount */
|
||||||
m_block_close, /* nothing on a close */
|
m_block_close, /* nothing on a close */
|
||||||
m_block_transfer, /* do the I/O */
|
m_block_transfer, /* do the I/O */
|
||||||
|
|
|
@ -248,39 +248,20 @@ PRIVATE int do_vrdwt(struct blockdriver *bdp, message *mp, thread_id_t id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* do_ioctl *
|
* do_dioctl *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
PRIVATE int do_ioctl(struct blockdriver *bdp, message *mp)
|
PRIVATE int do_dioctl(struct blockdriver *bdp, dev_t minor,
|
||||||
|
unsigned int request, endpoint_t endpt, cp_grant_id_t grant)
|
||||||
{
|
{
|
||||||
/* Carry out an I/O control request. For now, we handle setting/getting
|
/* Carry out a disk-specific I/O control request. */
|
||||||
* partitions here, forward block trace control requests to the tracing module,
|
|
||||||
* and let the driver handle any other requests. In the future, a stricter
|
|
||||||
* separation between block and disk I/O controls may become desirable, but we
|
|
||||||
* do not have any non-"disk" block drivers at this time.
|
|
||||||
*/
|
|
||||||
struct device *dv;
|
struct device *dv;
|
||||||
struct partition entry;
|
struct partition entry;
|
||||||
unsigned int request;
|
int r = EINVAL;
|
||||||
cp_grant_id_t grant;
|
|
||||||
dev_t minor;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
minor = mp->BDEV_MINOR;
|
|
||||||
request = mp->BDEV_REQUEST;
|
|
||||||
grant = mp->BDEV_GRANT;
|
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case BIOCTRACEBUF:
|
|
||||||
case BIOCTRACECTL:
|
|
||||||
case BIOCTRACEGET:
|
|
||||||
/* Block trace control. */
|
|
||||||
r = trace_ctl(minor, request, mp->m_source, grant);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DIOCSETP:
|
case DIOCSETP:
|
||||||
/* Copy just this one partition table entry. */
|
/* Copy just this one partition table entry. */
|
||||||
r = sys_safecopyfrom(mp->m_source, grant, 0, (vir_bytes) &entry,
|
r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes) &entry,
|
||||||
sizeof(entry), D);
|
sizeof(entry), D);
|
||||||
if (r != OK)
|
if (r != OK)
|
||||||
return r;
|
return r;
|
||||||
|
@ -307,11 +288,53 @@ PRIVATE int do_ioctl(struct blockdriver *bdp, message *mp)
|
||||||
entry.sectors = 32;
|
entry.sectors = 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = sys_safecopyto(mp->m_source, grant, 0, (vir_bytes) &entry,
|
r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &entry, sizeof(entry),
|
||||||
sizeof(entry), D);
|
D);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* do_ioctl *
|
||||||
|
*===========================================================================*/
|
||||||
|
PRIVATE int do_ioctl(struct blockdriver *bdp, message *mp)
|
||||||
|
{
|
||||||
|
/* Carry out an I/O control request. We forward block trace control requests
|
||||||
|
* to the tracing module, and handle setting/getting partitions when the driver
|
||||||
|
* has specified that it is a disk driver.
|
||||||
|
*/
|
||||||
|
dev_t minor;
|
||||||
|
unsigned int request;
|
||||||
|
cp_grant_id_t grant;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
minor = mp->BDEV_MINOR;
|
||||||
|
request = mp->BDEV_REQUEST;
|
||||||
|
grant = mp->BDEV_GRANT;
|
||||||
|
|
||||||
|
switch (request) {
|
||||||
|
case BIOCTRACEBUF:
|
||||||
|
case BIOCTRACECTL:
|
||||||
|
case BIOCTRACEGET:
|
||||||
|
/* Block trace control. */
|
||||||
|
r = trace_ctl(minor, request, mp->m_source, grant);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DIOCSETP:
|
||||||
|
case DIOCGETP:
|
||||||
|
/* Handle disk-specific IOCTLs only for disk-type drivers. */
|
||||||
|
if (bdp->bdr_type == BLOCKDRIVER_TYPE_DISK) {
|
||||||
|
/* Disk partition control. */
|
||||||
|
r = do_dioctl(bdp, minor, request, mp->m_source, grant);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fall-through */
|
||||||
default:
|
default:
|
||||||
if (bdp->bdr_ioctl)
|
if (bdp->bdr_ioctl)
|
||||||
r = (*bdp->bdr_ioctl)(minor, request, mp->m_source, grant);
|
r = (*bdp->bdr_ioctl)(minor, request, mp->m_source, grant);
|
||||||
|
|
Loading…
Reference in a new issue