drbd: Added transmission faults to the fault injection code
authorPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 26 Apr 2010 12:11:45 +0000 (14:11 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 17 May 2010 23:19:51 +0000 (01:19 +0200)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_receiver.c

index e0913248398023ca3c94150f692d455e79fc023a..2409de12f013174d0b7c70b8ef22fe04dadd53c8 100644 (file)
@@ -132,6 +132,7 @@ enum {
        DRBD_FAULT_DT_RA = 6,   /* data read ahead */
        DRBD_FAULT_BM_ALLOC = 7,        /* bitmap allocation */
        DRBD_FAULT_AL_EE = 8,   /* alloc ee */
+       DRBD_FAULT_RECEIVE = 9, /* Changes some bytes upon receiving a [rs]data block */
 
        DRBD_FAULT_MAX,
 };
index a478dad82daee23aa0625e0f49dc637f02221f1e..7468d2ce73479181231d11852be03bbfd9f44067 100644 (file)
@@ -3668,7 +3668,8 @@ _drbd_fault_str(unsigned int type) {
                [DRBD_FAULT_DT_RD] = "Data read",
                [DRBD_FAULT_DT_RA] = "Data read ahead",
                [DRBD_FAULT_BM_ALLOC] = "BM allocation",
-               [DRBD_FAULT_AL_EE] = "EE allocation"
+               [DRBD_FAULT_AL_EE] = "EE allocation",
+               [DRBD_FAULT_RECEIVE] = "receive data corruption",
        };
 
        return (type < DRBD_FAULT_MAX) ? _faults[type] : "**Unknown**";
index 11b1bafde28b2142e55d27153a573b341c0def03..b27f4dd36f89efd132315347ddbd74cfea1c1b5a 100644 (file)
@@ -1270,6 +1270,7 @@ read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector, int data_size) __
        int dgs, ds, i, rr;
        void *dig_in = mdev->int_dig_in;
        void *dig_vv = mdev->int_dig_vv;
+       unsigned long *data;
 
        dgs = (mdev->agreed_pro_version >= 87 && mdev->integrity_r_tfm) ?
                crypto_hash_digestsize(mdev->integrity_r_tfm) : 0;
@@ -1307,7 +1308,12 @@ read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector, int data_size) __
        ds = data_size;
        bio_for_each_segment(bvec, bio, i) {
                page = bvec->bv_page;
-               rr = drbd_recv(mdev, kmap(page), min_t(int, ds, PAGE_SIZE));
+               data = kmap(page);
+               rr = drbd_recv(mdev, data, min_t(int, ds, PAGE_SIZE));
+               if (FAULT_ACTIVE(mdev, DRBD_FAULT_RECEIVE)) {
+                       dev_err(DEV, "Fault injection: Corrupting data on receive\n");
+                       data[0] = data[0] ^ (unsigned long)-1;
+               }
                kunmap(page);
                if (rr != min_t(int, ds, PAGE_SIZE)) {
                        drbd_free_ee(mdev, e);