Commit 1f372dff authored by David Howells's avatar David Howells

FS-Cache: Mark cancellation of in-progress operation

Mark as cancelled an operation that is in progress rather than pending at the
time it is cancelled, and call fscache_complete_op() to cancel an operation so
that blocked ops can be started.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 7ef001e9
...@@ -484,7 +484,7 @@ static void cachefiles_invalidate_object(struct fscache_operation *op) ...@@ -484,7 +484,7 @@ static void cachefiles_invalidate_object(struct fscache_operation *op)
} }
} }
fscache_op_complete(op); fscache_op_complete(op, true);
_leave(""); _leave("");
} }
......
...@@ -363,9 +363,9 @@ void fscache_cancel_all_ops(struct fscache_object *object) ...@@ -363,9 +363,9 @@ void fscache_cancel_all_ops(struct fscache_object *object)
} }
/* /*
* Record the completion of an in-progress operation. * Record the completion or cancellation of an in-progress operation.
*/ */
void fscache_op_complete(struct fscache_operation *op) void fscache_op_complete(struct fscache_operation *op, bool cancelled)
{ {
struct fscache_object *object = op->object; struct fscache_object *object = op->object;
...@@ -380,7 +380,8 @@ void fscache_op_complete(struct fscache_operation *op) ...@@ -380,7 +380,8 @@ void fscache_op_complete(struct fscache_operation *op)
spin_lock(&object->lock); spin_lock(&object->lock);
op->state = FSCACHE_OP_ST_COMPLETE; op->state = cancelled ?
FSCACHE_OP_ST_CANCELLED : FSCACHE_OP_ST_COMPLETE;
if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags)) if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags))
object->n_exclusive--; object->n_exclusive--;
......
...@@ -171,7 +171,7 @@ static void fscache_attr_changed_op(struct fscache_operation *op) ...@@ -171,7 +171,7 @@ static void fscache_attr_changed_op(struct fscache_operation *op)
fscache_abort_object(object); fscache_abort_object(object);
} }
fscache_op_complete(op); fscache_op_complete(op, true);
_leave(""); _leave("");
} }
...@@ -704,7 +704,7 @@ static void fscache_write_op(struct fscache_operation *_op) ...@@ -704,7 +704,7 @@ static void fscache_write_op(struct fscache_operation *_op)
* exists, so we should just cancel this write operation. * exists, so we should just cancel this write operation.
*/ */
spin_unlock(&object->lock); spin_unlock(&object->lock);
op->op.state = FSCACHE_OP_ST_CANCELLED; fscache_op_complete(&op->op, false);
_leave(" [inactive]"); _leave(" [inactive]");
return; return;
} }
...@@ -717,7 +717,7 @@ static void fscache_write_op(struct fscache_operation *_op) ...@@ -717,7 +717,7 @@ static void fscache_write_op(struct fscache_operation *_op)
* cancel this write operation. * cancel this write operation.
*/ */
spin_unlock(&object->lock); 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}", _leave(" [cancel] op{f=%lx s=%u} obj{s=%u f=%lx}",
_op->flags, _op->state, object->state, object->flags); _op->flags, _op->state, object->state, object->flags);
return; return;
...@@ -755,7 +755,7 @@ static void fscache_write_op(struct fscache_operation *_op) ...@@ -755,7 +755,7 @@ static void fscache_write_op(struct fscache_operation *_op)
fscache_end_page_write(object, page); fscache_end_page_write(object, page);
if (ret < 0) { if (ret < 0) {
fscache_abort_object(object); fscache_abort_object(object);
fscache_op_complete(&op->op); fscache_op_complete(&op->op, true);
} else { } else {
fscache_enqueue_operation(&op->op); fscache_enqueue_operation(&op->op);
} }
...@@ -770,7 +770,7 @@ static void fscache_write_op(struct fscache_operation *_op) ...@@ -770,7 +770,7 @@ static void fscache_write_op(struct fscache_operation *_op)
spin_unlock(&cookie->stores_lock); spin_unlock(&cookie->stores_lock);
clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags); clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags);
spin_unlock(&object->lock); spin_unlock(&object->lock);
fscache_op_complete(&op->op); fscache_op_complete(&op->op, true);
_leave(""); _leave("");
} }
......
...@@ -116,7 +116,7 @@ extern atomic_t fscache_op_debug_id; ...@@ -116,7 +116,7 @@ extern atomic_t fscache_op_debug_id;
extern void fscache_op_work_func(struct work_struct *work); extern void fscache_op_work_func(struct work_struct *work);
extern void fscache_enqueue_operation(struct fscache_operation *); extern void fscache_enqueue_operation(struct fscache_operation *);
extern void fscache_op_complete(struct fscache_operation *); extern void fscache_op_complete(struct fscache_operation *, bool);
extern void fscache_put_operation(struct fscache_operation *); extern void fscache_put_operation(struct fscache_operation *);
/** /**
...@@ -196,7 +196,7 @@ static inline void fscache_retrieval_complete(struct fscache_retrieval *op, ...@@ -196,7 +196,7 @@ static inline void fscache_retrieval_complete(struct fscache_retrieval *op,
{ {
op->n_pages -= n_pages; op->n_pages -= n_pages;
if (op->n_pages <= 0) if (op->n_pages <= 0)
fscache_op_complete(&op->op); fscache_op_complete(&op->op, true);
} }
/** /**
......
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