summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/swapfs/swap_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/swapfs/swap_vnops.c')
-rw-r--r--usr/src/uts/common/fs/swapfs/swap_vnops.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/usr/src/uts/common/fs/swapfs/swap_vnops.c b/usr/src/uts/common/fs/swapfs/swap_vnops.c
index 4e69206084..ec4ad4f3b2 100644
--- a/usr/src/uts/common/fs/swapfs/swap_vnops.c
+++ b/usr/src/uts/common/fs/swapfs/swap_vnops.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -167,7 +167,7 @@ swap_getapage(
int upgrade = 0;
SWAPFS_PRINT(SWAP_VOPS, "swap_getapage: vp %p, off %llx, len %lx\n",
- vp, off, len, 0, 0);
+ vp, off, len, 0, 0);
/*
* Until there is a call-back mechanism to cause SEGKP
@@ -247,8 +247,10 @@ again:
mutex_enter(ahm);
ap = swap_anon(vp, off);
- if (ap == NULL)
- panic("swap_getapage: null anon");
+ if (ap == NULL) {
+ panic("swap_getapage:"
+ " null anon");
+ }
if (ap->an_pvp == pvp &&
ap->an_poff == poff) {
@@ -298,7 +300,7 @@ again:
pvn_plist_init(pp, pl, plsz, off, PAGESIZE, rw);
}
TRACE_3(TR_FAC_SWAPFS, TR_SWAPFS_GETAPAGE,
- "swapfs getapage:pp %p vp %p off %llx", pp, vp, off);
+ "swapfs getapage:pp %p vp %p off %llx", pp, vp, off);
return (err);
}
@@ -340,7 +342,7 @@ swap_getconpage(
ASSERT(nreloc != NULL);
ASSERT(!SEG_IS_SEGKP(seg)); /* XXX for now not supported */
SWAPFS_PRINT(SWAP_VOPS, "swap_getconpage: vp %p, off %llx, len %lx\n",
- vp, off, len, 0, 0);
+ vp, off, len, 0, 0);
/*
* If we are not using a preallocated page then we know one already
@@ -384,7 +386,7 @@ swap_getconpage(
pl[1] = NULL;
if (page_pptonum(pp) &
(page_get_pagecnt(conpp->p_szc) - 1))
- cmn_err(CE_PANIC, "swap_getconpage: no root");
+ cmn_err(CE_PANIC, "swap_getconpage: no root");
}
return (err);
}
@@ -415,9 +417,27 @@ swap_getconpage(
"swap_getconpage: swap_getphysname failed!");
}
- if (pvp) {
- err = VOP_PAGEIO(pvp, pp, poff, PAGESIZE, B_READ, cr,
- NULL);
+ if (pvp != NULL) {
+ err = VOP_PAGEIO(pvp, pp, poff, PAGESIZE, B_READ,
+ cr, NULL);
+ if (err == 0) {
+ struct anon *ap;
+ kmutex_t *ahm;
+
+ ahm = &anonhash_lock[AH_LOCK(vp, off)];
+ mutex_enter(ahm);
+ ap = swap_anon(vp, off);
+ if (ap == NULL)
+ panic("swap_getconpage: null anon");
+ if (ap->an_pvp != pvp || ap->an_poff != poff)
+ panic("swap_getconpage: bad anon");
+
+ swap_phys_free(pvp, poff, PAGESIZE);
+ ap->an_pvp = NULL;
+ ap->an_poff = NULL;
+ hat_setmod(pp);
+ mutex_exit(ahm);
+ }
} else {
pagezero(pp, 0, PAGESIZE);
}
@@ -435,7 +455,7 @@ swap_getconpage(
ASSERT(pp->p_prev == pp);
TRACE_3(TR_FAC_SWAPFS, TR_SWAPFS_GETAPAGE,
- "swapfs getconpage:pp %p vp %p off %llx", pp, vp, off);
+ "swapfs getconpage:pp %p vp %p off %llx", pp, vp, off);
pl[0] = pp;
pl[1] = NULL;
@@ -552,7 +572,7 @@ swap_putpage(
pp = page_lookup(vp, io_off, SE_EXCL);
else
pp = page_lookup_nowait(vp, io_off,
- (flags & B_FREE) ? SE_EXCL : SE_SHARED);
+ (flags & B_FREE) ? SE_EXCL : SE_SHARED);
if (pp == NULL || pvn_getdirty(pp, flags) == 0)
io_len = PAGESIZE;
@@ -628,8 +648,8 @@ swap_putapage(
}
SWAPFS_PRINT(SWAP_PUTP,
- "swap_putapage: pp %p, vp %p, off %llx, flags %x\n",
- pp, vp, pp->p_offset, flags, 0);
+ "swap_putapage: pp %p, vp %p, off %llx, flags %x\n",
+ pp, vp, pp->p_offset, flags, 0);
ASSERT(PAGE_LOCKED(pp));
@@ -683,7 +703,7 @@ swap_putapage(
doff = off;
dlen = PAGESIZE;
if (err = swap_newphysname(vp, off, &doff, &dlen,
- &pvp, &poff)) {
+ &pvp, &poff)) {
swap_otherfail++;
swap_otherpages += btop(klsz);
hat_setmod(pp);
@@ -715,7 +735,7 @@ swap_putapage(
}
err = VOP_PAGEIO(klvp, pplist, klstart, klsz,
- B_WRITE | flags, cr, NULL);
+ B_WRITE | flags, cr, NULL);
if ((flags & B_ASYNC) == 0)
pvn_write_done(pp, ((err) ? B_ERROR : 0) | B_WRITE | flags);
@@ -727,8 +747,8 @@ swap_putapage(
}
out:
TRACE_4(TR_FAC_SWAPFS, TR_SWAPFS_PUTAPAGE,
- "swapfs putapage:vp %p klvp %p, klstart %lx, klsz %lx",
- vp, klvp, klstart, klsz);
+ "swapfs putapage:vp %p klvp %p, klstart %lx, klsz %lx",
+ vp, klvp, klstart, klsz);
if (err && err != ENOMEM)
cmn_err(CE_WARN, "swapfs_putapage: err %d\n", err);
if (lenp)