mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 07:01:32 +00:00
drbd: allow write-ordering policy to be bumped up again
Previously, once you disabled flushes as a means of enforcing write-ordering, you'd need to detach/re-attach to enable them again. Allow drbdsetup disk-options to re-enable previously disabled write-ordering policy options at runtime. While at it fix RCU in drbd_bump_write_ordering() max_allowed_wo() uses rcu_dereference, therefore it must be called within rcu_read_lock()/rcu_read_unlock() Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
44a4d55184
commit
70df70927b
@ -1294,6 +1294,13 @@ static unsigned int drbd_al_extents_max(struct drbd_backing_dev *bdev)
|
||||
return (al_size_4k - 1) * AL_CONTEXT_PER_TRANSACTION;
|
||||
}
|
||||
|
||||
static bool write_ordering_changed(struct disk_conf *a, struct disk_conf *b)
|
||||
{
|
||||
return a->disk_barrier != b->disk_barrier ||
|
||||
a->disk_flushes != b->disk_flushes ||
|
||||
a->disk_drain != b->disk_drain;
|
||||
}
|
||||
|
||||
int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct drbd_config_context adm_ctx;
|
||||
@ -1400,7 +1407,8 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
|
||||
else
|
||||
set_bit(MD_NO_FUA, &device->flags);
|
||||
|
||||
drbd_bump_write_ordering(device->resource, NULL, WO_bdev_flush);
|
||||
if (write_ordering_changed(old_disk_conf, new_disk_conf))
|
||||
drbd_bump_write_ordering(device->resource, NULL, WO_bdev_flush);
|
||||
|
||||
drbd_md_sync(device);
|
||||
|
||||
|
@ -1290,7 +1290,8 @@ void drbd_bump_write_ordering(struct drbd_resource *resource, struct drbd_backin
|
||||
};
|
||||
|
||||
pwo = resource->write_ordering;
|
||||
wo = min(pwo, wo);
|
||||
if (wo != WO_bdev_flush)
|
||||
wo = min(pwo, wo);
|
||||
rcu_read_lock();
|
||||
idr_for_each_entry(&resource->devices, device, vnr) {
|
||||
if (get_ldev(device)) {
|
||||
@ -1300,11 +1301,12 @@ void drbd_bump_write_ordering(struct drbd_resource *resource, struct drbd_backin
|
||||
put_ldev(device);
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (bdev)
|
||||
wo = max_allowed_wo(bdev, wo);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
resource->write_ordering = wo;
|
||||
if (pwo != resource->write_ordering || wo == WO_bdev_flush)
|
||||
drbd_info(resource, "Method to ensure write ordering: %s\n", write_ordering_str[resource->write_ordering]);
|
||||
|
Loading…
Reference in New Issue
Block a user