solars-sparc32-largefile-20051011
[openafs.git] / src / afs / VNOPS / afs_vnop_strategy.c
index feb6017..dc3dde6 100644 (file)
  */
 
 #include <afsconfig.h>
-#include "../afs/param.h"
+#include "afs/param.h"
 
-RCSID("$Header$");
+RCSID
+    ("$Header$");
 
 #if !defined(AFS_HPUX_ENV) && !defined(AFS_SGI_ENV) && !defined(AFS_LINUX20_ENV)
 
-#include "../afs/sysincludes.h"        /* Standard vendor system headers */
-#include "../afs/afsincludes.h"        /* Afs-based standard headers */
-#include "../afs/afs_stats.h" /* statistics */
-#include "../afs/afs_cbqueue.h"
-#include "../afs/nfsclient.h"
-#include "../afs/afs_osidnlc.h"
-
+#include "afs/sysincludes.h"   /* Standard vendor system headers */
+#include "afsincludes.h"       /* Afs-based standard headers */
+#include "afs/afs_stats.h"     /* statistics */
+#include "afs/afs_cbqueue.h"
+#include "afs/nfsclient.h"
+#include "afs/afs_osidnlc.h"
 
 
 
+int
 #if    defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
 afs_ustrategy(abp, credp)
-    struct AFS_UCRED *credp;
+     struct AFS_UCRED *credp;
 #else
 afs_ustrategy(abp)
 #endif
-    register struct buf *abp; {
+     register struct buf *abp;
+{
     register afs_int32 code;
     struct uio tuio;
     register struct vcache *tvc = VTOAFS(abp->b_vp);
@@ -47,9 +49,6 @@ afs_ustrategy(abp)
     struct AFS_UCRED *credp = u.u_cred;
 #endif
 #endif
-#if    defined(AFS_SUN_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-    int async = abp->b_flags & B_ASYNC;
-#endif
     struct iovec tiovec[1];
 
     AFS_STATCNT(afs_ustrategy);
@@ -58,7 +57,7 @@ afs_ustrategy(abp)
      * So that it won't change while reading it
      */
     ObtainReadLock(&tvc->lock);
-    if (tvc->credp) {  
+    if (tvc->credp) {
        credp = tvc->credp;
        crhold(credp);
     } else {
@@ -67,22 +66,27 @@ afs_ustrategy(abp)
     ReleaseReadLock(&tvc->lock);
     osi_Assert(credp);
 #endif
+#ifdef AFS_FBSD50_ENV
+    if (abp->b_iocmd == BIO_READ) {
+#else
     if ((abp->b_flags & B_READ) == B_READ) {
+#endif
        /* read b_bcount bytes into kernel address b_un.b_addr starting
-           at byte DEV_BSIZE * b_blkno.  Bzero anything we can't read,
-           and finally call iodone(abp).  File is in abp->b_vp.  Credentials
-           are from u area??
-       */
+        * at byte DEV_BSIZE * b_blkno.  Bzero anything we can't read,
+        * and finally call iodone(abp).  File is in abp->b_vp.  Credentials
+        * are from u area??
+        */
        tuio.afsio_iov = tiovec;
        tuio.afsio_iovcnt = 1;
-#if    defined(AFS_SUN_ENV) || defined(AFS_ALPHA_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_XBSD_ENV)
+#if    defined(AFS_OSF_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_XBSD_ENV)
 #ifdef AFS_64BIT_CLIENT
+#ifdef AFS_SUN5_ENV
+       tuio.afsio_offset = (afs_offs_t) ldbtob(abp->b_lblkno);
+#else
        tuio.afsio_offset = (afs_offs_t) dbtob(abp->b_blkno);
+#endif
 #else /* AFS_64BIT_CLIENT */
        tuio.afsio_offset = (u_int) dbtob(abp->b_blkno);
-#if    defined(AFS_SUN5_ENV)
-       tuio._uio_offset._p._u = 0;
-#endif
 #endif /* AFS_64BIT_CLIENT */
 #else
        tuio.afsio_offset = DEV_BSIZE * abp->b_blkno;
@@ -99,7 +103,7 @@ afs_ustrategy(abp)
 #endif /* AFS_XBSD_ENV */
        tiovec[0].iov_len = abp->b_bcount;
        /* are user's credentials valid here?  probably, but this
-            sure seems like the wrong things to do. */
+        * sure seems like the wrong things to do. */
 #if    defined(AFS_SUN5_ENV)
        code = afs_nlrdwr(VTOAFS(abp->b_vp), &tuio, UIO_READ, 0, credp);
 #else
@@ -108,9 +112,11 @@ afs_ustrategy(abp)
        if (code == 0) {
            if (tuio.afsio_resid > 0)
 #if defined(AFS_XBSD_ENV)
-               memset(abp->b_saveaddr + abp->b_bcount - tuio.afsio_resid, 0, tuio.afsio_resid);
+               memset(abp->b_saveaddr + abp->b_bcount - tuio.afsio_resid, 0,
+                      tuio.afsio_resid);
 #else
-               memset(abp->b_un.b_addr + abp->b_bcount - tuio.afsio_resid, 0, tuio.afsio_resid);
+               memset(abp->b_un.b_addr + abp->b_bcount - tuio.afsio_resid, 0,
+                      tuio.afsio_resid);
 #endif /* AFS_XBSD_ENV */
 #ifdef AFS_AIX32_ENV
            /*
@@ -121,25 +127,25 @@ afs_ustrategy(abp)
            if (dbtob(abp->b_blkno) + abp->b_bcount > tvc->m.Length) {
                if ((abp->b_flags & B_PFSTORE) == 0) {
                    AFS_GUNLOCK();
-                   vm_protectp(tvc->vmh, dbtob(abp->b_blkno)/PAGESIZE,
-                               abp->b_bcount/PAGESIZE, RDONLY);
+                   vm_protectp(tvc->segid, dbtob(abp->b_blkno) / PAGESIZE,
+                               abp->b_bcount / PAGESIZE, RDONLY);
                    AFS_GLOCK();
                }
            }
 #endif
        }
-    }
-    else {
+    } else {
        tuio.afsio_iov = tiovec;
        tuio.afsio_iovcnt = 1;
-#if    defined(AFS_SUN_ENV) || defined(AFS_ALPHA_ENV) || defined(AFS_SUN5_ENV)
+#if    defined(AFS_OSF_ENV) || defined(AFS_SUN5_ENV)
 #ifdef AFS_64BIT_CLIENT
+#ifdef AFS_SUN5_ENV
+       tuio.afsio_offset = (afs_offs_t) ldbtob(abp->b_lblkno);
+#else
        tuio.afsio_offset = (afs_offs_t) dbtob(abp->b_blkno);
+#endif
 #else /* AFS_64BIT_CLIENT */
        tuio.afsio_offset = (u_int) dbtob(abp->b_blkno);
-#ifdef AFS_SUN5_ENV
-       tuio._uio_offset._p._u = 0;
-#endif
 #endif /* AFS_64BIT_CLIENT */
 #ifdef AFS_SUN5_ENV
 #ifdef AFS_SUN59_ENV
@@ -155,16 +161,18 @@ afs_ustrategy(abp)
 #ifdef AFS_UIOFMODE
        tuio.afsio_fmode = 0;
 #endif
-#ifdef AFS_AIX32_ENV   
+#ifdef AFS_AIX32_ENV
        /*
         * XXX It this really right? Ideally we should always write block size multiple
         * and not any arbitrary size, right? XXX
         */
        len = MIN(len, tvc->m.Length - dbtob(abp->b_blkno));
 #endif
-#ifdef AFS_ALPHA_ENV
-       len = MIN(abp->b_bcount, (VTOAFS(abp->b_vp))->m.Length - dbtob(abp->b_blkno));
-#endif /* AFS_ALPHA_ENV */
+#ifdef AFS_OSF_ENV
+       len =
+           MIN(abp->b_bcount,
+               (VTOAFS(abp->b_vp))->m.Length - dbtob(abp->b_blkno));
+#endif /* AFS_OSF_ENV */
        tuio.afsio_resid = len;
 #if defined(AFS_XBSD_ENV)
        tiovec[0].iov_base = abp->b_saveaddr;
@@ -173,40 +181,46 @@ afs_ustrategy(abp)
 #endif /* AFS_XBSD_ENV */
        tiovec[0].iov_len = len;
        /* are user's credentials valid here?  probably, but this
-            sure seems like the wrong things to do. */
+        * sure seems like the wrong things to do. */
 #if    defined(AFS_SUN5_ENV)
        code = afs_nlrdwr(VTOAFS(abp->b_vp), &tuio, UIO_WRITE, 0, credp);
 #else
        code = afs_rdwr(VTOAFS(abp->b_vp), &tuio, UIO_WRITE, 0, credp);
 #endif
     }
-#if    !defined(AFS_AIX32_ENV) && !defined(AFS_SUN5_ENV)
+
 #if defined(AFS_DUX40_ENV) || defined (AFS_XBSD_ENV)
     if (code) {
        abp->b_error = code;
+#if !defined(AFS_FBSD50_ENV)
        abp->b_flags |= B_ERROR;
+#endif
     }
+#endif
+
+#if defined(AFS_AIX32_ENV)
+    crfree(credp);
+#elif defined(AFS_DUX40_ENV)
     biodone(abp);
-#if defined(AFS_DUX40_ENV)
     if (code && !(abp->b_flags & B_READ)) {
        /* prevent ubc from retrying writes */
        AFS_GUNLOCK();
        ubc_invalidate(AFSTOV(tvc)->v_object,
-                      (vm_offset_t)dbtob(abp->b_blkno),
-                      PAGE_SIZE, B_INVAL);
+                      (vm_offset_t) dbtob(abp->b_blkno), PAGE_SIZE, B_INVAL);
        AFS_GLOCK();
     }
-#endif
-#else  /* AFS_DUX40_ENV */
+#elif defined(AFS_FBSD60_ENV)
+    (*abp->b_iodone)(abp);
+#elif defined(AFS_FBSD50_ENV)
+    biodone(&abp->b_io);
+#elif defined(AFS_XBSD_ENV)
+    biodone(abp);
+#elif !defined(AFS_SUN5_ENV)
     iodone(abp);
-#endif /* AFS_DUX40_ENV */
-#endif
-#ifdef AFS_AIX32_ENV
-    crfree(credp);
 #endif
+
     afs_Trace3(afs_iclSetp, CM_TRACE_STRATEGYDONE, ICL_TYPE_POINTER, tvc,
-              ICL_TYPE_INT32, code,
-              ICL_TYPE_LONG, tuio.afsio_resid);
+              ICL_TYPE_INT32, code, ICL_TYPE_LONG, tuio.afsio_resid);
     return code;
 }