Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=01d03a660e73fb524957c09825a3eb7c2ae7c205
Commit:     01d03a660e73fb524957c09825a3eb7c2ae7c205
Parent:     2cd54d9bedb79a97f014e86c0da393416b264eb3
Author:     Jonathan E Brassow <[EMAIL PROTECTED]>
AuthorDate: Wed May 9 02:32:57 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Wed May 9 12:30:47 2007 -0700

    dm log: fault detection
    
    This patch gives the disk logging code the ability to store the fact that an
    error occured on the log device.  In addition, an event is raised when an
    error is encountered during I/O to the log device.
    
    Signed-off-by: Jonathan E Brassow <[EMAIL PROTECTED]>
    Signed-off-by: Alasdair G Kergon <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/md/dm-log.c |   30 +++++++++++++++++++++++++++---
 1 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c
index 6a92613..a503d12 100644
--- a/drivers/md/dm-log.c
+++ b/drivers/md/dm-log.c
@@ -152,6 +152,7 @@ struct log_c {
        /*
         * Disk log fields
         */
+       int log_dev_failed;
        struct dm_dev *log_dev;
        struct log_header header;
 
@@ -315,6 +316,7 @@ static int create_log_context(struct dirty_log *log, struct 
dm_target *ti,
                lc->disk_header = NULL;
        } else {
                lc->log_dev = dev;
+               lc->log_dev_failed = 0;
                lc->header_location.bdev = lc->log_dev->bdev;
                lc->header_location.sector = 0;
 
@@ -437,6 +439,15 @@ static int count_bits32(uint32_t *addr, unsigned size)
        return count;
 }
 
+static void fail_log_device(struct log_c *lc)
+{
+       if (lc->log_dev_failed)
+               return;
+
+       lc->log_dev_failed = 1;
+       dm_table_event(lc->ti->table);
+}
+
 static int disk_resume(struct dirty_log *log)
 {
        int r;
@@ -446,8 +457,12 @@ static int disk_resume(struct dirty_log *log)
 
        /* read the disk header */
        r = read_header(lc);
-       if (r)
+       if (r) {
+               DMWARN("%s: Failed to read header on mirror log device",
+                      lc->log_dev->name);
+               fail_log_device(lc);
                return r;
+       }
 
        /* set or clear any new bits -- device has grown */
        if (lc->sync == NOSYNC)
@@ -472,7 +487,14 @@ static int disk_resume(struct dirty_log *log)
        lc->header.nr_regions = lc->region_count;
 
        /* write the new header */
-       return write_header(lc);
+       r = write_header(lc);
+       if (r) {
+               DMWARN("%s: Failed to write header on mirror log device",
+                      lc->log_dev->name);
+               fail_log_device(lc);
+       }
+
+       return r;
 }
 
 static uint32_t core_get_region_size(struct dirty_log *log)
@@ -516,7 +538,9 @@ static int disk_flush(struct dirty_log *log)
                return 0;
 
        r = write_header(lc);
-       if (!r)
+       if (r)
+               fail_log_device(lc);
+       else
                lc->touched = 0;
 
        return r;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to