|
@@ -92,14 +92,6 @@ struct __packed al_transaction_on_disk {
|
|
|
__be32 context[AL_CONTEXT_PER_TRANSACTION];
|
|
|
};
|
|
|
|
|
|
-struct update_al_work {
|
|
|
- struct drbd_work w;
|
|
|
- struct drbd_device *device;
|
|
|
- struct completion event;
|
|
|
- int err;
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
void *drbd_md_get_buffer(struct drbd_device *device)
|
|
|
{
|
|
|
int r;
|
|
@@ -291,26 +283,12 @@ bool drbd_al_begin_io_prepare(struct drbd_device *device, struct drbd_interval *
|
|
|
return need_transaction;
|
|
|
}
|
|
|
|
|
|
-static int al_write_transaction(struct drbd_device *device, bool delegate);
|
|
|
+static int al_write_transaction(struct drbd_device *device);
|
|
|
|
|
|
-/* When called through generic_make_request(), we must delegate
|
|
|
- * activity log I/O to the worker thread: a further request
|
|
|
- * submitted via generic_make_request() within the same task
|
|
|
- * would be queued on current->bio_list, and would only start
|
|
|
- * after this function returns (see generic_make_request()).
|
|
|
- *
|
|
|
- * However, if we *are* the worker, we must not delegate to ourselves.
|
|
|
- */
|
|
|
-
|
|
|
-/*
|
|
|
- * @delegate: delegate activity log I/O to the worker thread
|
|
|
- */
|
|
|
-void drbd_al_begin_io_commit(struct drbd_device *device, bool delegate)
|
|
|
+void drbd_al_begin_io_commit(struct drbd_device *device)
|
|
|
{
|
|
|
bool locked = false;
|
|
|
|
|
|
- BUG_ON(delegate && current == first_peer_device(device)->connection->worker.task);
|
|
|
-
|
|
|
/* Serialize multiple transactions.
|
|
|
* This uses test_and_set_bit, memory barrier is implicit.
|
|
|
*/
|
|
@@ -329,7 +307,7 @@ void drbd_al_begin_io_commit(struct drbd_device *device, bool delegate)
|
|
|
rcu_read_unlock();
|
|
|
|
|
|
if (write_al_updates)
|
|
|
- al_write_transaction(device, delegate);
|
|
|
+ al_write_transaction(device);
|
|
|
spin_lock_irq(&device->al_lock);
|
|
|
/* FIXME
|
|
|
if (err)
|
|
@@ -346,12 +324,10 @@ void drbd_al_begin_io_commit(struct drbd_device *device, bool delegate)
|
|
|
/*
|
|
|
* @delegate: delegate activity log I/O to the worker thread
|
|
|
*/
|
|
|
-void drbd_al_begin_io(struct drbd_device *device, struct drbd_interval *i, bool delegate)
|
|
|
+void drbd_al_begin_io(struct drbd_device *device, struct drbd_interval *i)
|
|
|
{
|
|
|
- BUG_ON(delegate && current == first_peer_device(device)->connection->worker.task);
|
|
|
-
|
|
|
if (drbd_al_begin_io_prepare(device, i))
|
|
|
- drbd_al_begin_io_commit(device, delegate);
|
|
|
+ drbd_al_begin_io_commit(device);
|
|
|
}
|
|
|
|
|
|
int drbd_al_begin_io_nonblock(struct drbd_device *device, struct drbd_interval *i)
|
|
@@ -464,8 +440,7 @@ static sector_t al_tr_number_to_on_disk_sector(struct drbd_device *device)
|
|
|
return device->ldev->md.md_offset + device->ldev->md.al_offset + t;
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-_al_write_transaction(struct drbd_device *device)
|
|
|
+int al_write_transaction(struct drbd_device *device)
|
|
|
{
|
|
|
struct al_transaction_on_disk *buffer;
|
|
|
struct lc_element *e;
|
|
@@ -575,38 +550,6 @@ _al_write_transaction(struct drbd_device *device)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-static int w_al_write_transaction(struct drbd_work *w, int unused)
|
|
|
-{
|
|
|
- struct update_al_work *aw = container_of(w, struct update_al_work, w);
|
|
|
- struct drbd_device *device = aw->device;
|
|
|
- int err;
|
|
|
-
|
|
|
- err = _al_write_transaction(device);
|
|
|
- aw->err = err;
|
|
|
- complete(&aw->event);
|
|
|
-
|
|
|
- return err != -EIO ? err : 0;
|
|
|
-}
|
|
|
-
|
|
|
-/* Calls from worker context (see w_restart_disk_io()) need to write the
|
|
|
- transaction directly. Others came through generic_make_request(),
|
|
|
- those need to delegate it to the worker. */
|
|
|
-static int al_write_transaction(struct drbd_device *device, bool delegate)
|
|
|
-{
|
|
|
- if (delegate) {
|
|
|
- struct update_al_work al_work;
|
|
|
- init_completion(&al_work.event);
|
|
|
- al_work.w.cb = w_al_write_transaction;
|
|
|
- al_work.device = device;
|
|
|
- drbd_queue_work_front(&first_peer_device(device)->connection->sender_work,
|
|
|
- &al_work.w);
|
|
|
- wait_for_completion(&al_work.event);
|
|
|
- return al_work.err;
|
|
|
- } else
|
|
|
- return _al_write_transaction(device);
|
|
|
-}
|
|
|
-
|
|
|
static int _try_lc_del(struct drbd_device *device, struct lc_element *al_ext)
|
|
|
{
|
|
|
int rv;
|