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>
This commit is contained in:
parent
7ef001e937
commit
1f372dff1d
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
* 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)
|
||||||
* 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)
|
||||||
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 @@ superseded:
|
||||||
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;
|
||||||
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,
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Reference in New Issue