Changeset bb4d0b5 in mainline for uspace/lib/fmgt/src
- Timestamp:
- 2025-10-18T19:29:40Z (3 months ago)
- Branches:
- master
- Children:
- 3e41cc4
- Parents:
- 856a7b49
- File:
-
- 1 edited
-
uspace/lib/fmgt/src/fmgt.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fmgt/src/fmgt.c
r856a7b49 rbb4d0b5 221 221 } 222 222 223 /** Stop progress update timer. 224 * 225 * @param fmgt File management object 226 */ 227 static void fmgt_timer_stop(fmgt_t *fmgt) 228 { 229 (void)fibril_timer_clear(fmgt->timer); 230 } 231 223 232 /** Query caller whether operation should be aborted. 224 233 * … … 232 241 else 233 242 return false; 243 } 244 245 /** Query caller how to recover from I/O error. 246 * 247 * @param fmgt File management object 248 * @param err I/O error report 249 * @return What error recovery action should be taken. 250 */ 251 static fmgt_error_action_t fmgt_io_error_query(fmgt_t *fmgt, 252 fmgt_io_error_t *err) 253 { 254 if (fmgt->cb != NULL && fmgt->cb->io_error_query != NULL) 255 return fmgt->cb->io_error_query(fmgt->cb_arg, err); 256 else 257 return fmgt_er_abort; 234 258 } 235 259 … … 250 274 uint64_t now; 251 275 char *buffer; 276 fmgt_io_error_t err; 277 fmgt_error_action_t action; 252 278 errno_t rc; 253 279 … … 270 296 fmgt_initial_progress_update(fmgt); 271 297 298 /* Create sparse file? */ 272 299 if ((flags & nf_sparse) != 0) { 273 300 fmgt->curf_procb = fsize - 1; … … 280 307 now = BUFFER_SIZE; 281 308 282 rc = vfs_write(fd, &pos, buffer, now, &nw); 309 do { 310 rc = vfs_write(fd, &pos, buffer, now, &nw); 311 if (rc == EOK) 312 break; 313 314 /* I/O error */ 315 err.fname = fname; 316 err.optype = fmgt_io_write; 317 err.rc = rc; 318 fmgt_timer_stop(fmgt); 319 action = fmgt_io_error_query(fmgt, &err); 320 fmgt_timer_start(fmgt); 321 } while (action == fmgt_er_retry); 322 323 /* Not recovered? */ 283 324 if (rc != EOK) { 284 325 free(buffer);
Note:
See TracChangeset
for help on using the changeset viewer.
