]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Linux: Avoid deadlock in readdir - release GLOCK for filldir
authorMarc Dionne <marc.c.dionne@gmail.com>
Sun, 1 Nov 2009 21:03:17 +0000 (16:03 -0500)
committerRuss Allbery <rra@debian.org>
Wed, 4 Nov 2009 01:29:44 +0000 (17:29 -0800)
The GLOCK is held while calling the filldir function in afs_linux_readdir().
If this function causes a page fault, and in particular if this fault
involves AFS, we're in trouble as we'll eventually deadlock in the
readpage code.
A simple test case for this is to call the getdents syscall on an
AFS directory with a buffer that is part of an mmaped AFS file.

This is already the case in the master branch; the change was part of
the merge of the NFS translator code.

FIXES 125555

Change-Id: I829838e45f94921d22335154587216f7842e3955
Reviewed-on: http://gerrit.openafs.org/760
Tested-by: Marc Dionne <marc.c.dionne@gmail.com>
Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/afs/LINUX/osi_vnodeops.c

index 612589b660e6a1020f083e830654f4daad63aadc..bcdcb3d8222c8da8f7ef8640d334b0e6faf8b4b4 100644 (file)
@@ -310,7 +310,9 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
                /* clean up from afs_FindVCache */
                afs_PutVCache(tvc);
            }
+           AFS_GUNLOCK();
            code = (*filldir) (dirbuf, de->name, len, offset, ino, type);
+           AFS_GLOCK();
        }
 #else
        code = (*filldir) (dirbuf, de->name, len, offset, ino);