summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2015-02-24 10:52:51 +0000
committerDavid Howells <dhowells@redhat.com>2015-04-02 14:28:53 +0100
commit87021526300f1a292dd966e141e183630ac95317 (patch)
treea248e5643ecdf9dae6ab6a2fe0e3d4abc415b373
parentf09b443d0e09f37121c55d7f83056f6ebff6ab4f (diff)
downloadop-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>
-rw-r--r--fs/fscache/cookie.c3
-rw-r--r--fs/fscache/page.c6
-rw-r--r--include/linux/fscache-cache.h6
3 files changed, 6 insertions, 9 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;
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h
index 2e83a14..ca3d550 100644
--- a/include/linux/fscache-cache.h
+++ b/include/linux/fscache-cache.h
@@ -423,12 +423,6 @@ static inline bool fscache_object_is_active(struct fscache_object *object)
!fscache_cache_is_broken(object);
}
-static inline bool fscache_object_is_dead(struct fscache_object *object)
-{
- return fscache_object_is_dying(object) &&
- fscache_cache_is_broken(object);
-}
-
/**
* fscache_object_destroyed - Note destruction of an object in a cache
* @cache: The cache from which the object came
OpenPOWER on IntegriCloud