simplification-of-code-in-cache-manager-to-make-dux-advfs-support-simpler-20010315
authorJohan Danielsson <joda@pdc.kth.se>
Thu, 15 Mar 2001 17:43:11 +0000 (17:43 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 15 Mar 2001 17:43:11 +0000 (17:43 +0000)
with advfs you can't VTOI inodes so provide a wrapper function for dux to ease
this problem

src/afs/DUX/osi_inode.c
src/afs/afs.h
src/afs/afs_dcache.c
src/afs/afs_init.c

index 0679b2a..6bdf32b 100644 (file)
 #include "../afs/afs_stats.h" /* statistics stuff */
 #include <ufs/ufsmount.h>
 
+/* given a vnode, return the `inode number'; if it's a UFS vnode just
+   return the i_number from the in kernel inode struct, if not stat
+   the file to get the inumber from there */
+afs_uint32
+osi_vnodeToInumber(struct vnode *vnode)
+{
+    int error;
+    struct vattr attr;
+
+    /* use faster version with UFS */
+    if(vnode->v_tag == VT_UFS)
+       return VTOI(vnode)->i_number;
+    /* otherwise stat the file */
+    VOP_GETATTR(vnode, &attr, NULL, error);
+    if(error)
+       osi_Panic("VOP_GETATTR = %d", error);
+    return attr.va_fileid;
+}
+
+/* return the id of the device containing the file */
+afs_uint32
+osi_vnodeToDev(struct vnode *vnode)
+{
+    int error;
+    struct vattr attr;
+
+    /* use faster version with UFS */
+    if(vnode->v_tag == VT_UFS)
+       return VTOI(vnode)->i_dev;
+    /* otherwise stat the file */
+    VOP_GETATTR(vnode, &attr, NULL, error);
+    if(error)
+       osi_Panic("VOP_GETATTR = %d", error);
+    return attr.va_rdev;
+}
+
 getinode(fs, dev, inode, ipp, perror)
      struct mount *fs;
      struct inode **ipp;
index 12e3a5a..82e69fd 100644 (file)
@@ -1062,5 +1062,31 @@ extern int afs_norefpanic;
 #define VN_UNLOCK(vp)           simple_unlock(&(vp)->v_lock)
 #endif
 
+/* get a file's serial number from a vnode */
+#ifndef afs_vnodeToInumber
+#if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS)
+#define afs_vnodeToInumber(V) VnodeToIno(V)
+#else
+#ifdef AFS_DECOSF_ENV
+#define afs_vnodeToInumber(V) osi_vnodeToInumber(V)
+#else
+#define afs_vnodeToInumber(V) (VTOI(V)->i_number)
+#endif /* AFS_DECOSF_ENV */
+#endif /* AFS_SGI62_ENV */
+#endif
+
+/* get a file's device number from a vnode */
+#ifndef afs_vnodeToDev
+#if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS)
+#define afs_vnodeToDev(V) VnodeToDev(V)
+#else
+#ifdef AFS_DECOSF_ENV
+#define afs_vnodeToDev(V) osi_vnodeToDev(V)
+#else
+#define afs_vnodeToDev(V) (VTOI(V)->i_dev)
+#endif /* AFS_DECOSF_ENV */
+#endif /* AFS_SGI62_ENV */
+#endif
+
 #endif /* _AFS_H_ */
 
index 56c5c83..9f264d6 100644 (file)
@@ -2473,11 +2473,7 @@ int afs_InitCacheFile(afile, ainode)
        tdc->f.inode = VTOI(filevp->d_inode)->i_number;
        dput(filevp);
 #else
-#if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS)
-       tdc->f.inode = VnodeToIno(filevp);
-#else
-       tdc->f.inode = VTOI(filevp)->i_number;
-#endif
+       tdc->f.inode = afs_vnodeToInumber(filevp);
 #ifdef AFS_DEC_ENV
        grele(filevp);
 #else
index 765f566..84fbc7b 100644 (file)
@@ -325,11 +325,7 @@ afs_InitVolumeInfo(afile)
 #else
     code = gop_lookupname(afile, AFS_UIOSYS, 0, (struct vnode **) 0, &filevp);
     if (code) return ENOENT;
-#if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS)
-    fce.inode = volumeInode = VnodeToIno(filevp);
-#else
-    fce.inode = volumeInode = VTOI(filevp)->i_number;
-#endif
+    fce.inode = volumeInode = afs_vnodeToInumber(filevp);
 #ifdef AFS_DEC_ENV
     grele(filevp);
 #else
@@ -449,16 +445,13 @@ afs_InitCacheInfo(afile)
 #endif
     }
 #ifdef AFS_LINUX20_ENV
-      cacheInode = filevp->i_ino;
-      afs_cacheSBp = filevp->i_sb;
+    cacheInode = filevp->i_ino;
+    afs_cacheSBp = filevp->i_sb;
 #else
+    cacheInode = afs_vnodeToInumber(filevp);
+    cacheDev.dev = afs_vnodeToDev(filevp);
 #if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS)
     afs_InitDualFSCacheOps(filevp);
-    cacheInode = VnodeToIno(filevp);
-    cacheDev.dev = VnodeToDev(filevp);
-#else
-    cacheInode = VTOI(filevp)->i_number;
-    cacheDev.dev = VTOI(filevp)->i_dev;
 #endif
     afs_cacheVfsp = filevp->v_vfsp;
 #endif /* AFS_LINUX20_ENV */