4496171313bed39e96f21bc2f9faf2868e267ae3girish/*-
4496171313bed39e96f21bc2f9faf2868e267ae3girish * See the file LICENSE for redistribution information.
4496171313bed39e96f21bc2f9faf2868e267ae3girish *
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Copyright (c) 1996, 1997, 1998
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Sleepycat Software. All rights reserved.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "config.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifndef lint
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic const char sccsid[] = "@(#)mp_fset.c 10.16 (Sleepycat) 9/27/98";
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* not lint */
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#ifndef NO_SYSTEM_INCLUDES
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <sys/types.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include <errno.h>
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "db_int.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "shqueue.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "db_shash.h"
758f2e043bc8289d6326e6116f14c01061821432zx#include "mp.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish#include "common_ext.h"
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*
4496171313bed39e96f21bc2f9faf2868e267ae3girish * memp_fset --
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Mpool page set-flag routine.
4496171313bed39e96f21bc2f9faf2868e267ae3girish */
4496171313bed39e96f21bc2f9faf2868e267ae3girishint
4496171313bed39e96f21bc2f9faf2868e267ae3girishmemp_fset(dbmfp, pgaddr, flags)
4496171313bed39e96f21bc2f9faf2868e267ae3girish DB_MPOOLFILE *dbmfp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish void *pgaddr;
4496171313bed39e96f21bc2f9faf2868e267ae3girish u_int32_t flags;
4496171313bed39e96f21bc2f9faf2868e267ae3girish{
4496171313bed39e96f21bc2f9faf2868e267ae3girish BH *bhp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish DB_MPOOL *dbmp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish MPOOL *mp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish int ret;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish dbmp = dbmfp->dbmp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish mp = dbmp->mp;
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish MP_PANIC_CHECK(dbmp);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Validate arguments. */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (flags == 0)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (__db_ferr(dbmp->dbenv, "memp_fset", 1));
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((ret = __db_fchk(dbmp->dbenv, "memp_fset", flags,
4496171313bed39e96f21bc2f9faf2868e267ae3girish DB_MPOOL_DIRTY | DB_MPOOL_CLEAN | DB_MPOOL_DISCARD)) != 0)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (ret);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((ret = __db_fcchk(dbmp->dbenv, "memp_fset",
4496171313bed39e96f21bc2f9faf2868e267ae3girish flags, DB_MPOOL_CLEAN, DB_MPOOL_DIRTY)) != 0)
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (ret);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (LF_ISSET(DB_MPOOL_DIRTY) && F_ISSET(dbmfp, MP_READONLY)) {
87c478a5395a3af1176f469bdeaf2ce044e4ae1azx __db_err(dbmp->dbenv,
4496171313bed39e96f21bc2f9faf2868e267ae3girish "%s: dirty flag set for readonly file page",
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx __memp_fn(dbmfp));
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx return (EACCES);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Convert the page address to a buffer header. */
4496171313bed39e96f21bc2f9faf2868e267ae3girish bhp = (BH *)((u_int8_t *)pgaddr - SSZA(BH, buf));
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx LOCKREGION(dbmp);
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx if (LF_ISSET(DB_MPOOL_CLEAN) && F_ISSET(bhp, BH_DIRTY)) {
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx ++mp->stat.st_page_clean;
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx --mp->stat.st_page_dirty;
4496171313bed39e96f21bc2f9faf2868e267ae3girish F_CLR(bhp, BH_DIRTY);
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx }
b423da26b867ead68b8fda8497cf4e5bb7ed1631zx if (LF_ISSET(DB_MPOOL_DIRTY) && !F_ISSET(bhp, BH_DIRTY)) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish --mp->stat.st_page_clean;
4496171313bed39e96f21bc2f9faf2868e267ae3girish ++mp->stat.st_page_dirty;
4496171313bed39e96f21bc2f9faf2868e267ae3girish F_SET(bhp, BH_DIRTY);
4496171313bed39e96f21bc2f9faf2868e267ae3girish }
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (LF_ISSET(DB_MPOOL_DISCARD))
4496171313bed39e96f21bc2f9faf2868e267ae3girish F_SET(bhp, BH_DISCARD);
4496171313bed39e96f21bc2f9faf2868e267ae3girish
4496171313bed39e96f21bc2f9faf2868e267ae3girish UNLOCKREGION(dbmp);
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish}
4496171313bed39e96f21bc2f9faf2868e267ae3girish