diff options
author | David Howells <dhowells@redhat.com> | 2012-12-20 22:52:35 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2012-12-20 22:58:25 +0100 |
commit | ef46ed888efb1e8da33be5d33c9b54476289a43b (patch) | |
tree | d538dc01a075162f95da416da1fb5d6fd676445a /fs/fscache/operation.c | |
parent | CacheFiles: Make some debugging statements conditional (diff) | |
download | linux-ef46ed888efb1e8da33be5d33c9b54476289a43b.tar.xz linux-ef46ed888efb1e8da33be5d33c9b54476289a43b.zip |
FS-Cache: Make cookie relinquishment wait for outstanding reads
Make fscache_relinquish_cookie() log a warning and wait if there are any
outstanding reads left on the cookie it was given.
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/fscache/operation.c')
-rw-r--r-- | fs/fscache/operation.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/fscache/operation.c b/fs/fscache/operation.c index 30afdfa7aec7..c857ab824d6e 100644 --- a/fs/fscache/operation.c +++ b/fs/fscache/operation.c @@ -340,8 +340,14 @@ void fscache_put_operation(struct fscache_operation *op) object = op->object; - if (test_bit(FSCACHE_OP_DEC_READ_CNT, &op->flags)) - atomic_dec(&object->n_reads); + if (test_bit(FSCACHE_OP_DEC_READ_CNT, &op->flags)) { + if (atomic_dec_and_test(&object->n_reads)) { + clear_bit(FSCACHE_COOKIE_WAITING_ON_READS, + &object->cookie->flags); + wake_up_bit(&object->cookie->flags, + FSCACHE_COOKIE_WAITING_ON_READS); + } + } /* now... we may get called with the object spinlock held, so we * complete the cleanup here only if we can immediately acquire the |