diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2011-03-31 12:06:48 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 16:45:01 +0100 |
commit | 85f103d88c8eb91755eb3c103e5ead2c9389e35e (patch) | |
tree | 01d92aa9abfc4b755fda3a3849c843bdd096fb65 /drivers/block/drbd/drbd_actlog.c | |
parent | 6038178ebe29e6b5e4d519a5ac56653d156c90f9 (diff) |
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.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 586776195a7..90ebbbb3dc2 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; } |