Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9526580 authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Move write_ordering from connection to resource

parent 6a27b656
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -594,6 +594,8 @@ struct drbd_resource {
	unsigned susp_nod:1;		/* IO suspended because no data */
	unsigned susp_fen:1;		/* IO suspended because fence peer handler runs */

	enum write_ordering_e write_ordering;

	cpumask_var_t cpu_mask;
};

@@ -636,7 +638,6 @@ struct drbd_connection {
	struct drbd_epoch *current_epoch;
	spinlock_t epoch_lock;
	unsigned int epochs;
	enum write_ordering_e write_ordering;
	atomic_t current_tle_nr;	/* transfer log epoch number */
	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,
		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 */
extern struct proc_dir_entry *drbd_proc;
+1 −1
Original line number Diff line number Diff line
@@ -2579,6 +2579,7 @@ struct drbd_resource *drbd_create_resource(const char *name)
	kref_init(&resource->kref);
	idr_init(&resource->devices);
	INIT_LIST_HEAD(&resource->connections);
	resource->write_ordering = WO_bdev_flush;
	list_add_tail_rcu(&resource->resources, &drbd_resources);
	mutex_init(&resource->conf_update);
	mutex_init(&resource->adm_mutex);
@@ -2617,7 +2618,6 @@ struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts)
	INIT_LIST_HEAD(&connection->current_epoch->list);
	connection->epochs = 1;
	spin_lock_init(&connection->epoch_lock);
	connection->write_ordering = WO_bdev_flush;

	connection->send.seen_any_write_yet = false;
	connection->send.current_epoch_nr = 0;
+2 −2
Original line number Diff line number Diff line
@@ -1399,7 +1399,7 @@ 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(first_peer_device(device)->connection, WO_bdev_flush);
	drbd_bump_write_ordering(device->resource, WO_bdev_flush);

	drbd_md_sync(device);

@@ -1704,7 +1704,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
	new_disk_conf = 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))
		set_bit(CRASHED_PRIMARY, &device->flags);
+1 −1
Original line number Diff line number Diff line
@@ -281,7 +281,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
			   atomic_read(&device->unacked_cnt),
			   atomic_read(&device->ap_bio_cnt),
			   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",
				   Bit2KB((unsigned long long)
+12 −13
Original line number Diff line number Diff line
@@ -1151,7 +1151,7 @@ static void drbd_flush(struct drbd_connection *connection)
	struct drbd_peer_device *peer_device;
	int vnr;

	if (connection->write_ordering >= WO_bdev_flush) {
	if (connection->resource->write_ordering >= WO_bdev_flush) {
		rcu_read_lock();
		idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
			struct drbd_device *device = peer_device->device;
@@ -1168,7 +1168,7 @@ static void drbd_flush(struct drbd_connection *connection)
				/* would rather check on EOPNOTSUPP, but that is not reliable.
				 * don't try again for ANY return value != 0
				 * if (rv == -EOPNOTSUPP) */
				drbd_bump_write_ordering(connection, WO_drain_io);
				drbd_bump_write_ordering(connection->resource, WO_drain_io);
			}
			put_ldev(device);
			kref_put(&device->kref, drbd_destroy_device);
@@ -1262,10 +1262,10 @@ static enum finish_epoch drbd_may_finish_epoch(struct drbd_connection *connectio
 * @connection:	DRBD connection.
 * @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 drbd_peer_device *peer_device;
	struct drbd_device *device;
	enum write_ordering_e pwo;
	int vnr;
	static char *write_ordering_str[] = {
@@ -1274,12 +1274,10 @@ void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ord
		[WO_bdev_flush] = "flush",
	};

	pwo = connection->write_ordering;
	pwo = resource->write_ordering;
	wo = min(pwo, wo);
	rcu_read_lock();
	idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
		struct drbd_device *device = peer_device->device;

	idr_for_each_entry(&resource->devices, device, vnr) {
		if (!get_ldev_if_state(device, D_ATTACHING))
			continue;
		dc = rcu_dereference(device->ldev->disk_conf);
@@ -1291,9 +1289,9 @@ void drbd_bump_write_ordering(struct drbd_connection *connection, enum write_ord
		put_ldev(device);
	}
	rcu_read_unlock();
	connection->write_ordering = wo;
	if (pwo != connection->write_ordering || wo == WO_bdev_flush)
		drbd_info(connection, "Method to ensure write ordering: %s\n", write_ordering_str[connection->write_ordering]);
	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]);
}

/**
@@ -1471,7 +1469,7 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf
	 * R_PRIMARY crashes now.
	 * Therefore we must send the barrier_ack after the barrier request was
	 * completed. */
	switch (connection->write_ordering) {
	switch (connection->resource->write_ordering) {
	case WO_none:
		if (rv == FE_RECYCLED)
			return 0;
@@ -1498,7 +1496,8 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf

		return 0;
	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;
	}