mirror of https://gitee.com/openkylin/linux.git
dm raid1: report flush errors separately in status
Report flush errors as 'F' instead of 'D' for log and mirror devices. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:
parent
c0da3748b9
commit
64b30c46e8
|
@ -237,6 +237,7 @@ struct log_c {
|
||||||
* Disk log fields
|
* Disk log fields
|
||||||
*/
|
*/
|
||||||
int log_dev_failed;
|
int log_dev_failed;
|
||||||
|
int log_dev_flush_failed;
|
||||||
struct dm_dev *log_dev;
|
struct dm_dev *log_dev;
|
||||||
struct log_header header;
|
struct log_header header;
|
||||||
|
|
||||||
|
@ -425,6 +426,7 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
|
||||||
} else {
|
} else {
|
||||||
lc->log_dev = dev;
|
lc->log_dev = dev;
|
||||||
lc->log_dev_failed = 0;
|
lc->log_dev_failed = 0;
|
||||||
|
lc->log_dev_flush_failed = 0;
|
||||||
lc->header_location.bdev = lc->log_dev->bdev;
|
lc->header_location.bdev = lc->log_dev->bdev;
|
||||||
lc->header_location.sector = 0;
|
lc->header_location.sector = 0;
|
||||||
|
|
||||||
|
@ -633,8 +635,11 @@ static int disk_resume(struct dm_dirty_log *log)
|
||||||
|
|
||||||
/* write the new header */
|
/* write the new header */
|
||||||
r = rw_header(lc, WRITE);
|
r = rw_header(lc, WRITE);
|
||||||
if (!r)
|
if (!r) {
|
||||||
r = flush_header(lc);
|
r = flush_header(lc);
|
||||||
|
if (r)
|
||||||
|
lc->log_dev_flush_failed = 1;
|
||||||
|
}
|
||||||
if (r) {
|
if (r) {
|
||||||
DMWARN("%s: Failed to write header on dirty region log device",
|
DMWARN("%s: Failed to write header on dirty region log device",
|
||||||
lc->log_dev->name);
|
lc->log_dev->name);
|
||||||
|
@ -703,9 +708,10 @@ static int disk_flush(struct dm_dirty_log *log)
|
||||||
else {
|
else {
|
||||||
if (lc->touched_dirtied) {
|
if (lc->touched_dirtied) {
|
||||||
r = flush_header(lc);
|
r = flush_header(lc);
|
||||||
if (r)
|
if (r) {
|
||||||
|
lc->log_dev_flush_failed = 1;
|
||||||
fail_log_device(lc);
|
fail_log_device(lc);
|
||||||
else
|
} else
|
||||||
lc->touched_dirtied = 0;
|
lc->touched_dirtied = 0;
|
||||||
}
|
}
|
||||||
lc->touched_cleaned = 0;
|
lc->touched_cleaned = 0;
|
||||||
|
@ -805,7 +811,9 @@ static int disk_status(struct dm_dirty_log *log, status_type_t status,
|
||||||
switch(status) {
|
switch(status) {
|
||||||
case STATUSTYPE_INFO:
|
case STATUSTYPE_INFO:
|
||||||
DMEMIT("3 %s %s %c", log->type->name, lc->log_dev->name,
|
DMEMIT("3 %s %s %c", log->type->name, lc->log_dev->name,
|
||||||
lc->log_dev_failed ? 'D' : 'A');
|
lc->log_dev_flush_failed ? 'F' :
|
||||||
|
lc->log_dev_failed ? 'D' :
|
||||||
|
'A');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATUSTYPE_TABLE:
|
case STATUSTYPE_TABLE:
|
||||||
|
|
|
@ -35,6 +35,7 @@ static DECLARE_WAIT_QUEUE_HEAD(_kmirrord_recovery_stopped);
|
||||||
*---------------------------------------------------------------*/
|
*---------------------------------------------------------------*/
|
||||||
enum dm_raid1_error {
|
enum dm_raid1_error {
|
||||||
DM_RAID1_WRITE_ERROR,
|
DM_RAID1_WRITE_ERROR,
|
||||||
|
DM_RAID1_FLUSH_ERROR,
|
||||||
DM_RAID1_SYNC_ERROR,
|
DM_RAID1_SYNC_ERROR,
|
||||||
DM_RAID1_READ_ERROR
|
DM_RAID1_READ_ERROR
|
||||||
};
|
};
|
||||||
|
@ -264,7 +265,7 @@ static int mirror_flush(struct dm_target *ti)
|
||||||
for (i = 0; i < ms->nr_mirrors; i++)
|
for (i = 0; i < ms->nr_mirrors; i++)
|
||||||
if (test_bit(i, &error_bits))
|
if (test_bit(i, &error_bits))
|
||||||
fail_mirror(ms->mirror + i,
|
fail_mirror(ms->mirror + i,
|
||||||
DM_RAID1_WRITE_ERROR);
|
DM_RAID1_FLUSH_ERROR);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1288,7 +1289,8 @@ static char device_status_char(struct mirror *m)
|
||||||
if (!atomic_read(&(m->error_count)))
|
if (!atomic_read(&(m->error_count)))
|
||||||
return 'A';
|
return 'A';
|
||||||
|
|
||||||
return (test_bit(DM_RAID1_WRITE_ERROR, &(m->error_type))) ? 'D' :
|
return (test_bit(DM_RAID1_FLUSH_ERROR, &(m->error_type))) ? 'F' :
|
||||||
|
(test_bit(DM_RAID1_WRITE_ERROR, &(m->error_type))) ? 'D' :
|
||||||
(test_bit(DM_RAID1_SYNC_ERROR, &(m->error_type))) ? 'S' :
|
(test_bit(DM_RAID1_SYNC_ERROR, &(m->error_type))) ? 'S' :
|
||||||
(test_bit(DM_RAID1_READ_ERROR, &(m->error_type))) ? 'R' : 'U';
|
(test_bit(DM_RAID1_READ_ERROR, &(m->error_type))) ? 'R' : 'U';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue