mhonek / rpms / openldap

Forked from rpms/openldap 3 years ago
Clone
c3337e2
Official usptream patch #1
c3337e2
c3337e2
Source: http://www.oracle.com/technology/products/berkeley-db/db/update/4.6.21/patch.4.6.21.html
c3337e2
c3337e2
*** dbinc/mp.h	2007-09-28 01:28:25.000000000 +1000
c3337e2
--- dbinc/mp.h	2008-02-14 01:22:09.000000000 +1100
c3337e2
***************
c3337e2
*** 639,644 ****
c3337e2
--- 639,647 ----
c3337e2
   */
c3337e2
  #define	MP_TRUNC_RECOVER	0x01
c3337e2
  
c3337e2
+ /* Private flags to DB_MPOOLFILE->close. */
c3337e2
+ #define	DB_MPOOL_NOLOCK		0x002	/* Already have mpf locked. */
c3337e2
+ 
c3337e2
  #if defined(__cplusplus)
c3337e2
  }
c3337e2
  #endif
c3337e2
*** mp/mp_fopen.c	2007-05-18 03:18:01.000000000 +1000
c3337e2
--- mp/mp_fopen.c	2008-02-12 16:09:42.000000000 +1100
c3337e2
***************
c3337e2
*** 888,894 ****
c3337e2
  	 * when we try to flush them.
c3337e2
  	 */
c3337e2
  	deleted = 0;
c3337e2
! 	MUTEX_LOCK(dbenv, mfp->mutex);
c3337e2
  	if (F_ISSET(dbmfp, MP_MULTIVERSION))
c3337e2
  		--mfp->multiversion;
c3337e2
  	if (--mfp->mpf_cnt == 0 || LF_ISSET(DB_MPOOL_DISCARD)) {
c3337e2
--- 888,895 ----
c3337e2
  	 * when we try to flush them.
c3337e2
  	 */
c3337e2
  	deleted = 0;
c3337e2
! 	if (!LF_ISSET(DB_MPOOL_NOLOCK))
c3337e2
! 		MUTEX_LOCK(dbenv, mfp->mutex);
c3337e2
  	if (F_ISSET(dbmfp, MP_MULTIVERSION))
c3337e2
  		--mfp->multiversion;
c3337e2
  	if (--mfp->mpf_cnt == 0 || LF_ISSET(DB_MPOOL_DISCARD)) {
c3337e2
***************
c3337e2
*** 909,921 ****
c3337e2
  			}
c3337e2
  		}
c3337e2
  		if (mfp->block_cnt == 0) {
c3337e2
  			if ((t_ret =
c3337e2
  			    __memp_mf_discard(dbmp, mfp)) != 0 && ret == 0)
c3337e2
  				ret = t_ret;
c3337e2
  			deleted = 1;
c3337e2
  		}
c3337e2
  	}
c3337e2
! 	if (!deleted)
c3337e2
  		MUTEX_UNLOCK(dbenv, mfp->mutex);
c3337e2
  
c3337e2
  done:	/* Discard the DB_MPOOLFILE structure. */
c3337e2
--- 910,928 ----
c3337e2
  			}
c3337e2
  		}
c3337e2
  		if (mfp->block_cnt == 0) {
c3337e2
+ 			/*
c3337e2
+ 			 * We should never discard this mp file if our caller
c3337e2
+ 			 * is holding the lock on it.  See comment in
c3337e2
+ 			 * __memp_sync_file.
c3337e2
+ 			 */
c3337e2
+ 			DB_ASSERT(dbenv, !LF_ISSET(DB_MPOOL_NOLOCK));
c3337e2
  			if ((t_ret =
c3337e2
  			    __memp_mf_discard(dbmp, mfp)) != 0 && ret == 0)
c3337e2
  				ret = t_ret;
c3337e2
  			deleted = 1;
c3337e2
  		}
c3337e2
  	}
c3337e2
! 	if (!deleted && !LF_ISSET(DB_MPOOL_NOLOCK))
c3337e2
  		MUTEX_UNLOCK(dbenv, mfp->mutex);
c3337e2
  
c3337e2
  done:	/* Discard the DB_MPOOLFILE structure. */
c3337e2
*** mp/mp_sync.c	2007-06-02 04:32:44.000000000 +1000
c3337e2
--- mp/mp_sync.c	2008-02-12 16:09:42.000000000 +1100
c3337e2
***************
c3337e2
*** 755,761 ****
c3337e2
  	 * This is important since we are called with the hash bucket
c3337e2
  	 * locked.  The mfp will get freed via the cleanup pass.
c3337e2
  	 */
c3337e2
! 	if (dbmfp != NULL && (t_ret = __memp_fclose(dbmfp, 0)) != 0 && ret == 0)
c3337e2
  		ret = t_ret;
c3337e2
  
c3337e2
  	--mfp->mpf_cnt;
c3337e2
--- 755,762 ----
c3337e2
  	 * This is important since we are called with the hash bucket
c3337e2
  	 * locked.  The mfp will get freed via the cleanup pass.
c3337e2
  	 */
c3337e2
! 	if (dbmfp != NULL &&
c3337e2
! 	    (t_ret = __memp_fclose(dbmfp, DB_MPOOL_NOLOCK)) != 0 && ret == 0)
c3337e2
  		ret = t_ret;
c3337e2
  
c3337e2
  	--mfp->mpf_cnt;
c3337e2