Skip to content

Commit

Permalink
lightnvm: pblk: fail gracefully on irrec. error
Browse files Browse the repository at this point in the history
Due to user writes being decoupled from media writes because of the need
of an intermediate write buffer, irrecoverable media write errors lead
to pblk stalling; user writes fill up the buffer and end up in an
infinite retry loop.

In order to let user writes fail gracefully, it is necessary for pblk to
keep track of its own internal state and prevent further writes from
being placed into the write buffer.

This patch implements a state machine to keep track of internal errors
and, in case of failure, fail further user writes in an standard way.
Depending on the type of error, pblk will do its best to persist
buffered writes (which are already acknowledged) and close down on a
graceful manner. This way, data might be recovered by re-instantiating
pblk. Such state machine paves out the way for a state-based FTL log.

Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <matias@cnexlabs.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Javier González authored and axboe committed Jun 26, 2017
1 parent ef57649 commit 588726d
Show file tree
Hide file tree
Showing 11 changed files with 332 additions and 114 deletions.
8 changes: 7 additions & 1 deletion drivers/lightnvm/pblk-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,13 @@ int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
*/
retry:
ret = pblk_rb_may_write_user(&pblk->rwb, bio, nr_entries, &bpos);
if (ret == NVM_IO_REQUEUE) {
switch (ret) {
case NVM_IO_REQUEUE:
io_schedule();
goto retry;
case NVM_IO_ERR:
pblk_pipeline_stop(pblk);
goto out;
}

if (unlikely(!bio_has_data(bio)))
Expand All @@ -58,6 +62,8 @@ int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
atomic_long_add(nr_entries, &pblk->req_writes);
#endif

pblk_rl_inserted(&pblk->rl, nr_entries);

out:
pblk_write_should_kick(pblk);
return ret;
Expand Down
Loading

0 comments on commit 588726d

Please sign in to comment.