Changeset fad91b9 in mainline for uspace/srv/bd/hr/raid0.c
- Timestamp:
- 2024-10-27T23:04:58Z (9 months ago)
- Children:
- 76cd345
- Parents:
- 50bed55d
- git-author:
- Miroslav Cimerman <mc@…> (2024-10-27 22:51:08)
- git-committer:
- Miroslav Cimerman <mc@…> (2024-10-27 23:04:58)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/raid0.c
r50bed55d rfad91b9 100 100 } 101 101 102 static errno_t hr_raid0_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 102 static errno_t hr_raid0_bd_op(hr_bd_op_type_t type, bd_srv_t *bd, aoff64_t ba, 103 size_t cnt, void *data_read, const void *data_write, size_t size) 103 104 { 104 105 hr_volume_t *vol = bd->srvs->sarg; … … 107 108 size_t extent, left; 108 109 110 if (type == HR_BD_READ || type == HR_BD_WRITE) 111 if (size < cnt * vol->bsize) 112 return EINVAL; 113 109 114 rc = hr_check_ba_range(vol, cnt, ba); 110 115 if (rc != EOK) … … 117 122 raid0_geometry(ba, vol, &extent, &phys_block); 118 123 hr_add_ba_offset(vol, &phys_block); 119 rc = block_sync_cache(vol->extents[extent].svc_id, phys_block, 1); 124 switch (type) { 125 case HR_BD_SYNC: 126 rc = block_sync_cache(vol->extents[extent].svc_id, 127 phys_block, 1); 128 break; 129 case HR_BD_READ: 130 rc = block_read_direct(vol->extents[extent].svc_id, 131 phys_block, 1, data_read); 132 data_read = data_read + vol->bsize; 133 break; 134 case HR_BD_WRITE: 135 rc = block_write_direct(vol->extents[extent].svc_id, 136 phys_block, 1, data_write); 137 data_write = data_write + vol->bsize; 138 break; 139 default: 140 rc = EINVAL; 141 } 142 120 143 if (rc != EOK) 121 break; 144 goto error; 145 122 146 left--; 123 147 ba++; 124 148 } 125 149 150 error: 126 151 fibril_mutex_unlock(&vol->lock); 127 152 return rc; 128 153 } 129 154 155 static errno_t hr_raid0_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 156 { 157 return hr_raid0_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0); 158 } 159 130 160 static errno_t hr_raid0_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 131 161 void *buf, size_t size) 132 162 { 133 hr_volume_t *vol = bd->srvs->sarg; 134 errno_t rc; 135 uint64_t phys_block; 136 size_t extent, left; 137 138 if (size < cnt * vol->bsize) 139 return EINVAL; 140 141 rc = hr_check_ba_range(vol, cnt, ba); 142 if (rc != EOK) 143 return rc; 144 145 fibril_mutex_lock(&vol->lock); 146 147 left = cnt; 148 while (left != 0) { 149 raid0_geometry(ba, vol, &extent, &phys_block); 150 hr_add_ba_offset(vol, &phys_block); 151 rc = block_read_direct(vol->extents[extent].svc_id, phys_block, 1, buf); 152 buf = buf + vol->bsize; 153 if (rc != EOK) 154 break; 155 left--; 156 ba++; 157 } 158 159 fibril_mutex_unlock(&vol->lock); 160 return rc; 163 return hr_raid0_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size); 161 164 } 162 165 … … 164 167 const void *data, size_t size) 165 168 { 166 hr_volume_t *vol = bd->srvs->sarg; 167 errno_t rc; 168 uint64_t phys_block; 169 size_t extent, left; 170 171 if (size < cnt * vol->bsize) 172 return EINVAL; 173 174 rc = hr_check_ba_range(vol, cnt, ba); 175 if (rc != EOK) 176 return rc; 177 178 fibril_mutex_lock(&vol->lock); 179 180 left = cnt; 181 while (left != 0) { 182 raid0_geometry(ba, vol, &extent, &phys_block); 183 hr_add_ba_offset(vol, &phys_block); 184 rc = block_write_direct(vol->extents[extent].svc_id, phys_block, 1, data); 185 data = data + vol->bsize; 186 if (rc != EOK) 187 break; 188 left--; 189 ba++; 190 } 191 192 fibril_mutex_unlock(&vol->lock); 193 return rc; 169 return hr_raid0_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size); 194 170 } 195 171
Note:
See TracChangeset
for help on using the changeset viewer.