|
|
1.1 root 1: /* device server routines for disk partitions within oskit block devices
2: */
3:
4: #include "ds_oskit.h"
5:
6: #include <oskit/io/blkio.h>
7: #include <oskit/diskpart/diskpart.h>
8:
9: static io_return_t
10: adjust_recnum (device_t dev, recnum_t *recnum, unsigned int count)
11: {
12: recnum_t countrecs = count / dev->com.blkpart.blk->com.blk.size;
13: if (*recnum + countrecs > dev->com.blkpart.part->size)
14: INVALREC;
15: *recnum += dev->com.blkpart.part->start;
16: return 0;
17: }
18:
19: io_return_t
20: ds_blkpart_write (device_t dev, ipc_port_t reply_port,
21: mach_msg_type_name_t reply_port_type, dev_mode_t mode,
22: recnum_t recnum, io_buf_ptr_t data, unsigned int count,
23: int *bytes_written)
24: {
25: return (adjust_recnum (dev, &recnum, count) ?:
26: ds_device_write (dev->com.blkpart.blk,
27: reply_port, reply_port_type,
28: mode, recnum, data, count, bytes_written));
29: }
30:
31: io_return_t
32: ds_blkpart_write_inband (device_t dev, ipc_port_t reply_port,
33: mach_msg_type_name_t reply_port_type, dev_mode_t mode,
34: recnum_t recnum,
35: io_buf_ptr_t data, unsigned int count,
36: int *bytes_written)
37: {
38: return (adjust_recnum (dev, &recnum, count) ?:
39: ds_device_write_inband (dev->com.blkpart.blk,
40: reply_port, reply_port_type,
41: mode, recnum, data, count, bytes_written));
42: }
43:
44:
45: io_return_t
46: ds_blkpart_read (device_t dev, ipc_port_t reply_port,
47: mach_msg_type_name_t reply_port_type, dev_mode_t mode,
48: recnum_t recnum, int count, io_buf_ptr_t *data,
49: unsigned *bytes_read)
50: {
51: return (adjust_recnum (dev, &recnum, count) ?:
52: ds_device_read (dev->com.blkpart.blk,
53: reply_port, reply_port_type,
54: mode, recnum, count, data, bytes_read));
55: }
56:
57: io_return_t
58: ds_blkpart_read_inband (device_t dev, ipc_port_t reply_port,
59: mach_msg_type_name_t reply_port_type, dev_mode_t mode,
60: recnum_t recnum, int count, char *data,
61: unsigned *bytes_read)
62: {
63: return (adjust_recnum (dev, &recnum, count) ?:
64: ds_device_read_inband (dev->com.blkpart.blk,
65: reply_port, reply_port_type,
66: mode, recnum, count, data, bytes_read));
67: }
68:
69: io_return_t
70: ds_blkpart_get_status (device_t dev, dev_flavor_t flavor, dev_status_t status,
71: mach_msg_type_number_t *status_count)
72: {
73: switch (flavor)
74: {
75: case DEV_GET_SIZE:
76: {
77: status[DEV_GET_SIZE_RECORD_SIZE] = dev->com.blkpart.blk->com.blk.size;
78: status[DEV_GET_SIZE_DEVICE_SIZE] = (dev->com.blkpart.blk->com.blk.size
79: * dev->com.blkpart.part->size);
80: *status_count = 2;
81: return D_SUCCESS;
82: }
83: }
84: INVALOP;
85: }
86:
87: void
88: ds_blkpart_close (device_t dev)
89: {
90: /* We store the partition pointer instead of a COM object here, so we'd
91: better clear this field before returning to device_deallocate, which
92: will attempt to call the COM release method. */
93: dev->com_device = 0;
94:
95: /* Release our ref on the underlying device. */
96: device_deallocate (dev->com.blkpart.blk);
97: }
98:
99: const struct device_ops block_partition_device_ops =
100: {
101: write_inband: ds_blkpart_write_inband, write: ds_blkpart_write,
102: read_inband: ds_blkpart_read_inband, read: ds_blkpart_read,
103: get_status: ds_blkpart_get_status,
104: close: ds_blkpart_close
105: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.