Changeset fad91b9 in mainline
- Timestamp:
- 2024-10-27T23:04:58Z (7 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)
- Location:
- uspace/srv/bd/hr
- Files:
-
- 5 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 -
uspace/srv/bd/hr/raid1.c
r50bed55d rfad91b9 85 85 } 86 86 87 static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 87 static errno_t hr_raid1_bd_op(hr_bd_op_type_t type, bd_srv_t *bd, aoff64_t ba, 88 size_t cnt, void *data_read, const void *data_write, size_t size) 88 89 { 89 90 hr_volume_t *vol = bd->srvs->sarg; 90 91 91 errno_t rc; 92 92 size_t i; 93 94 if (type == HR_BD_READ || type == HR_BD_WRITE) 95 if (size < cnt * vol->bsize) 96 return EINVAL; 93 97 94 98 rc = hr_check_ba_range(vol, cnt, ba); … … 100 104 fibril_mutex_lock(&vol->lock); 101 105 102 for (i = 0; i < vol->dev_no; i++) { 103 rc = block_sync_cache(vol->extents[i].svc_id, ba, cnt); 104 if (rc != EOK) 105 break; 106 switch (type) { 107 case HR_BD_SYNC: 108 for (i = 0; i < vol->dev_no; i++) { 109 rc = block_sync_cache(vol->extents[i].svc_id, ba, cnt); 110 if (rc != EOK) 111 goto error; 112 } 113 break; 114 case HR_BD_READ: 115 for (i = 0; i < vol->dev_no; i++) { 116 rc = block_read_direct(vol->extents[i].svc_id, ba, cnt, 117 data_read); 118 if (rc != EOK) 119 goto error; 120 } 121 break; 122 case HR_BD_WRITE: 123 for (i = 0; i < vol->dev_no; i++) { 124 rc = block_write_direct(vol->extents[i].svc_id, ba, cnt, 125 data_write); 126 if (rc != EOK) 127 goto error; 128 } 129 break; 130 default: 131 rc = EINVAL; 106 132 } 107 133 134 error: 108 135 fibril_mutex_unlock(&vol->lock); 109 136 return rc; 110 137 } 111 138 139 static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 140 { 141 return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0); 142 } 143 112 144 static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 113 145 void *buf, size_t size) 114 146 { 115 hr_volume_t *vol = bd->srvs->sarg; 116 117 errno_t rc; 118 size_t i; 119 120 rc = hr_check_ba_range(vol, cnt, ba); 121 if (rc != EOK) 122 return rc; 123 124 hr_add_ba_offset(vol, &ba); 125 126 fibril_mutex_lock(&vol->lock); 127 128 for (i = 0; i < vol->dev_no; i++) { 129 rc = block_read_direct(vol->extents[i].svc_id, ba, cnt, buf); 130 if (rc != EOK) 131 break; 132 } 133 134 fibril_mutex_unlock(&vol->lock); 135 return rc; 147 return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size); 136 148 } 137 149 … … 139 151 const void *data, size_t size) 140 152 { 141 hr_volume_t *vol = bd->srvs->sarg; 142 143 errno_t rc; 144 size_t i; 145 146 rc = hr_check_ba_range(vol, cnt, ba); 147 if (rc != EOK) 148 return rc; 149 150 hr_add_ba_offset(vol, &ba); 151 152 fibril_mutex_lock(&vol->lock); 153 154 for (i = 0; i < vol->dev_no; i++) { 155 rc = block_write_direct(vol->extents[i].svc_id, ba, cnt, data); 156 if (rc != EOK) 157 break; 158 } 159 160 fibril_mutex_unlock(&vol->lock); 161 return rc; 153 return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size); 162 154 } 163 155 -
uspace/srv/bd/hr/raid4.c
r50bed55d rfad91b9 106 106 xor(xorbuf, data, vol->bsize); 107 107 } else { 108 rc = block_read_direct(vol->extents[i].svc_id, block, 1, buf); 108 rc = block_read_direct(vol->extents[i].svc_id, block, 1, 109 buf); 109 110 if (rc != EOK) 110 111 goto end; … … 147 148 } 148 149 149 static errno_t hr_raid4_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 150 static errno_t hr_raid4_bd_op(hr_bd_op_type_t type, bd_srv_t *bd, aoff64_t ba, 151 size_t cnt, void *data_read, const void *data_write, size_t size) 150 152 { 151 153 hr_volume_t *vol = bd->srvs->sarg; 152 154 errno_t rc; 153 155 uint64_t phys_block; 154 size_t extent; 156 size_t extent, left; 157 158 if (type == HR_BD_READ || type == HR_BD_WRITE) 159 if (size < cnt * vol->bsize) 160 return EINVAL; 155 161 156 162 rc = hr_check_ba_range(vol, cnt, ba); … … 160 166 fibril_mutex_lock(&vol->lock); 161 167 162 size_tleft = cnt;168 left = cnt; 163 169 while (left != 0) { 164 170 raid4_geometry(ba, vol, &extent, &phys_block); 165 171 hr_add_ba_offset(vol, &phys_block); 166 rc = block_sync_cache(vol->extents[extent].svc_id, phys_block, 1); 172 switch (type) { 173 case HR_BD_SYNC: 174 rc = block_sync_cache(vol->extents[extent].svc_id, 175 phys_block, 1); 176 break; 177 case HR_BD_READ: 178 rc = block_read_direct(vol->extents[extent].svc_id, 179 phys_block, 1, data_read); 180 data_read = data_read + vol->bsize; 181 break; 182 case HR_BD_WRITE: 183 rc = block_write_direct(vol->extents[extent].svc_id, 184 phys_block, 1, data_write); 185 if (rc != EOK) 186 goto error; 187 rc = write_parity(vol, extent, phys_block, data_write); 188 if (rc != EOK) 189 goto error; 190 data_write = data_write + vol->bsize; 191 break; 192 default: 193 rc = EINVAL; 194 } 195 167 196 if (rc != EOK) 168 break; 197 goto error; 198 169 199 left--; 170 200 ba++; 171 201 } 172 202 203 error: 173 204 fibril_mutex_unlock(&vol->lock); 174 205 return rc; 175 206 } 176 207 208 static errno_t hr_raid4_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 209 { 210 return hr_raid4_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0); 211 } 212 177 213 static errno_t hr_raid4_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 178 214 void *buf, size_t size) 179 215 { 180 hr_volume_t *vol = bd->srvs->sarg; 181 errno_t rc; 182 uint64_t phys_block; 183 size_t extent; 184 185 if (size < cnt * vol->bsize) 186 return EINVAL; 187 188 rc = hr_check_ba_range(vol, cnt, ba); 189 if (rc != EOK) 190 return rc; 191 192 fibril_mutex_lock(&vol->lock); 193 194 size_t left = cnt; 195 while (left != 0) { 196 raid4_geometry(ba, vol, &extent, &phys_block); 197 hr_add_ba_offset(vol, &phys_block); 198 rc = block_read_direct(vol->extents[extent].svc_id, phys_block, 1, buf); 199 buf = buf + vol->bsize; 200 if (rc != EOK) 201 break; 202 left--; 203 ba++; 204 } 205 206 fibril_mutex_unlock(&vol->lock); 207 return rc; 216 return hr_raid4_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size); 208 217 } 209 218 … … 211 220 const void *data, size_t size) 212 221 { 213 hr_volume_t *vol = bd->srvs->sarg; 214 errno_t rc; 215 uint64_t phys_block; 216 size_t extent; 217 218 if (size < cnt * vol->bsize) 219 return EINVAL; 220 221 rc = hr_check_ba_range(vol, cnt, ba); 222 if (rc != EOK) 223 return rc; 224 225 fibril_mutex_lock(&vol->lock); 226 227 size_t left = cnt; 228 while (left != 0) { 229 raid4_geometry(ba, vol, &extent, &phys_block); 230 hr_add_ba_offset(vol, &phys_block); 231 rc = block_write_direct(vol->extents[extent].svc_id, phys_block, 1, data); 232 if (rc != EOK) 233 break; 234 rc = write_parity(vol, extent, phys_block, data); 235 if (rc != EOK) 236 break; 237 data = data + vol->bsize; 238 left--; 239 ba++; 240 } 241 242 fibril_mutex_unlock(&vol->lock); 243 return rc; 222 return hr_raid4_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size); 244 223 } 245 224 -
uspace/srv/bd/hr/raid5.c
r50bed55d rfad91b9 109 109 xor(xorbuf, data, vol->bsize); 110 110 } else { 111 rc = block_read_direct(vol->extents[i].svc_id, block, 1, buf); 111 rc = block_read_direct(vol->extents[i].svc_id, block, 1, 112 buf); 112 113 if (rc != EOK) 113 114 goto end; … … 116 117 } 117 118 118 rc = block_write_direct(vol->extents[p_extent].svc_id, block, 1, xorbuf); 119 rc = block_write_direct(vol->extents[p_extent].svc_id, block, 1, 120 xorbuf); 119 121 120 122 end: … … 159 161 } 160 162 161 static errno_t hr_raid5_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 163 static errno_t hr_raid5_bd_op(hr_bd_op_type_t type, bd_srv_t *bd, aoff64_t ba, 164 size_t cnt, void *data_read, const void *data_write, size_t size) 162 165 { 163 166 hr_volume_t *vol = bd->srvs->sarg; 164 167 errno_t rc; 165 uint64_t phys_block; 166 size_t extent; 168 uint64_t phys_block, p_extent; 169 size_t extent, left; 170 171 if (type == HR_BD_READ || type == HR_BD_WRITE) 172 if (size < cnt * vol->bsize) 173 return EINVAL; 167 174 168 175 rc = hr_check_ba_range(vol, cnt, ba); … … 172 179 fibril_mutex_lock(&vol->lock); 173 180 174 size_tleft = cnt;181 left = cnt; 175 182 while (left != 0) { 176 raid5_geometry(ba, vol, &extent, &phys_block, NULL); 177 hr_add_ba_offset(vol, &phys_block); 178 rc = block_sync_cache(vol->extents[extent].svc_id, phys_block, 1); 183 switch (type) { 184 case HR_BD_SYNC: 185 raid5_geometry(ba, vol, &extent, &phys_block, NULL); 186 hr_add_ba_offset(vol, &phys_block); 187 rc = block_sync_cache(vol->extents[extent].svc_id, 188 phys_block, 1); 189 break; 190 case HR_BD_READ: 191 raid5_geometry(ba, vol, &extent, &phys_block, NULL); 192 hr_add_ba_offset(vol, &phys_block); 193 rc = block_read_direct(vol->extents[extent].svc_id, 194 phys_block, 1, data_read); 195 data_read = data_read + vol->bsize; 196 break; 197 case HR_BD_WRITE: 198 raid5_geometry(ba, vol, &extent, &phys_block, 199 &p_extent); 200 hr_add_ba_offset(vol, &phys_block); 201 rc = block_write_direct(vol->extents[extent].svc_id, 202 phys_block, 1, data_write); 203 if (rc != EOK) 204 goto error; 205 rc = write_parity(vol, p_extent, extent, phys_block, 206 data_write); 207 if (rc != EOK) 208 goto error; 209 data_write = data_write + vol->bsize; 210 break; 211 default: 212 rc = EINVAL; 213 } 214 179 215 if (rc != EOK) 180 break; 216 goto error; 217 181 218 left--; 182 219 ba++; 183 220 } 184 221 222 error: 185 223 fibril_mutex_unlock(&vol->lock); 186 224 return rc; 187 225 } 188 226 227 static errno_t hr_raid5_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt) 228 { 229 return hr_raid5_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0); 230 } 231 189 232 static errno_t hr_raid5_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 190 233 void *buf, size_t size) 191 234 { 192 hr_volume_t *vol = bd->srvs->sarg; 193 errno_t rc; 194 uint64_t phys_block; 195 size_t extent; 196 197 if (size < cnt * vol->bsize) 198 return EINVAL; 199 200 rc = hr_check_ba_range(vol, cnt, ba); 201 if (rc != EOK) 202 return rc; 203 204 fibril_mutex_lock(&vol->lock); 205 206 size_t left = cnt; 207 while (left != 0) { 208 raid5_geometry(ba, vol, &extent, &phys_block, NULL); 209 hr_add_ba_offset(vol, &phys_block); 210 rc = block_read_direct(vol->extents[extent].svc_id, phys_block, 1, buf); 211 buf = buf + vol->bsize; 212 if (rc != EOK) 213 break; 214 left--; 215 ba++; 216 } 217 218 fibril_mutex_unlock(&vol->lock); 219 return rc; 235 return hr_raid5_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size); 220 236 } 221 237 … … 223 239 const void *data, size_t size) 224 240 { 225 hr_volume_t *vol = bd->srvs->sarg; 226 errno_t rc; 227 uint64_t phys_block, p_extent; 228 size_t extent; 229 230 if (size < cnt * vol->bsize) 231 return EINVAL; 232 233 rc = hr_check_ba_range(vol, cnt, ba); 234 if (rc != EOK) 235 return rc; 236 237 fibril_mutex_lock(&vol->lock); 238 239 size_t left = cnt; 240 while (left != 0) { 241 raid5_geometry(ba, vol, &extent, &phys_block, &p_extent); 242 hr_add_ba_offset(vol, &phys_block); 243 rc = block_write_direct(vol->extents[extent].svc_id, phys_block, 1, data); 244 if (rc != EOK) 245 break; 246 rc = write_parity(vol, p_extent, extent, phys_block, data); 247 if (rc != EOK) 248 break; 249 data = data + vol->bsize; 250 left--; 251 ba++; 252 } 253 254 fibril_mutex_unlock(&vol->lock); 255 return rc; 241 return hr_raid5_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size); 256 242 } 257 243 -
uspace/srv/bd/hr/var.h
r50bed55d rfad91b9 69 69 } hr_volume_t; 70 70 71 typedef enum { 72 HR_BD_SYNC, 73 HR_BD_READ, 74 HR_BD_WRITE 75 } hr_bd_op_type_t; 76 71 77 extern errno_t hr_init_devs(hr_volume_t *); 72 78 extern void hr_fini_devs(hr_volume_t *);
Note:
See TracChangeset
for help on using the changeset viewer.