2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
11 #include "afs/param.h"
14 #include "afs/sysincludes.h" /* Standard vendor system headers */
15 #include "afsincludes.h" /* Afs-based standard headers */
16 #include "afs/afs_stats.h" /* statistics */
18 /* Try to discard pages, in order to recycle a vcache entry.
20 * We also make some sanity checks: ref count, open count, held locks.
22 * We also do some non-VM-related chores, such as releasing the cred pointer
23 * (for AIX and Solaris) and releasing the gnode (for AIX).
25 * Locking: afs_xvcache lock is held. It must not be dropped.
28 osi_VM_FlushVCache(struct vcache
*avc
)
30 if (avc
->vrefCount
!= 0)
36 /* Just in case someone is still referring to the vnode we
37 * give up trying to get rid of this guy */
38 if (avc
->vrefCount
|| CheckLock(&avc
->lock
) || LockWaiters(&avc
->lock
))
43 vms_delete(avc
->segid
);
45 avc
->segid
= avc
->vmh
= NULL
;
53 /* Free the alloced gnode that was accompanying the vcache's vnode */
54 aix_gnode_rele(AFSTOV(avc
));
59 /* Try to store pages to cache, in order to store a file back to the server.
61 * Locking: the vcache entry's lock is held. It will usually be dropped and
65 osi_VM_StoreAllSegments(struct vcache
*avc
)
69 * The execsOrWriters test is done so that we don't thrash on
70 * the vm_writep call below. We only initiate a pageout of the
71 * dirty vm pages on the last store...
72 * this is strictly a pragmatic decision, and _does_ break the
73 * advertised AFS consistency semantics. Without this hack,
74 * AIX systems panic under heavy load. I consider the current
75 * behavior a bug introduced to hack around a worse bug. XXX
77 * Removed do_writep governing sync'ing behavior.
79 ReleaseWriteLock(&avc
->lock
); /* XXX */
81 vm_writep(avc
->segid
, 0, MAXFSIZE
/ PAGESIZE
- 1);
82 vms_iowait(avc
->segid
);
84 ObtainWriteLock(&avc
->lock
, 93); /* XXX */
86 * The following is necessary because of the following
87 * asynchronicity: We open a file, write to it and
89 * if CCore flag is set, we clear it and do the extra
90 * decrement ourselves now.
91 * If we're called by the CCore clearer, the CCore flag
92 * will already be clear, so we don't have to worry about
94 * avc was "VN_HELD" and "crheld" when CCore was set in
97 if (avc
->f
.states
& CCore
) {
98 avc
->f
.states
&= ~CCore
;
100 avc
->execsOrWriters
--;
101 AFS_RELE(AFSTOV(avc
));
102 crfree((struct ucred
*)avc
->linkData
);
103 avc
->linkData
= NULL
;
108 /* Try to invalidate pages, for "fs flush" or "fs flushv"; or
109 * try to free pages, when deleting a file.
111 * Locking: the vcache entry's lock is held. It may be dropped and
114 * Since we drop and re-obtain the lock, we can't guarantee that there won't
115 * be some pages around when we return, newly created by concurrent activity.
118 osi_VM_TryToSmush(struct vcache
*avc
, afs_ucred_t
*acred
, int sync
)
121 ReleaseWriteLock(&avc
->lock
);
123 vm_flushp(avc
->segid
, 0, MAXFSIZE
/ PAGESIZE
- 1);
124 vms_iowait(avc
->segid
); /* XXX Wait?? XXX */
126 ObtainWriteLock(&avc
->lock
, 60);
130 /* Purge VM for a file when its callback is revoked.
132 * Locking: No lock is held, not even the global lock.
135 osi_VM_FlushPages(struct vcache
*avc
, afs_ucred_t
*credp
)
138 vm_flushp(avc
->segid
, 0, MAXFSIZE
/ PAGESIZE
- 1);
140 * XXX We probably don't need to wait but better be safe XXX
142 vms_iowait(avc
->segid
);
146 /* Purge pages beyond end-of-file, when truncating a file.
148 * Locking: no lock is held, not even the global lock.
149 * activeV is raised. This is supposed to block pageins, but at present
150 * it only works on Solaris.
153 osi_VM_Truncate(struct vcache
*avc
, int alen
, afs_ucred_t
*acred
)
156 int firstpage
= (alen
+ PAGESIZE
- 1) / PAGESIZE
;
157 vm_releasep(avc
->segid
, firstpage
, MAXFSIZE
/ PAGESIZE
- firstpage
);
158 vms_iowait(avc
->segid
); /* Do we need this? */