fscache_abort_object(object);
}
- fscache_op_complete(op);
+ fscache_op_complete(op, true);
_leave("");
}
return 0;
}
+/*
+ * Handle cancellation of a pending retrieval op
+ */
+static void fscache_do_cancel_retrieval(struct fscache_operation *_op)
+{
+ struct fscache_retrieval *op =
+ container_of(_op, struct fscache_retrieval, op);
+
+ op->n_pages = 0;
+}
+
/*
* wait for an object to become active (or dead)
*/
if (wait_on_bit(&op->op.flags, FSCACHE_OP_WAITING,
fscache_wait_bit_interruptible,
TASK_INTERRUPTIBLE) != 0) {
- ret = fscache_cancel_op(&op->op);
+ ret = fscache_cancel_op(&op->op, fscache_do_cancel_retrieval);
if (ret == 0)
return -ERESTARTSYS;
return -ENOBUFS;
}
if (unlikely(fscache_object_is_dead(object))) {
- pr_err("%s() = -ENOBUFS [obj dead %d]", __func__, op->op.state);
- fscache_cancel_op(&op->op);
+ pr_err("%s() = -ENOBUFS [obj dead %d]\n", __func__, op->op.state);
+ fscache_cancel_op(&op->op, fscache_do_cancel_retrieval);
fscache_stat(stat_object_dead);
return -ENOBUFS;
}
* exists, so we should just cancel this write operation.
*/
spin_unlock(&object->lock);
- op->op.state = FSCACHE_OP_ST_CANCELLED;
+ fscache_op_complete(&op->op, false);
_leave(" [inactive]");
return;
}
* cancel this write operation.
*/
spin_unlock(&object->lock);
- op->op.state = FSCACHE_OP_ST_CANCELLED;
+ fscache_op_complete(&op->op, false);
_leave(" [cancel] op{f=%lx s=%u} obj{s=%u f=%lx}",
_op->flags, _op->state, object->state, object->flags);
return;
fscache_end_page_write(object, page);
if (ret < 0) {
fscache_abort_object(object);
- fscache_op_complete(&op->op);
+ fscache_op_complete(&op->op, true);
} else {
fscache_enqueue_operation(&op->op);
}
spin_unlock(&cookie->stores_lock);
clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags);
spin_unlock(&object->lock);
- fscache_op_complete(&op->op);
+ fscache_op_complete(&op->op, true);
_leave("");
}