dm thin metadata: do not write metadata if no changes occurred
authorMike Snitzer <snitzer@redhat.com>
Thu, 18 Apr 2019 14:29:48 +0000 (10:29 -0400)
committerMike Snitzer <snitzer@redhat.com>
Thu, 18 Apr 2019 20:18:34 +0000 (16:18 -0400)
commit873f258becca87f4dd973fe0ba09b88b737c9b14
tree31585eb3e1f823bc82d715e2bb345d5c6d62e97b
parent6a1b1ddc6a2cfb32da8f5e75f1aa053280682a05
dm thin metadata: do not write metadata if no changes occurred

Otherwise, just activating a thin-pool and thin device and then
deactivating them will cause the thin-pool metadata to be changed
(e.g. superblock written) -- even without any metadata being changed.

Add 'in_service' flag to struct dm_pool_metadata and set it in
pmd_write_lock() because all on-disk metadata changes must take a write
lock of pmd->root_lock.  Once 'in_service' is set it is never cleared.
__commit_transaction() will return 0 if 'in_service' is not set.
dm_pool_commit_metadata() is updated to use __pmd_write_lock() so that
it isn't the sole reason for putting a thin-pool in service.

Also fix dm_pool_commit_metadata() to open the next transaction if the
return from __commit_transaction() is 0.  Not seeing why the early
return ever made since for a return of 0 given that dm-io's async_io(),
as used by bufio, always returns 0.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-thin-metadata.c