Commit e9526580 authored by Philipp Reisner's avatar Philipp Reisner

drbd: Move write_ordering from connection to resource

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 6a27b656
...@@ -594,6 +594,8 @@ struct drbd_resource { ...@@ -594,6 +594,8 @@ struct drbd_resource {
unsigned susp_nod:1; /* IO suspended because no data */ unsigned susp_nod:1; /* IO suspended because no data */
unsigned susp_fen:1; /* IO suspended because fence peer handler runs */ unsigned susp_fen:1; /* IO suspended because fence peer handler runs */
enum write_ordering_e write_ordering;
cpumask_var_t cpu_mask; cpumask_var_t cpu_mask;
}; };
...@@ -636,7 +638,6 @@ struct drbd_connection { ...@@ -636,7 +638,6 @@ struct drbd_connection {
struct drbd_epoch *current_epoch; struct drbd_epoch *current_epoch;
spinlock_t epoch_lock; spinlock_t epoch_lock;
unsigned int epochs; unsigned int epochs;
enum write_ordering_e write_ordering;
atomic_t current_tle_nr; /* transfer log epoch number */ atomic_t current_tle_nr; /* transfer log epoch number */
unsigned current_tle_writes; /* writes seen within this tl epoch */ unsigned current_tle_writes; /* writes seen within this tl epoch */
...@@ -1478,7 +1479,7 @@ static inline void drbd_generic_make_request(struct drbd_device *device, ...@@ -1478,7 +1479,7 @@ static inline void drbd_generic_make_request(struct drbd_device *device,
generic_make_request(bio); generic_make_request(bio);
} }
void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ordering_e wo); void drbd_bump_write_ordering(struct drbd_resource *resource, enum write_ordering_e wo);
/* drbd_proc.c */ /* drbd_proc.c */
extern struct proc_dir_entry *drbd_proc; extern struct proc_dir_entry *drbd_proc;
......
...@@ -2579,6 +2579,7 @@ struct drbd_resource *drbd_create_resource(const char *name) ...@@ -2579,6 +2579,7 @@ struct drbd_resource *drbd_create_resource(const char *name)
kref_init(&resource->kref); kref_init(&resource->kref);
idr_init(&resource->devices); idr_init(&resource->devices);
INIT_LIST_HEAD(&resource->connections); INIT_LIST_HEAD(&resource->connections);
resource->write_ordering = WO_bdev_flush;
list_add_tail_rcu(&resource->resources, &drbd_resources); list_add_tail_rcu(&resource->resources, &drbd_resources);
mutex_init(&resource->conf_update); mutex_init(&resource->conf_update);
mutex_init(&resource->adm_mutex); mutex_init(&resource->adm_mutex);
...@@ -2617,7 +2618,6 @@ struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts) ...@@ -2617,7 +2618,6 @@ struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts)
INIT_LIST_HEAD(&connection->current_epoch->list); INIT_LIST_HEAD(&connection->current_epoch->list);
connection->epochs = 1; connection->epochs = 1;
spin_lock_init(&connection->epoch_lock); spin_lock_init(&connection->epoch_lock);
connection->write_ordering = WO_bdev_flush;
connection->send.seen_any_write_yet = false; connection->send.seen_any_write_yet = false;
connection->send.current_epoch_nr = 0; connection->send.current_epoch_nr = 0;
......
...@@ -1399,7 +1399,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) ...@@ -1399,7 +1399,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
else else
set_bit(MD_NO_FUA, &device->flags); set_bit(MD_NO_FUA, &device->flags);
drbd_bump_write_ordering(first_peer_device(device)->connection, WO_bdev_flush); drbd_bump_write_ordering(device->resource, WO_bdev_flush);
drbd_md_sync(device); drbd_md_sync(device);
...@@ -1704,7 +1704,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) ...@@ -1704,7 +1704,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
new_disk_conf = NULL; new_disk_conf = NULL;
new_plan = NULL; new_plan = NULL;
drbd_bump_write_ordering(first_peer_device(device)->connection, WO_bdev_flush); drbd_bump_write_ordering(device->resource, WO_bdev_flush);
if (drbd_md_test_flag(device->ldev, MDF_CRASHED_PRIMARY)) if (drbd_md_test_flag(device->ldev, MDF_CRASHED_PRIMARY))
set_bit(CRASHED_PRIMARY, &device->flags); set_bit(CRASHED_PRIMARY, &device->flags);
......
...@@ -281,7 +281,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v) ...@@ -281,7 +281,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
atomic_read(&device->unacked_cnt), atomic_read(&device->unacked_cnt),
atomic_read(&device->ap_bio_cnt), atomic_read(&device->ap_bio_cnt),
first_peer_device(device)->connection->epochs, first_peer_device(device)->connection->epochs,
write_ordering_chars[first_peer_device(device)->connection->write_ordering] write_ordering_chars[device->resource->write_ordering]
); );
seq_printf(seq, " oos:%llu\n", seq_printf(seq, " oos:%llu\n",
Bit2KB((unsigned long long) Bit2KB((unsigned long long)
......
...@@ -1151,7 +1151,7 @@ static void drbd_flush(struct drbd_connection *connection) ...@@ -1151,7 +1151,7 @@ static void drbd_flush(struct drbd_connection *connection)
struct drbd_peer_device *peer_device; struct drbd_peer_device *peer_device;
int vnr; int vnr;
if (connection->write_ordering >= WO_bdev_flush) { if (connection->resource->write_ordering >= WO_bdev_flush) {
rcu_read_lock(); rcu_read_lock();
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
struct drbd_device *device = peer_device->device; struct drbd_device *device = peer_device->device;
...@@ -1168,7 +1168,7 @@ static void drbd_flush(struct drbd_connection *connection) ...@@ -1168,7 +1168,7 @@ static void drbd_flush(struct drbd_connection *connection)
/* would rather check on EOPNOTSUPP, but that is not reliable. /* would rather check on EOPNOTSUPP, but that is not reliable.
* don't try again for ANY return value != 0 * don't try again for ANY return value != 0
* if (rv == -EOPNOTSUPP) */ * if (rv == -EOPNOTSUPP) */
drbd_bump_write_ordering(connection, WO_drain_io); drbd_bump_write_ordering(connection->resource, WO_drain_io);
} }
put_ldev(device); put_ldev(device);
kref_put(&device->kref, drbd_destroy_device); kref_put(&device->kref, drbd_destroy_device);
...@@ -1262,10 +1262,10 @@ static enum finish_epoch drbd_may_finish_epoch(struct drbd_connection *connectio ...@@ -1262,10 +1262,10 @@ static enum finish_epoch drbd_may_finish_epoch(struct drbd_connection *connectio
* @connection: DRBD connection. * @connection: DRBD connection.
* @wo: Write ordering method to try. * @wo: Write ordering method to try.
*/ */
void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ordering_e wo) void drbd_bump_write_ordering(struct drbd_resource *resource, enum write_ordering_e wo)
{ {
struct disk_conf *dc; struct disk_conf *dc;
struct drbd_peer_device *peer_device; struct drbd_device *device;
enum write_ordering_e pwo; enum write_ordering_e pwo;
int vnr; int vnr;
static char *write_ordering_str[] = { static char *write_ordering_str[] = {
...@@ -1274,12 +1274,10 @@ void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ord ...@@ -1274,12 +1274,10 @@ void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ord
[WO_bdev_flush] = "flush", [WO_bdev_flush] = "flush",
}; };
pwo = connection->write_ordering; pwo = resource->write_ordering;
wo = min(pwo, wo); wo = min(pwo, wo);
rcu_read_lock(); rcu_read_lock();
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) { idr_for_each_entry(&resource->devices, device, vnr) {
struct drbd_device *device = peer_device->device;
if (!get_ldev_if_state(device, D_ATTACHING)) if (!get_ldev_if_state(device, D_ATTACHING))
continue; continue;
dc = rcu_dereference(device->ldev->disk_conf); dc = rcu_dereference(device->ldev->disk_conf);
...@@ -1291,9 +1289,9 @@ void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ord ...@@ -1291,9 +1289,9 @@ void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ord
put_ldev(device); put_ldev(device);
} }
rcu_read_unlock(); rcu_read_unlock();
connection->write_ordering = wo; resource->write_ordering = wo;
if (pwo != connection->write_ordering || wo == WO_bdev_flush) if (pwo != resource->write_ordering || wo == WO_bdev_flush)
drbd_info(connection, "Method to ensure write ordering: %s\n", write_ordering_str[connection->write_ordering]); drbd_info(resource, "Method to ensure write ordering: %s\n", write_ordering_str[resource->write_ordering]);
} }
/** /**
...@@ -1471,7 +1469,7 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf ...@@ -1471,7 +1469,7 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf
* R_PRIMARY crashes now. * R_PRIMARY crashes now.
* Therefore we must send the barrier_ack after the barrier request was * Therefore we must send the barrier_ack after the barrier request was
* completed. */ * completed. */
switch (connection->write_ordering) { switch (connection->resource->write_ordering) {
case WO_none: case WO_none:
if (rv == FE_RECYCLED) if (rv == FE_RECYCLED)
return 0; return 0;
...@@ -1498,7 +1496,8 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf ...@@ -1498,7 +1496,8 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf
return 0; return 0;
default: default:
drbd_err(connection, "Strangeness in connection->write_ordering %d\n", connection->write_ordering); drbd_err(connection, "Strangeness in connection->write_ordering %d\n",
connection->resource->write_ordering);
return -EIO; return -EIO;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment