#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;
#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_ */
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
#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
#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 */