Ignore:
Timestamp:
Nov 29, 2012, 2:06:31 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.9 2nd part

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/lib/tdb/common/lock.c

    r745 r752  
    103103
    104104        errno = EINVAL;
    105         TDB_LOG(( tdb, TDB_DEBUG_ERROR, "_mutex_brlock pid %X, failed (fd=%d) at offset %d rw_type=%d lck_type=%d len=%d, rc=%d\n",
     105        TDB_LOG(( tdb, TDB_DEBUG_ERROR, "_mutex_brlock pid %d, failed (fd=%d) at offset %d rw_type=%d lck_type=%d len=%d, rc=%d\n",
    106106                 getpid(), tdb->fd, offset, rw_type, waitflag, (int)len, rc));
    107107        tdb->ecode = TDB_ERR_LOCK;
     
    125125        off_t       offStart;
    126126        off_t       cbRange;
    127         FILELOCK    lockArea = {0}, unlockArea = {0};
    128 
    129         TDB_LOG((tdb, TDB_DEBUG_TRACE, "fcntl_lock in pid %X, fd %d, lck_type %s, rw_type %s, offset %d, len %d\n",
     127        FILELOCK    lockArea = {0}, unlockArea = {0}, unlockArea1 = {0};
     128
     129        TDB_LOG((tdb, TDB_DEBUG_TRACE, "fcntl_lock in pid %d, fd %d, lck_type %s, rw_type %s, offset %d, len %d\n",
    130130                getpid(), tdb->fd, lock_type(waitflag), read_type(rw), off, len));
    131131       
     
    144144                        unlockArea.lOffset = off;
    145145                        unlockArea.lRange  = len ? len : tdb->header.hash_size *4; //was LONG_MAX
     146                        unlockArea1.lOffset = off;
     147                        unlockArea1.lRange  = len ? len : LONG_MAX;
    146148                        break;
    147149                case F_RDLCK:
     
    158160        }
    159161               
     162// why DosSetFileLocks() in the F_UNLCK case with len == 0, fails is really a question
     163// to overcome that i do 2 unlock with 2 different length (nasty workaround imho)
    160164        rc = DosSetFileLocks(tdb->fd, &unlockArea, &lockArea, SEM_IMMEDIATE_RETURN, fAccess);
     165        if (rc != NO_ERROR && rw == F_UNLCK && len == 0)
     166        rc = DosSetFileLocks(tdb->fd, &unlockArea1, &lockArea, SEM_IMMEDIATE_RETURN, fAccess);
    161167
    162168        if (rc != NO_ERROR && waitflag) {
     
    164170                do {
    165171                        rc = DosSetFileLocks(tdb->fd, &unlockArea, &lockArea, 100, fAccess);
     172                        if (rc != NO_ERROR && rw == F_UNLCK && len == 0)
     173                        rc = DosSetFileLocks(tdb->fd, &unlockArea1, &lockArea, 100, fAccess);
    166174                        count--;
    167175                } while( count>0 && rc !=NO_ERROR);
     
    169177        }
    170178
    171         TDB_LOG(( tdb, TDB_DEBUG_TRACE, "fcntl_lock out pid %X, fd %d, lck_type %s, rw_type %s, offset %d, len %d, rc=%d\n",
     179        TDB_LOG(( tdb, TDB_DEBUG_TRACE, "fcntl_lock out pid %d, fd %d, lck_type %s, rw_type %s, offset %d, len %d, rc=%d\n",
    172180                getpid(), tdb->fd, lock_type(waitflag), read_type(rw), off, len, rc));
    173181
Note: See TracChangeset for help on using the changeset viewer.