Skip to content

Commit 1ab882a

Browse files
Merge pull request #852 from robertbaldyga/forward_io-fix-error-accounting
Fix error accounting in forward_io
2 parents e5a2042 + a1af180 commit 1ab882a

File tree

12 files changed

+61
-50
lines changed

12 files changed

+61
-50
lines changed

src/engine/engine_io.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void ocf_engine_forward_cache_io(struct ocf_request *req, int dir,
2020
uint32_t first_cl = ocf_bytes_2_lines(cache, offset + seek);
2121
uint64_t addr;
2222

23-
req->cache_forward_end = callback;
23+
ocf_req_forward_cache_init(req, callback);
2424

2525
addr = cache->device->metadata_offset;
2626
addr += req->map[first_cl].coll_idx * ocf_line_size(cache);
@@ -40,7 +40,7 @@ void ocf_engine_forward_cache_io_req(struct ocf_request *req, int dir,
4040
uint64_t addr, bytes, total_bytes = 0, addr_next = 0;
4141
uint32_t i;
4242

43-
req->cache_forward_end = callback;
43+
ocf_req_forward_cache_init(req, callback);
4444

4545
if (ocf_engine_is_sequential(req)) {
4646
addr = cache->device->metadata_offset;
@@ -113,15 +113,15 @@ void ocf_engine_forward_cache_io_req(struct ocf_request *req, int dir,
113113
void ocf_engine_forward_cache_flush_req(struct ocf_request *req,
114114
ocf_req_end_t callback)
115115
{
116-
req->cache_forward_end = callback;
116+
ocf_req_forward_cache_init(req, callback);
117117

118118
ocf_req_forward_cache_flush(req);
119119
}
120120

121121
void ocf_engine_forward_cache_discard_req(struct ocf_request *req,
122122
ocf_req_end_t callback)
123123
{
124-
req->cache_forward_end = callback;
124+
ocf_req_forward_cache_init(req, callback);
125125

126126
ocf_req_forward_cache_discard(req, req->addr,
127127
req->bytes);
@@ -133,7 +133,7 @@ void ocf_engine_forward_core_io_req(struct ocf_request *req,
133133
ocf_core_stats_core_block_update(req->core, req->part_id, req->rw,
134134
req->bytes);
135135

136-
req->core_forward_end = callback;
136+
ocf_req_forward_core_init(req, callback);
137137

138138
ocf_req_forward_core_io(req, req->rw, req->addr,
139139
req->bytes, req->offset);
@@ -145,7 +145,7 @@ void ocf_engine_forward_core_flush_req(struct ocf_request *req,
145145
ocf_core_stats_core_block_update(req->core, req->part_id, req->rw,
146146
req->bytes);
147147

148-
req->core_forward_end = callback;
148+
ocf_req_forward_core_init(req, callback);
149149

150150
ocf_req_forward_core_flush(req);
151151
}
@@ -156,7 +156,7 @@ void ocf_engine_forward_core_discard_req(struct ocf_request *req,
156156
ocf_core_stats_core_block_update(req->core, req->part_id, req->rw,
157157
req->bytes);
158158

159-
req->core_forward_end = callback;
159+
ocf_req_forward_core_init(req, callback);
160160

161161
ocf_req_forward_core_discard(req, req->addr, req->bytes);
162162
}

src/engine/engine_wo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ static int ocf_read_wo_cache_do(struct ocf_request *req)
6262
uint64_t offset = 0;
6363
uint64_t increment = 0;
6464

65-
req->cache_forward_end = ocf_read_wo_cache_complete;
65+
ocf_req_forward_cache_init(req, ocf_read_wo_cache_complete);
6666

6767
ocf_req_forward_cache_get(req);
6868

src/metadata/metadata_io.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static int metadata_io_read_i_atomic_step(struct ocf_request *req)
111111
/* Reset position in data buffer */
112112
ctx_data_seek(cache->owner, req->data, ctx_data_seek_begin, 0);
113113

114-
req->cache_forward_end = metadata_io_read_i_atomic_step_end;
114+
ocf_req_forward_cache_init(req, metadata_io_read_i_atomic_step_end);
115115

116116
ocf_req_forward_cache_metadata(req, OCF_READ,
117117
cache->device->metadata_offset +
@@ -217,7 +217,7 @@ static int metadata_io_do(struct ocf_request *req)
217217

218218
ctx_data_seek(cache->owner, req->data, ctx_data_seek_begin, 0);
219219

220-
req->cache_forward_end = metadata_io_end;
220+
ocf_req_forward_cache_init(req, metadata_io_end);
221221

222222
ocf_req_forward_cache_io(req, req->rw, PAGES_TO_BYTES(m_req->page),
223223
PAGES_TO_BYTES(m_req->count), 0);

src/metadata/metadata_raw_atomic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ int raw_atomic_flush_do_asynch(struct ocf_cache *cache, struct ocf_request *req,
118118
}
119119

120120
req->priv = complete;
121-
req->cache_forward_end = _raw_atomic_io_discard_cmpl;
121+
ocf_req_forward_cache_init(req, _raw_atomic_io_discard_cmpl);
122122

123123
if (line_no == 1) {
124124
map = &req->map[0];

src/metadata/metadata_raw_dynamic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ static int raw_dynamic_load_all_read(struct ocf_request *req)
402402

403403
count = metadata_io_size(context->i_page, raw->ssd_pages);
404404

405-
req->cache_forward_end = raw_dynamic_load_all_read_end;
405+
ocf_req_forward_cache_init(req, raw_dynamic_load_all_read_end);
406406

407407
ocf_req_forward_cache_io(req, OCF_READ,
408408
PAGES_TO_BYTES(ssd_pages_offset + context->i_page),

src/metadata/metadata_superblock.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ int ocf_metadata_read_sb(ocf_ctx_t ctx, ocf_volume_t volume,
705705
goto err_data;
706706
}
707707

708-
req->volume_forward_end = ocf_metadata_read_sb_complete;
708+
ocf_req_forward_volume_init(req, ocf_metadata_read_sb_complete);
709709
req->priv = context;
710710

711711
ocf_req_forward_volume_io_simple(req, volume, OCF_READ, 0,

src/ocf_cache.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ static void ocf_cache_volume_submit_io(ocf_io_t io)
332332

333333
env_atomic_set(&req->req_remaining, 3);
334334

335-
req->cache_forward_end = ocf_cache_io_complete;
335+
ocf_req_forward_cache_init(req, ocf_cache_io_complete);
336336
ocf_req_forward_cache_io(req, req->rw, req->addr,
337337
req->bytes, req->offset);
338338

@@ -361,7 +361,7 @@ static void ocf_cache_volume_submit_flush(ocf_io_t io)
361361
return;
362362
}
363363

364-
req->cache_forward_end = ocf_cache_volume_io_complete_generic;
364+
ocf_req_forward_cache_init(req, ocf_cache_volume_io_complete_generic);
365365
ocf_req_forward_cache_flush(req);
366366
}
367367

@@ -380,7 +380,7 @@ static void ocf_cache_volume_submit_discard(ocf_io_t io)
380380
return;
381381
}
382382

383-
req->cache_forward_end = ocf_cache_volume_io_complete_generic;
383+
ocf_req_forward_cache_init(req, ocf_cache_volume_io_complete_generic);
384384
ocf_req_forward_cache_discard(req, req->addr,
385385
req->bytes);
386386
}

src/ocf_request.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,16 @@ void ocf_io_end_func(ocf_io_t io, int error)
440440
req->io.end(io, req->io.priv1, req->io.priv2, error);
441441
}
442442

443+
void ocf_req_forward_volume_init(struct ocf_request *req,
444+
ocf_req_end_t callback)
445+
{
446+
/* For forward_volume we reuse cache_* fields. This kind of forward
447+
operation should never happen together with forward_cache.
448+
*/
449+
req->cache_error = 0;
450+
req->cache_forward_end = callback;
451+
}
452+
443453
void ocf_req_forward_volume_io(struct ocf_request *req, ocf_volume_t volume,
444454
int dir, uint64_t addr, uint64_t bytes, uint64_t offset)
445455
{
@@ -471,20 +481,23 @@ void ocf_req_forward_volume_io_simple(struct ocf_request *req,
471481
{
472482
ocf_forward_token_t token = ocf_req_to_cache_forward_token(req);
473483

474-
req->cache_error = 0;
475-
476484
ocf_req_forward_cache_get(req);
477485
ocf_volume_forward_io_simple(volume, token, dir, addr, bytes);
478486
}
479487

488+
void ocf_req_forward_cache_init(struct ocf_request *req,
489+
ocf_req_end_t callback)
490+
{
491+
req->cache_error = 0;
492+
req->cache_forward_end = callback;
493+
}
494+
480495
void ocf_req_forward_cache_io(struct ocf_request *req, int dir, uint64_t addr,
481496
uint64_t bytes, uint64_t offset)
482497
{
483498
ocf_volume_t volume = ocf_cache_get_volume(req->cache);
484499
ocf_forward_token_t token = ocf_req_to_cache_forward_token(req);
485500

486-
req->cache_error = 0;
487-
488501
ocf_req_forward_cache_get(req);
489502
ocf_volume_forward_io(volume, token, dir, addr, bytes, offset);
490503
}
@@ -494,8 +507,6 @@ void ocf_req_forward_cache_flush(struct ocf_request *req)
494507
ocf_volume_t volume = ocf_cache_get_volume(req->cache);
495508
ocf_forward_token_t token = ocf_req_to_cache_forward_token(req);
496509

497-
req->cache_error = 0;
498-
499510
ocf_req_forward_cache_get(req);
500511
ocf_volume_forward_flush(volume, token);
501512
}
@@ -506,8 +517,6 @@ void ocf_req_forward_cache_discard(struct ocf_request *req, uint64_t addr,
506517
ocf_volume_t volume = ocf_cache_get_volume(req->cache);
507518
ocf_forward_token_t token = ocf_req_to_cache_forward_token(req);
508519

509-
req->cache_error = 0;
510-
511520
ocf_req_forward_cache_get(req);
512521
ocf_volume_forward_discard(volume, token, addr, bytes);
513522
}
@@ -518,8 +527,6 @@ void ocf_req_forward_cache_write_zeros(struct ocf_request *req, uint64_t addr,
518527
ocf_volume_t volume = ocf_cache_get_volume(req->cache);
519528
ocf_forward_token_t token = ocf_req_to_cache_forward_token(req);
520529

521-
req->cache_error = 0;
522-
523530
ocf_req_forward_cache_get(req);
524531
ocf_volume_forward_write_zeros(volume, token, addr, bytes);
525532
}
@@ -530,20 +537,23 @@ void ocf_req_forward_cache_metadata(struct ocf_request *req, int dir,
530537
ocf_volume_t volume = ocf_cache_get_volume(req->cache);
531538
ocf_forward_token_t token = ocf_req_to_cache_forward_token(req);
532539

533-
req->cache_error = 0;
534-
535540
ocf_req_forward_cache_get(req);
536541
ocf_volume_forward_metadata(volume, token, dir, addr, bytes, offset);
537542
}
538543

544+
void ocf_req_forward_core_init(struct ocf_request *req,
545+
ocf_req_end_t callback)
546+
{
547+
req->core_error = 0;
548+
req->core_forward_end = callback;
549+
}
550+
539551
void ocf_req_forward_core_io(struct ocf_request *req, int dir, uint64_t addr,
540552
uint64_t bytes, uint64_t offset)
541553
{
542554
ocf_volume_t volume = ocf_core_get_volume(req->core);
543555
ocf_forward_token_t token = ocf_req_to_core_forward_token(req);
544556

545-
req->core_error = 0;
546-
547557
ocf_req_forward_core_get(req);
548558
ocf_volume_forward_io(volume, token, dir, addr, bytes, offset);
549559
}
@@ -553,8 +563,6 @@ void ocf_req_forward_core_flush(struct ocf_request *req)
553563
ocf_volume_t volume = ocf_core_get_volume(req->core);
554564
ocf_forward_token_t token = ocf_req_to_core_forward_token(req);
555565

556-
req->core_error = 0;
557-
558566
ocf_req_forward_core_get(req);
559567
ocf_volume_forward_flush(volume, token);
560568
}
@@ -565,8 +573,6 @@ void ocf_req_forward_core_discard(struct ocf_request *req, uint64_t addr,
565573
ocf_volume_t volume = ocf_core_get_volume(req->core);
566574
ocf_forward_token_t token = ocf_req_to_core_forward_token(req);
567575

568-
req->core_error = 0;
569-
570576
ocf_req_forward_core_get(req);
571577
ocf_volume_forward_discard(volume, token, addr, bytes);
572578
}

src/ocf_request.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,7 @@ struct ocf_request {
172172
/* This struct is temporary. It will be consolidated with ocf_request */
173173
struct ocf_request_io io;
174174

175-
union {
176-
ocf_req_end_t cache_forward_end;
177-
ocf_req_end_t volume_forward_end;
178-
};
175+
ocf_req_end_t cache_forward_end;
179176
ocf_req_end_t core_forward_end;
180177
env_atomic cache_remaining;
181178
env_atomic core_remaining;
@@ -602,6 +599,9 @@ static inline struct ocf_request *ocf_req_forward_token_to_req(ocf_forward_token
602599
return (struct ocf_request *)(token & ~1);
603600
}
604601

602+
void ocf_req_forward_volume_init(struct ocf_request *req,
603+
ocf_req_end_t callback);
604+
605605
void ocf_req_forward_volume_io(struct ocf_request *req, ocf_volume_t volume,
606606
int dir, uint64_t addr, uint64_t bytes, uint64_t offset);
607607

@@ -613,6 +613,9 @@ void ocf_req_forward_volume_discard(struct ocf_request *req,
613613
void ocf_req_forward_volume_io_simple(struct ocf_request *req,
614614
ocf_volume_t volume, int dir, uint64_t addr, uint64_t bytes);
615615

616+
void ocf_req_forward_cache_init(struct ocf_request *req,
617+
ocf_req_end_t callback);
618+
616619
void ocf_req_forward_cache_io(struct ocf_request *req, int dir, uint64_t addr,
617620
uint64_t bytes, uint64_t offset);
618621

@@ -627,6 +630,9 @@ void ocf_req_forward_cache_write_zeros(struct ocf_request *req, uint64_t addr,
627630
void ocf_req_forward_cache_metadata(struct ocf_request *req, int dir,
628631
uint64_t addr, uint64_t bytes, uint64_t offset);
629632

633+
void ocf_req_forward_core_init(struct ocf_request *req,
634+
ocf_req_end_t callback);
635+
630636
void ocf_req_forward_core_io(struct ocf_request *req, int dir, uint64_t addr,
631637
uint64_t bytes, uint64_t offset);
632638

src/ocf_volume.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ ocf_io_t ocf_volume_new_io(ocf_volume_t volume, ocf_queue_t queue,
281281
return ocf_io_new(volume, queue, addr, bytes, dir, io_class, flags);
282282
}
283283

284-
static void ocf_volume_req_forward_complete(struct ocf_request *req, int error)
284+
static void ocf_volume_req_forward_end(struct ocf_request *req, int error)
285285
{
286286
ocf_io_end_func(req, error);
287287
}
@@ -299,7 +299,7 @@ void ocf_volume_submit_io(ocf_io_t io)
299299
if (likely(volume->type->properties->ops.submit_io)) {
300300
volume->type->properties->ops.submit_io(io);
301301
} else {
302-
req->volume_forward_end = ocf_volume_req_forward_complete;
302+
ocf_req_forward_volume_init(req, ocf_volume_req_forward_end);
303303
ocf_req_forward_volume_io(req, volume, req->rw, req->addr,
304304
req->bytes, req->offset);
305305
}
@@ -318,7 +318,7 @@ void ocf_volume_submit_flush(ocf_io_t io)
318318
if (likely(volume->type->properties->ops.submit_flush)) {
319319
volume->type->properties->ops.submit_flush(io);
320320
} else {
321-
req->volume_forward_end = ocf_volume_req_forward_complete;
321+
ocf_req_forward_volume_init(req, ocf_volume_req_forward_end);
322322
ocf_req_forward_volume_flush(req, volume);
323323
}
324324
}
@@ -336,7 +336,7 @@ void ocf_volume_submit_discard(ocf_io_t io)
336336
if (likely(volume->type->properties->ops.submit_discard)) {
337337
volume->type->properties->ops.submit_discard(io);
338338
} else {
339-
req->volume_forward_end = ocf_volume_req_forward_complete;
339+
ocf_req_forward_volume_init(req, ocf_volume_req_forward_end);
340340
ocf_req_forward_volume_discard(req, volume,
341341
req->addr, req->bytes);
342342
}

0 commit comments

Comments
 (0)