[Linux-cachefs] [PATCH 1/1] [CacheFiles] Fix to handle Oops in cachefiles module during new object lookup while old object is being cleaned up

KiranKumar Modukuri kiran.modukuri at gmail.com
Thu Jun 21 20:25:53 UTC 2018


BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1776254

The patch is based on the ubuntu linux kernel  4.4.0-124-generic

[Impact]

Oops during heavy NFS + FSCache + Cachefiles

CacheFiles: Error: Overlong wait for old active object to go away.

BUG: unable to handle kernel NULL pointer dereference at 0000000000000002

CacheFiles: Error: Object already active kernel BUG at
fs/cachefiles/namei.c:163!

 [Cause]
In a heavily loaded system with big files being read and truncated, an
fscache object for a cookie is being dropped and a new object being
looked. The new object being looked for has to wait for the old object
to go away before the new object is moved to active state.

[Fix]
Clear the flag 'CACHEFILES_OBJECT_ACTIVE' for the new object when
retrying the object lookup.
Remove the BUG() for the case where the old object is still being
dropped and convert to WARN()


[Testcase]
Have run ~100 hours of NFS stress tests and have not seen this bug recur.


[Regression Potential]

 - Limited to fscache/cachefiles.


Signed-off-by: kmodukuri <mailto:kiran.modukuri at gmail.com>
---
 fs/cachefiles/namei.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index c4b8934..b08286d 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c
@@ -194,7 +194,7 @@ wait_for_old_object:
                pr_err("\n");
                pr_err("Error: Unexpected object collision\n");
                cachefiles_printk_object(object, xobject);
-               BUG();
+               WARN(true, "Unexpected object collision\n");
        }
        atomic_inc(&xobject->usage);
        write_unlock(&cache->active_lock);
@@ -247,6 +247,7 @@ wait_for_old_object:

        ASSERT(!test_bit(CACHEFILES_OBJECT_ACTIVE, &xobject->flags));

+       clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags);
        cache->cache.ops->put_object(&xobject->fscache);
        goto try_again;

--
2.7.4




More information about the Linux-cachefs mailing list