diff options
author | David Howells <dhowells@redhat.com> | 2012-12-13 15:03:13 -0500 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2012-12-20 17:34:00 -0500 |
commit | 1f372dff1da37e2b36ae9085368fa46896398598 (patch) | |
tree | f47b00dc61c9cf6c0eaa6d437bd7f91bfcb4d76d | |
parent | 7ef001e937e8b9cbedb2fc1c31dd681ac3b31927 (diff) |
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: David Howells <dhowells@redhat.com>
-rw-r--r-- | fs/cachefiles/interface.c | 2 | ||||
-rw-r--r-- | fs/fscache/operation.c | 7 | ||||
-rw-r--r-- | fs/fscache/page.c | 10 | ||||
-rw-r--r-- | include/linux/fscache-cache.h | 4 |
4 files changed, 12 insertions, 11 deletions
diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c index 7a9d574b961c..746ce532e130 100644 --- a/fs/cachefiles/interface.c +++ b/fs/cachefiles/interface.c | |||
@@ -484,7 +484,7 @@ static void cachefiles_invalidate_object(struct fscache_operation *op) | |||
484 | } | 484 | } |
485 | } | 485 | } |
486 | 486 | ||
487 | fscache_op_complete(op); | 487 | fscache_op_complete(op, true); |
488 | _leave(""); | 488 | _leave(""); |
489 | } | 489 | } |
490 | 490 | ||
diff --git a/fs/fscache/operation.c b/fs/fscache/operation.c index 9e6b7d232bb1..36c59604130d 100644 --- a/fs/fscache/operation.c +++ b/fs/fscache/operation.c | |||
@@ -363,9 +363,9 @@ void fscache_cancel_all_ops(struct fscache_object *object) | |||
363 | } | 363 | } |
364 | 364 | ||
365 | /* | 365 | /* |
366 | * Record the completion of an in-progress operation. | 366 | * Record the completion or cancellation of an in-progress operation. |
367 | */ | 367 | */ |
368 | void fscache_op_complete(struct fscache_operation *op) | 368 | void fscache_op_complete(struct fscache_operation *op, bool cancelled) |
369 | { | 369 | { |
370 | struct fscache_object *object = op->object; | 370 | struct fscache_object *object = op->object; |
371 | 371 | ||
@@ -380,7 +380,8 @@ void fscache_op_complete(struct fscache_operation *op) | |||
380 | 380 | ||
381 | spin_lock(&object->lock); | 381 | spin_lock(&object->lock); |
382 | 382 | ||
383 | op->state = FSCACHE_OP_ST_COMPLETE; | 383 | op->state = cancelled ? |
384 | FSCACHE_OP_ST_CANCELLED : FSCACHE_OP_ST_COMPLETE; | ||
384 | 385 | ||
385 | if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags)) | 386 | if (test_bit(FSCACHE_OP_EXCLUSIVE, &op->flags)) |
386 | object->n_exclusive--; | 387 | object->n_exclusive--; |
diff --git a/fs/fscache/page.c b/fs/fscache/page.c index ef0218f5080d..8a92b9fabe83 100644 --- a/fs/fscache/page.c +++ b/fs/fscache/page.c | |||
@@ -171,7 +171,7 @@ static void fscache_attr_changed_op(struct fscache_operation *op) | |||
171 | fscache_abort_object(object); | 171 | fscache_abort_object(object); |
172 | } | 172 | } |
173 | 173 | ||
174 | fscache_op_complete(op); | 174 | fscache_op_complete(op, true); |
175 | _leave(""); | 175 | _leave(""); |
176 | } | 176 | } |
177 | 177 | ||
@@ -704,7 +704,7 @@ static void fscache_write_op(struct fscache_operation *_op) | |||
704 | * exists, so we should just cancel this write operation. | 704 | * exists, so we should just cancel this write operation. |
705 | */ | 705 | */ |
706 | spin_unlock(&object->lock); | 706 | spin_unlock(&object->lock); |
707 | op->op.state = FSCACHE_OP_ST_CANCELLED; | 707 | fscache_op_complete(&op->op, false); |
708 | _leave(" [inactive]"); | 708 | _leave(" [inactive]"); |
709 | return; | 709 | return; |
710 | } | 710 | } |
@@ -717,7 +717,7 @@ static void fscache_write_op(struct fscache_operation *_op) | |||
717 | * cancel this write operation. | 717 | * cancel this write operation. |
718 | */ | 718 | */ |
719 | spin_unlock(&object->lock); | 719 | spin_unlock(&object->lock); |
720 | op->op.state = FSCACHE_OP_ST_CANCELLED; | 720 | fscache_op_complete(&op->op, false); |
721 | _leave(" [cancel] op{f=%lx s=%u} obj{s=%u f=%lx}", | 721 | _leave(" [cancel] op{f=%lx s=%u} obj{s=%u f=%lx}", |
722 | _op->flags, _op->state, object->state, object->flags); | 722 | _op->flags, _op->state, object->state, object->flags); |
723 | return; | 723 | return; |
@@ -755,7 +755,7 @@ static void fscache_write_op(struct fscache_operation *_op) | |||
755 | fscache_end_page_write(object, page); | 755 | fscache_end_page_write(object, page); |
756 | if (ret < 0) { | 756 | if (ret < 0) { |
757 | fscache_abort_object(object); | 757 | fscache_abort_object(object); |
758 | fscache_op_complete(&op->op); | 758 | fscache_op_complete(&op->op, true); |
759 | } else { | 759 | } else { |
760 | fscache_enqueue_operation(&op->op); | 760 | fscache_enqueue_operation(&op->op); |
761 | } | 761 | } |
@@ -770,7 +770,7 @@ superseded: | |||
770 | spin_unlock(&cookie->stores_lock); | 770 | spin_unlock(&cookie->stores_lock); |
771 | clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags); | 771 | clear_bit(FSCACHE_OBJECT_PENDING_WRITE, &object->flags); |
772 | spin_unlock(&object->lock); | 772 | spin_unlock(&object->lock); |
773 | fscache_op_complete(&op->op); | 773 | fscache_op_complete(&op->op, true); |
774 | _leave(""); | 774 | _leave(""); |
775 | } | 775 | } |
776 | 776 | ||
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h index 73e68c8d5df4..5dfa0aa216b6 100644 --- a/include/linux/fscache-cache.h +++ b/include/linux/fscache-cache.h | |||
@@ -116,7 +116,7 @@ extern atomic_t fscache_op_debug_id; | |||
116 | extern void fscache_op_work_func(struct work_struct *work); | 116 | extern void fscache_op_work_func(struct work_struct *work); |
117 | 117 | ||
118 | extern void fscache_enqueue_operation(struct fscache_operation *); | 118 | extern void fscache_enqueue_operation(struct fscache_operation *); |
119 | extern void fscache_op_complete(struct fscache_operation *); | 119 | extern void fscache_op_complete(struct fscache_operation *, bool); |
120 | extern void fscache_put_operation(struct fscache_operation *); | 120 | extern void fscache_put_operation(struct fscache_operation *); |
121 | 121 | ||
122 | /** | 122 | /** |
@@ -196,7 +196,7 @@ static inline void fscache_retrieval_complete(struct fscache_retrieval *op, | |||
196 | { | 196 | { |
197 | op->n_pages -= n_pages; | 197 | op->n_pages -= n_pages; |
198 | if (op->n_pages <= 0) | 198 | if (op->n_pages <= 0) |
199 | fscache_op_complete(&op->op); | 199 | fscache_op_complete(&op->op, true); |
200 | } | 200 | } |
201 | 201 | ||
202 | /** | 202 | /** |