mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
bcache: let caller see an error
This commit is contained in:
parent
ae21305ee7
commit
6d05859862
@ -234,7 +234,6 @@ static bool _async_wait(struct io_engine *ioe, io_complete_fn fn)
|
|||||||
fn((void *) cb->context, 0);
|
fn((void *) cb->context, 0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
log_warn("short io");
|
|
||||||
fn(cb->context, -ENODATA);
|
fn(cb->context, -ENODATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,10 +537,8 @@ static void _complete_io(void *context, int err)
|
|||||||
*/
|
*/
|
||||||
dm_list_del(&b->list);
|
dm_list_del(&b->list);
|
||||||
|
|
||||||
if (b->error) {
|
if (b->error)
|
||||||
log_warn("bcache io error %d fd %d", b->error, b->fd);
|
|
||||||
memset(b->data, 0, cache->block_sectors << SECTOR_SHIFT);
|
memset(b->data, 0, cache->block_sectors << SECTOR_SHIFT);
|
||||||
}
|
|
||||||
|
|
||||||
/* Things don't work with this block of code, but work without it. */
|
/* Things don't work with this block of code, but work without it. */
|
||||||
#if 0
|
#if 0
|
||||||
@ -583,6 +580,7 @@ static void _issue_low_level(struct block *b, enum dir d)
|
|||||||
dm_list_add(&cache->io_pending, &b->list);
|
dm_list_add(&cache->io_pending, &b->list);
|
||||||
|
|
||||||
if (!cache->engine->issue(cache->engine, d, b->fd, sb, se, b->data, b)) {
|
if (!cache->engine->issue(cache->engine, d, b->fd, sb, se, b->data, b)) {
|
||||||
|
/* FIXME: if io_submit() set an errno, return that instead of EIO? */
|
||||||
_complete_io(b, -EIO);
|
_complete_io(b, -EIO);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -904,7 +902,7 @@ void bcache_prefetch(struct bcache *cache, int fd, block_address index)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool bcache_get(struct bcache *cache, int fd, block_address index,
|
bool bcache_get(struct bcache *cache, int fd, block_address index,
|
||||||
unsigned flags, struct block **result)
|
unsigned flags, struct block **result, int *error)
|
||||||
{
|
{
|
||||||
struct block *b;
|
struct block *b;
|
||||||
|
|
||||||
@ -916,12 +914,19 @@ bool bcache_get(struct bcache *cache, int fd, block_address index,
|
|||||||
|
|
||||||
*result = b;
|
*result = b;
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
*error = b->error;
|
||||||
|
|
||||||
if (b->error)
|
if (b->error)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
*error = -BCACHE_NO_BLOCK;
|
||||||
|
|
||||||
log_error("bcache failed to get block %u fd %d", (uint32_t)index, fd);
|
log_error("bcache failed to get block %u fd %d", (uint32_t)index, fd);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1068,7 +1073,9 @@ bool bcache_read_bytes(struct bcache *cache, int fd, off_t start, size_t len, vo
|
|||||||
bcache_prefetch(cache, fd, i);
|
bcache_prefetch(cache, fd, i);
|
||||||
|
|
||||||
for (i = bb; i < be; i++) {
|
for (i = bb; i < be; i++) {
|
||||||
if (!bcache_get(cache, fd, i, 0, &b)) {
|
if (!bcache_get(cache, fd, i, 0, &b, NULL)) {
|
||||||
|
log_error("bcache_read failed to get block %u fd %d bb %u be %u",
|
||||||
|
(uint32_t)i, fd, (uint32_t)bb, (uint32_t)be);
|
||||||
errors++;
|
errors++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1105,7 +1112,7 @@ bool bcache_write_bytes(struct bcache *cache, int fd, off_t start, size_t len, v
|
|||||||
bcache_prefetch(cache, fd, i);
|
bcache_prefetch(cache, fd, i);
|
||||||
|
|
||||||
for (i = bb; i < be; i++) {
|
for (i = bb; i < be; i++) {
|
||||||
if (!bcache_get(cache, fd, i, 0, &b)) {
|
if (!bcache_get(cache, fd, i, 0, &b, NULL)) {
|
||||||
log_error("bcache_write failed to get block %u fd %d bb %u be %u",
|
log_error("bcache_write failed to get block %u fd %d bb %u be %u",
|
||||||
(uint32_t)i, fd, (uint32_t)bb, (uint32_t)be);
|
(uint32_t)i, fd, (uint32_t)bb, (uint32_t)be);
|
||||||
errors++;
|
errors++;
|
||||||
|
@ -29,6 +29,13 @@
|
|||||||
|
|
||||||
/*----------------------------------------------------------------*/
|
/*----------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bcache-specific error numbers
|
||||||
|
* These supplement standard -EXXX error numbers and
|
||||||
|
* should not overlap.
|
||||||
|
*/
|
||||||
|
#define BCACHE_NO_BLOCK 201
|
||||||
|
|
||||||
enum dir {
|
enum dir {
|
||||||
DIR_READ,
|
DIR_READ,
|
||||||
DIR_WRITE
|
DIR_WRITE
|
||||||
@ -120,7 +127,7 @@ void bcache_prefetch(struct bcache *cache, int fd, block_address index);
|
|||||||
* Returns true on success.
|
* Returns true on success.
|
||||||
*/
|
*/
|
||||||
bool bcache_get(struct bcache *cache, int fd, block_address index,
|
bool bcache_get(struct bcache *cache, int fd, block_address index,
|
||||||
unsigned flags, struct block **result);
|
unsigned flags, struct block **result, int *error);
|
||||||
void bcache_put(struct block *b);
|
void bcache_put(struct block *b);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user