Add asserts to VLock* functions
authorAndrew Deason <adeason@sinenomine.net>
Fri, 23 Apr 2010 22:51:28 +0000 (17:51 -0500)
committerDaria Brashear <shadow@your-file-system.com>
Wed, 21 Jan 2015 15:40:23 +0000 (10:40 -0500)
Make sure we don't continue on if we have unbalanced locks and
unlocks. Having a negative refcount is a serious internal error, and
they are difficult to fix unless we assert right away.

Change-Id: Ib9b5b3f209635e0365df96c79ea8bf49c765008b
Reviewed-on: http://gerrit.openafs.org/2594
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: Daria Brashear <shadow@your-file-system.com>

src/vol/vutil.c

index 35389d4..c7c7a8d 100644 (file)
@@ -1010,6 +1010,8 @@ _VLockFd(FD_t fd, afs_uint32 offset, int locktype, int nonblock)
     int cmd = AFS_SETLKW;
     struct afs_st_flock sf;
 
+    opr_Assert(fd >= 0);
+
     if (locktype == READ_LOCK) {
        l_type = F_RDLCK;
     }
@@ -1146,6 +1148,7 @@ VLockFileLock(struct VLockFile *lf, afs_uint32 offset, int locktype, int nonbloc
     opr_mutex_enter(&lf->mutex);
 
     if (lf->fd == INVALID_FD) {
+       opr_Assert(lf->refcount == 0);
        lf->fd = _VOpenPath(lf->path);
        if (lf->fd == INVALID_FD) {
            opr_mutex_exit(&lf->mutex);
@@ -1155,12 +1158,15 @@ VLockFileLock(struct VLockFile *lf, afs_uint32 offset, int locktype, int nonbloc
 
     lf->refcount++;
 
+    opr_Assert(lf->refcount > 0);
+
     opr_mutex_exit(&lf->mutex);
 
     code = _VLockFd(lf->fd, offset, locktype, nonblock);
 
     if (code) {
        opr_mutex_enter(&lf->mutex);
+       opr_Assert(lf->refcount > 0);
        if (--lf->refcount < 1) {
            _VCloseFd(lf->fd);
            lf->fd = INVALID_FD;
@@ -1177,6 +1183,7 @@ VLockFileUnlock(struct VLockFile *lf, afs_uint32 offset)
     opr_mutex_enter(&lf->mutex);
 
     opr_Assert(lf->fd != INVALID_FD);
+    opr_Assert(lf->refcount > 0);
 
     if (--lf->refcount < 1) {
        _VCloseFd(lf->fd);