Changeset View
Changeset View
Standalone View
Standalone View
stand/userboot/userboot/userboot_disk.c
Show First 20 Lines • Show All 205 Lines • ▼ Show 20 Lines | |||||
userdisk_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, | userdisk_realstrategy(void *devdata, int rw, daddr_t dblk, size_t size, | ||||
char *buf, size_t *rsize) | char *buf, size_t *rsize) | ||||
{ | { | ||||
struct disk_devdesc *dev = devdata; | struct disk_devdesc *dev = devdata; | ||||
uint64_t off; | uint64_t off; | ||||
size_t resid; | size_t resid; | ||||
int rc; | int rc; | ||||
rw &= F_MASK; | |||||
if (rw == F_WRITE) | |||||
return (EROFS); | |||||
if (rw != F_READ) | |||||
return (EINVAL); | |||||
if (rsize) | if (rsize) | ||||
*rsize = 0; | *rsize = 0; | ||||
off = dblk * ud_info[dev->dd.d_unit].sectorsize; | off = dblk * ud_info[dev->dd.d_unit].sectorsize; | ||||
switch (rw & F_MASK) { | |||||
case F_READ: | |||||
rc = CALLBACK(diskread, dev->dd.d_unit, off, buf, size, &resid); | rc = CALLBACK(diskread, dev->dd.d_unit, off, buf, size, &resid); | ||||
break; | |||||
case F_WRITE: | |||||
rc = CALLBACK(diskwrite, dev->dd.d_unit, off, buf, size, | |||||
&resid); | |||||
break; | |||||
default: | |||||
rc = EINVAL; | |||||
break; | |||||
} | |||||
if (rc) | if (rc) | ||||
return (rc); | return (rc); | ||||
if (rsize) | if (rsize) | ||||
*rsize = size - resid; | *rsize = size - resid; | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
Show All 12 Lines |