diff options
author | David Howells <dhowells@redhat.com> | 2015-02-24 10:52:51 +0000 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2015-04-02 14:28:53 +0100 |
commit | 87021526300f1a292dd966e141e183630ac95317 (patch) | |
tree | a248e5643ecdf9dae6ab6a2fe0e3d4abc415b373 /fs/fscache | |
parent | f09b443d0e09f37121c55d7f83056f6ebff6ab4f (diff) | |
download | op-kernel-dev-87021526300f1a292dd966e141e183630ac95317.zip op-kernel-dev-87021526300f1a292dd966e141e183630ac95317.tar.gz |
FS-Cache: fscache_object_is_dead() has wrong logic, kill it
fscache_object_is_dead() returns true only if the object is marked dead and
the cache got an I/O error. This should be a logical OR instead. Since two
of the callers got split up into handling for separate subcases, expand the
other callers and kill the function. This is probably the right thing to do
anyway since one of the subcases isn't about the object at all, but rather
about the cache.
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Steve Dickson <steved@redhat.com>
Acked-by: Jeff Layton <jeff.layton@primarydata.com>
Diffstat (limited to 'fs/fscache')
-rw-r--r-- | fs/fscache/cookie.c | 3 | ||||
-rw-r--r-- | fs/fscache/page.c | 6 |
2 files changed, 6 insertions, 3 deletions
diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c index 89acec7..8de2216 100644 --- a/fs/fscache/cookie.c +++ b/fs/fscache/cookie.c @@ -327,7 +327,8 @@ static int fscache_alloc_object(struct fscache_cache *cache, object_already_extant: ret = -ENOBUFS; - if (fscache_object_is_dead(object)) { + if (fscache_object_is_dying(object) || + fscache_cache_is_broken(object)) { spin_unlock(&cookie->lock); goto error; } diff --git a/fs/fscache/page.c b/fs/fscache/page.c index de33b3f..d0805e3 100644 --- a/fs/fscache/page.c +++ b/fs/fscache/page.c @@ -377,11 +377,13 @@ check_if_dead: _leave(" = -ENOBUFS [cancelled]"); return -ENOBUFS; } - if (unlikely(fscache_object_is_dead(object))) { - pr_err("%s() = -ENOBUFS [obj dead %d]\n", __func__, op->state); + if (unlikely(fscache_object_is_dying(object) || + fscache_cache_is_broken(object))) { + enum fscache_operation_state state = op->state; fscache_cancel_op(op, do_cancel); if (stat_object_dead) fscache_stat(stat_object_dead); + _leave(" = -ENOBUFS [obj dead %d]", state); return -ENOBUFS; } return 0; |