summaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_actlog.c
diff options
context:
space:
mode:
authorLars Ellenberg2011-03-31 12:06:48 +0200
committerPhilipp Reisner2012-11-08 16:45:01 +0100
commit85f103d88c8eb91755eb3c103e5ead2c9389e35e (patch)
tree01d92aa9abfc4b755fda3a3849c843bdd096fb65 /drivers/block/drbd/drbd_actlog.c
parentdrbd: Change how the "handshake" packets are called (diff)
downloadkernel-qcow2-linux-85f103d88c8eb91755eb3c103e5ead2c9389e35e.tar.gz
kernel-qcow2-linux-85f103d88c8eb91755eb3c103e5ead2c9389e35e.tar.xz
kernel-qcow2-linux-85f103d88c8eb91755eb3c103e5ead2c9389e35e.zip
drbd: introduce the "initialized" activity log transaction type
So we can initialize a clean on disk activity log area, without the module complaining with loud assert messages because of checksum or magic value mismatches. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_actlog.c')
-rw-r--r--drivers/block/drbd/drbd_actlog.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c
index 586776195a79..90ebbbb3dc27 100644
--- a/drivers/block/drbd/drbd_actlog.c
+++ b/drivers/block/drbd/drbd_actlog.c
@@ -31,6 +31,11 @@
#include "drbd_int.h"
#include "drbd_wrappers.h"
+
+enum al_transaction_types {
+ AL_TR_UPDATE = 0,
+ AL_TR_INITIALIZED = 0xffff
+};
/* all fields on disc in big endian */
struct __packed al_transaction_on_disk {
/* don't we all like magic */
@@ -44,7 +49,8 @@ struct __packed al_transaction_on_disk {
__be32 crc32c;
/* type of transaction, special transaction types like:
- * purge-all, set-all-idle, set-all-active, ... to-be-defined */
+ * purge-all, set-all-idle, set-all-active, ... to-be-defined
+ * see also enum al_transaction_types */
__be16 transaction_type;
/* we currently allow only a few thousand extents,
@@ -476,6 +482,7 @@ int drbd_al_read_log(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
int active_extents = 0;
int transactions = 0;
int found_valid = 0;
+ int found_initialized = 0;
int from = 0;
int to = 0;
u32 from_tnr = 0;
@@ -504,6 +511,10 @@ int drbd_al_read_log(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
/* invalid data in that block */
if (rv == 0)
continue;
+ if (be16_to_cpu(b->transaction_type) == AL_TR_INITIALIZED) {
+ ++found_initialized;
+ continue;
+ }
/* IO error */
if (rv == -1) {
@@ -535,7 +546,8 @@ int drbd_al_read_log(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
}
if (!found_valid) {
- dev_warn(DEV, "No usable activity log found.\n");
+ if (found_initialized != mx)
+ dev_warn(DEV, "No usable activity log found.\n");
mutex_unlock(&mdev->md_io_mutex);
return 1;
}