/* Schedule the read verify command for (eventual) running. */
scheduled = try_read_verify_schedule_io(rs, rvp, map->fmr_physical,
- map->fmr_length, vs);
+ map->fmr_length);
if (scheduled)
return 0;
}
scheduled = try_read_verify_schedule_io(rs, rvp, map->fmr_physical,
- map->fmr_length, vs);
+ map->fmr_length);
assert(scheduled);
return 0;
}
goto out_dbad;
}
- ret = read_verify_pool_alloc(ctx, ctx->datadev, remember_ioerr,
+ ret = read_verify_pool_alloc(ctx, ctx->datadev, remember_ioerr, &vs,
&vs.rvp_data);
if (ret) {
str_liberror(ctx, ret, _("creating datadev media verifier"));
}
if (ctx->logdev) {
ret = read_verify_pool_alloc(ctx, ctx->logdev, remember_ioerr,
- &vs.rvp_log);
+ &vs, &vs.rvp_log);
if (ret) {
str_liberror(ctx, ret,
_("creating logdev media verifier"));
}
if (ctx->rtdev) {
ret = read_verify_pool_alloc(ctx, ctx->rtdev, remember_ioerr,
- &vs.rvp_realtime);
+ &vs, &vs.rvp_realtime);
if (ret) {
str_liberror(ctx, ret,
_("creating rtdev media verifier"));
#define RVP_IO_BATCH_LOCALITY (65536)
struct read_verify {
- void *io_end_arg;
uint64_t io_start; /* bytes */
uint64_t io_length; /* bytes */
};
void *readbuf; /* read buffer */
struct ptcounter *verified_bytes;
struct disk *disk; /* which disk? */
+ void *ioerr_arg;
read_verify_ioerr_fn_t ioerr_fn; /* io error callback */
size_t miniosz; /* minimum io size, bytes */
struct scrub_ctx *ctx,
struct disk *disk,
read_verify_ioerr_fn_t ioerr_fn,
+ void *ioerr_arg,
struct read_verify_pool **prvp)
{
struct read_verify_pool *rvp;
rvp->ctx = ctx;
rvp->disk = disk;
rvp->ioerr_fn = ioerr_fn;
+ rvp->ioerr_arg = ioerr_arg;
ret = -workqueue_create(&rvp->wq, (struct xfs_mount *)rvp,
verifier_threads == 1 ? 0 : verifier_threads);
if (ret)
rvp->disk->d_fd, rv->io_start, sz,
read_error);
rvp->ioerr_fn(rvp->ctx, rvp->disk, rv->io_start, sz,
- read_error, rv->io_end_arg);
+ read_error, rvp->ioerr_arg);
} else if (sz == 0) {
/* No bytes at all? Did we hit the end of the disk? */
dbg_printf("EOF %d @ %"PRIu64" %zu err %d\n",
rvp->disk->d_fd, rv->io_start, sz,
read_error);
rvp->ioerr_fn(rvp->ctx, rvp->disk, rv->io_start, sz,
- read_error, rv->io_end_arg);
+ read_error, rvp->ioerr_arg);
break;
} else if (sz < len) {
/*
return errno;
}
- tmp->io_end_arg = rs->io_end_arg;
tmp->io_start = rs->io_start;
tmp->io_length = rs->io_length;
struct read_verify_schedule *rs,
struct read_verify_pool *rvp,
uint64_t start,
- uint64_t length,
- void *end_arg)
+ uint64_t length)
{
uint64_t req_end;
uint64_t rv_end;
rs->rvp = rvp;
rs->io_start = start;
rs->io_length = length;
- rs->io_end_arg = end_arg;
return true;
}
* reporting is the same, and the two extents are close,
* we can combine them.
*/
- if (rs->rvp == rvp && rs->io_length > 0 && end_arg == rs->io_end_arg &&
+ if (rs->rvp == rvp && rs->io_length > 0 &&
((start >= rs->io_start && start <= rv_end + RVP_IO_BATCH_LOCALITY) ||
(rs->io_start >= start &&
rs->io_start <= req_end + RVP_IO_BATCH_LOCALITY))) {
struct read_verify_schedule {
struct read_verify_pool *rvp;
- void *io_end_arg;
uint64_t io_start; /* bytes */
uint64_t io_length; /* bytes */
};
int error, void *arg);
int read_verify_pool_alloc(struct scrub_ctx *ctx, struct disk *disk,
- read_verify_ioerr_fn_t ioerr_fn,
+ read_verify_ioerr_fn_t ioerr_fn, void *ioerr_arg,
struct read_verify_pool **prvp);
void read_verify_pool_abort(struct read_verify_pool *rvp);
int read_verify_pool_flush(struct read_verify_pool *rvp);
int read_verify_schedule_now(struct read_verify_schedule *rs);
bool try_read_verify_schedule_io(struct read_verify_schedule *rs,
- struct read_verify_pool *rvp, uint64_t start, uint64_t length,
- void *end_arg);
+ struct read_verify_pool *rvp, uint64_t start, uint64_t length);
int read_verify_bytes(struct read_verify_pool *rvp, uint64_t *bytes);