]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
don't release Volume lightweight ref too early
authorTom Keiser <tkeiser@sinenomine.net>
Wed, 13 Oct 2010 05:10:09 +0000 (01:10 -0400)
committerDerrick Brashear <shadow@dementia.org>
Tue, 26 Oct 2010 00:49:58 +0000 (17:49 -0700)
FSYNC_com_VolOff was releasing its lightweight ref before the error handling
code for VGetVolumeByVp_r was executed; this code needs to dereference the
Volume pointer for some of its logic.  This was unsafe since
VCancelReservation_r() could have resulted in the Volume object being freed.
Move VCancelReservation_r() below the error handling block.  NB: the error
handling block now relies upon the goto done/deny to cancel its lightweight
ref.

Reviewed-on: http://gerrit.openafs.org/2968
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit a91da7a7b91ce0c4584092cd666eca89d39b8abf)
Change-Id: Ie84351628fd112aa1724180a08dba10f0903a016
Reviewed-on: http://gerrit.openafs.org/3103

src/vol/fssync-server.c

index c9d6b1c6911814b05f60cb993422d532ff653d1f..62dd7523a7214fc197618d5f897523a5c1403308 100644 (file)
@@ -969,9 +969,6 @@ FSYNC_com_VolOff(FSSYNC_VolOp_command * vcom, SYNC_response * res)
 
        /* convert to heavyweight ref */
        nvp = VGetVolumeByVp_r(&error, vp);
-       VCancelReservation_r(rvp);
-       rvp = NULL;
-
        if (!nvp) {
             /*
              * It's possible for VGetVolumeByVp_r to have dropped and
@@ -1007,6 +1004,10 @@ FSYNC_com_VolOff(FSSYNC_VolOp_command * vcom, SYNC_response * res)
            vp = nvp;
        }
 
+       /* kill off lightweight ref to ensure we can't deadlock against ourselves later... */
+       VCancelReservation_r(rvp);
+       rvp = NULL;
+
        /* register the volume operation metadata with the volume */
        VRegisterVolOp_r(vp, &info);