]> 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)
committerDerrick Brashear <shadow|account-1000005@unknown>
Mon, 2 Nov 2009 12:42:31 +0000 (04:42 -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 77c444010bac38ef655355b7d448093a68632520..1d8354909c3c44234eb7b769eed8b4800d1c0cdc 100644 (file)
@@ -308,7 +308,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);