]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
LINUX vcache lock ordering in afs_linux_readdir
authorMatt Benjamin <matt@linuxbox.com>
Wed, 24 Aug 2011 20:23:37 +0000 (16:23 -0400)
committerDerrick Brashear <shadow@dementix.org>
Fri, 16 Dec 2011 11:03:31 +0000 (03:03 -0800)
Normalize shared and exclusive lock operations.  Take the lock
exclusive immediately, since the code assumes a write lock if
the vcache state is in flux or the entry is being fetched, releasing
-write- rather than shared, since we do not hold a shared lock.

Reviewed-on: http://gerrit.openafs.org/5309
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
(cherry picked from commit fa97579a08cdf23fcff3c50a5845d72a785feeaf)

Change-Id: I282913fead10791751ebaf3c7c6b33e3fbd9a1f7
Reviewed-on: http://gerrit.openafs.org/6305
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
src/afs/LINUX/osi_vnodeops.c

index dd133d46cf4f2552704f0a8415e8e15b55521fd4..2cbf2b14bd7e2869c4774e9efb4b0a366dc92339 100644 (file)
@@ -220,8 +220,7 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
        code = -ENOENT;
        goto out;
     }
-    ObtainSharedLock(&avc->lock, 810);
-    UpgradeSToWLock(&avc->lock, 811);
+    ObtainWriteLock(&avc->lock, 811);
     ObtainReadLock(&tdc->lock);
     /*
      * Make sure that the data in the cache is current. There are two
@@ -233,15 +232,15 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
           && (tdc->dflags & DFFetching)
           && hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
        ReleaseReadLock(&tdc->lock);
-       ReleaseSharedLock(&avc->lock);
+       ReleaseWriteLock(&avc->lock);
        afs_osi_Sleep(&tdc->validPos);
-       ObtainSharedLock(&avc->lock, 812);
+       ObtainWriteLock(&avc->lock, 812);
        ObtainReadLock(&tdc->lock);
     }
     if (!(avc->f.states & CStatd)
        || !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
        ReleaseReadLock(&tdc->lock);
-       ReleaseSharedLock(&avc->lock);
+       ReleaseWriteLock(&avc->lock);
        afs_PutDCache(tdc);
        goto tagain;
     }