#include <afsconfig.h>
#include "../afs/param.h"
-RCSID("$Header: /tmp/cvstemp/openafs/src/afs/afs_osi.c,v 1.1.1.8 2002/01/22 19:47:59 hartmans Exp $");
+RCSID("$Header: /tmp/cvstemp/openafs/src/afs/afs_osi.c,v 1.1.1.9 2002/01/28 00:24:06 hartmans Exp $");
#include "../afs/sysincludes.h" /* Standard vendor system headers */
#include "../afs/afsincludes.h" /* Afs-based standard headers */
#endif /* AFS_TEXT_ENV */
+/* mask signals in afsds */
+void afs_osi_MaskSignals(){
+#ifdef AFS_LINUX22_ENV
+ osi_linux_mask();
+#endif
+}
+
+/* unmask signals in rxk listener */
+void afs_osi_UnmaskRxkSignals(){
+#ifdef AFS_LINUX22_ENV
+ osi_linux_unmask();
+#endif
+}
+
+/* register rxk listener proc info */
+void afs_osi_RxkRegister(){
+#ifdef AFS_LINUX22_ENV
+ osi_linux_rxkreg();
+#endif
+}
+
/* procedure for making our processes as invisible as we can */
void afs_osi_Invisible() {
-#ifndef AFS_AIX32_ENV
- /* called once per "kernel" lwp to make it invisible */
+#ifdef AFS_LINUX22_ENV
+ afs_osi_MaskSignals();
+#endif
#ifdef AFS_DEC_ENV
u.u_procp->p_type |= SSYS;
-#else
-#if defined(AFS_SUN5_ENV)
+#endif
+#if AFS_SUN5_ENV
curproc->p_flag |= SSYS;
-#else
-#if defined(AFS_SGI_ENV)
- vrelvm();
#endif
-#ifdef AFS_SUN_ENV
- relvm(u.u_procp); /* release all the resources */
-#endif
-#if defined(AFS_HPUX101_ENV)
+#if AFS_HPUX101_ENV
set_system_proc(u.u_procp);
-#else
+#endif
#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
/* maybe call init_process instead? */
current_proc()->p_flag |= P_SYSTEM;
-#else
-#if !defined(AFS_SGI64_ENV) && !defined(AFS_LINUX20_ENV)
- u.u_procp->p_flag |= SSYS;
-#endif /* AFS_SGI64_ENV */
-#endif
-#endif
-#endif
-#endif
#endif
+#if defined(AFS_SGI_ENV)
+ vrelvm();
+#endif /* AFS_SGI_ENV */
+
AFS_STATCNT(osi_Invisible);
}
#include <afsconfig.h>
#include "../afs/param.h"
-RCSID("$Header: /tmp/cvstemp/openafs/src/afs/afs_vcache.c,v 1.1.1.10 2002/01/22 19:48:01 hartmans Exp $");
+RCSID("$Header: /tmp/cvstemp/openafs/src/afs/afs_vcache.c,v 1.1.1.11 2002/01/28 00:24:08 hartmans Exp $");
#include "../afs/sysincludes.h" /*Standard vendor system headers*/
#include "../afs/afsincludes.h" /*AFS-based standard headers*/
} /*afs_RemoveVCB*/
-#if defined(AFS_LINUX22_ENV)
-/* afs_TryFlushDcacheChildren -- Shakes loose vcache references held by
- * children of the dentry
- * LOCKS -- Called with afs_xvcache write locked. Drops and reaquires
- * AFS_GLOCK, so it can call dput, which may call iput, but
- * keeps afs_xvcache exclusively.
- *
- * Tree traversal algorithm from fs/dcache.c: select_parent()
- */
-static void afs_TryFlushDcacheChildren(struct dentry *parent)
-{
- struct dentry *this_parent = parent;
- struct list_head *next;
-
- repeat:
- next = this_parent->d_subdirs.next;
- resume:
- while (next != &this_parent->d_subdirs) {
- struct list_head *tmp = next;
- struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
-
- next = tmp->next;
- if (!DCOUNT(dentry) && !dentry->d_inode) {
- DGET(dentry);
- DUNLOCK();
- AFS_GUNLOCK();
- d_drop(dentry);
- dput(dentry);
- AFS_GLOCK();
- DLOCK();
- goto repeat;
- }
-
- /*
- * Descend a level if the d_subdirs list is non-empty.
- */
- if (!list_empty(&dentry->d_subdirs)) {
- this_parent = dentry;
- goto repeat;
- }
- }
-
- /*
- * All done at this level ... ascend and resume the search.
- */
- if (this_parent != parent) {
- next = this_parent->d_child.next;
- this_parent = this_parent->d_parent;
- goto resume;
- }
-}
-
-/* afs_TryFlushDcache -- Shakes loose vcache references held by the Linux
- * dcache.
- *
- * LOCKS -- Called with afs_xvcache write locked. Drops and reaquires
- * AFS_GLOCK, so it can call dput, which may call iput, but
- * keeps afs_xvcache exclusively.
- */
-static void afs_TryFlushDcache(struct vcache *vcp)
-{
- struct inode *ip = (struct inode *) vcp;
-
- DLOCK();
- retry:
- if (!list_empty(&ip->i_dentry)) {
- struct list_head *cur, *head = &ip->i_dentry;
- cur = head;
- while ((cur = cur->next) != head) {
- struct dentry *dentry = list_entry(cur, struct dentry, d_alias);
-
- if (DCOUNT(dentry)) {
- afs_TryFlushDcacheChildren(dentry);
- }
-
- if (!DCOUNT(dentry)) {
- DGET(dentry);
- DUNLOCK();
- AFS_GUNLOCK();
- d_drop(dentry);
- dput(dentry);
- AFS_GLOCK();
- DLOCK();
- goto retry;
- }
- }
- DUNLOCK();
- }
-}
-#endif
-
/*
* afs_NewVCache
*
int code, fv_slept;
AFS_STATCNT(afs_NewVCache);
+#ifdef AFS_LINUX22_ENV
+ if (!freeVCList) {
+ /* Free some if possible. */
+ struct afs_q *tq, *uq;
+ int i; char *panicstr;
+ int vmax = 2 * afs_cacheStats;
+ int vn = VCACHE_FREE;
+
+ i = 0;
+ for(tq = VLRU.prev; tq != &VLRU && vn > 0; tq = uq) {
+ tvc = QTOV(tq);
+ uq = QPrev(tq);
+ if (tvc->states & CVFlushed)
+ refpanic ("CVFlushed on VLRU");
+ else if (i++ > vmax)
+ refpanic ("Exceeded pool of AFS vnodes(VLRU cycle?)");
+ else if (QNext(uq) != tq)
+ refpanic ("VLRU inconsistent");
+
+ if (tvc == afs_globalVp)
+ continue;
+
+ if ( VREFCOUNT(tvc) && tvc->opens == 0 ) {
+ struct inode *ip = (struct inode*)tvc;
+ if (list_empty(&ip->i_dentry)) {
+ vn --;
+ }
+ else {
+ struct list_head *cur;
+ struct list_head *head = &ip->i_dentry;
+ int all = 1;
+ restart:
+ DLOCK();
+ cur = head;
+ while ((cur = cur->next) != head) {
+ struct dentry *dentry = list_entry(cur, struct dentry, d_alias);
+ if (!DCOUNT(dentry)) {
+ AFS_GUNLOCK();
+ DGET(dentry);
+ DUNLOCK();
+ d_drop(dentry);
+ dput(dentry);
+ AFS_GLOCK();
+ goto restart;
+ }
+ else {
+ all = 0;
+ }
+ }
+ DUNLOCK();
+ if (all) vn --;
+ }
+ }
+ if (tq == uq) break;
+ }
+ }
+#endif /* AFS_LINUX22_ENV */
#ifdef AFS_OSF_ENV
#ifdef AFS_OSF30_ENV
if (afs_vcount >= afs_maxvcount)
continue; /* start over - may have raced. */
}
}
-#endif
-#if defined(AFS_LINUX22_ENV)
- if (tvc != afs_globalVp && VREFCOUNT(tvc) && tvc->opens == 0)
- afs_TryFlushDcache(tvc);
#endif
if (VREFCOUNT(tvc) == 0 && tvc->opens == 0
&& (tvc->states & CUnlinkedDel) == 0) {
INIT_LIST_HEAD(&ip->i_data.locked_pages);
INIT_LIST_HEAD(&ip->i_dirty_buffers);
#ifdef STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS
- INIT_LIST_HEAD(&inode->i_dirty_data_buffers);
+ INIT_LIST_HEAD(&ip->i_dirty_data_buffers);
#endif
#ifdef STRUCT_INODE_HAS_I_DEVICES
- INIT_LIST_HEAD(&inode->i_devices);
+ INIT_LIST_HEAD(&ip->i_devices);
#endif
ip->i_data.host = (void*) ip;
ip->i_mapping = &ip->i_data;