obsd-vattrs-20040125
[openafs.git] / src / afs / VNOPS / afs_vnop_attrs.c
index c669955..e2855ea 100644 (file)
@@ -71,7 +71,7 @@ afs_CopyOutAttrs(register struct vcache *avc, register struct vattr *attrs)
     }
 #if defined(AFS_DARWIN_ENV)
     {
-        extern u_int32_t afs_darwin_realmodes;
+       extern u_int32_t afs_darwin_realmodes;
        if (!afs_darwin_realmodes) {
            /* Mac OS X uses the mode bits to determine whether a file or
             * directory is accessible, and believes them, even though under
@@ -80,13 +80,13 @@ afs_CopyOutAttrs(register struct vcache *avc, register struct vattr *attrs)
             * conservatively.
             */
            if (S_ISDIR(attrs->va_mode)) {
-               /* all access bits need to be set for directories, since even
+               /* all access bits need to be set for directories, since even
                 * a mode 0 directory can still be used normally.
                 */
-               attrs->va_mode |= ACCESSPERMS;
+               attrs->va_mode |= ACCESSPERMS;
            } else {
-               /* for other files, replicate the user bits to group and other */
-               mode_t ubits = (attrs->va_mode & S_IRWXU) >> 6;
+               /* for other files, replicate the user bits to group and other */
+               mode_t ubits = (attrs->va_mode & S_IRWXU) >> 6;
                attrs->va_mode |= ubits | (ubits << 3);
            }
        }
@@ -105,7 +105,7 @@ afs_CopyOutAttrs(register struct vcache *avc, register struct vattr *attrs)
     attrs->va_fsid = avc->v.v_mount->m_stat.f_fsid.val[0];
 #else
 #ifdef AFS_DARWIN70_ENV
-    attrs->va_fsid = avc->v.v_mount->mnt_stat.f_fsid.val[0]; 
+    attrs->va_fsid = avc->v.v_mount->mnt_stat.f_fsid.val[0];
 #else /* ! AFS_DARWIN70_ENV */
     attrs->va_fsid = 1;
 #endif /* AFS_DARWIN70_ENV */
@@ -242,9 +242,9 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred)
     extern struct unixuser *afs_FindUser();
     struct unixuser *au;
     int inited = 0;
-    OSI_VC_CONVERT(avc)
+    OSI_VC_CONVERT(avc);
 
-       AFS_STATCNT(afs_getattr);
+    AFS_STATCNT(afs_getattr);
     afs_Trace2(afs_iclSetp, CM_TRACE_GETATTR, ICL_TYPE_POINTER, avc,
               ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->m.Length));
 
@@ -317,6 +317,14 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred)
                                     CMB_ALLOW_EXEC_AS_READ)) {
                    return EACCES;
                }
+#if 0
+/* The effect of the following is to force the NFS client to refetch the
+ * volume root every time, since the mtime changes.  For Solaris 9 NFSv3
+ * clients, this means looping forever, since for some reason (related
+ * to caching?) it wants the mtime to be consistent two reads in a row.
+ * Why are volume roots special???
+ * --jhutz 2-May-2004
+ */
                if (avc->mvstat == 2) {
 #if defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_AIX41_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
                    attrs->va_mtime.tv_nsec += ((++avc->xlatordv) * 1000);
@@ -324,6 +332,7 @@ afs_getattr(OSI_VC_DECL(avc), struct vattr *attrs, struct AFS_UCRED *acred)
                    attrs->va_mtime.tv_usec += ++avc->xlatordv;
 #endif
                }
+#endif
            }
            if ((au = afs_FindUser(treq.uid, -1, READ_LOCK))) {
                register struct afs_exporter *exporter = au->exporter;
@@ -389,13 +398,15 @@ afs_VAttrToAS(register struct vcache *avc, register struct vattr *av,
 #if    defined(AFS_AIX_ENV)
 /* Boy, was this machine dependent bogosity hard to swallow????.... */
     if (av->va_mode != -1) {
-#else
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
+#elif  defined(AFS_LINUX22_ENV)
+    if (av->va_mask & ATTR_MODE) {
+#elif  defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
     if (av->va_mask & AT_MODE) {
+#elif  defined(AFS_XBSD_ENV)
+    if (av->va_mode != (mode_t)VNOVAL) {
 #else
     if (av->va_mode != ((unsigned short)-1)) {
 #endif
-#endif
        mask |= AFS_SETMODE;
        as->UnixModeBits = av->va_mode & 0xffff;
        if (avc->states & CForeign) {
@@ -404,43 +415,51 @@ afs_VAttrToAS(register struct vcache *avc, register struct vattr *av,
            ReleaseWriteLock(&avc->lock);
        }
     }
-#if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
+#if defined(AFS_LINUX22_ENV)
+    if (av->va_mask & ATTR_GID) {
+#elif defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
     if (av->va_mask & AT_GID) {
-#else
-#if (defined(AFS_HPUX_ENV) || defined(AFS_SUN_ENV))
+#elif (defined(AFS_HPUX_ENV) || defined(AFS_SUN_ENV))
 #if    defined(AFS_HPUX102_ENV)
     if (av->va_gid != GID_NO_CHANGE) {
 #else
     if (av->va_gid != ((unsigned short)-1)) {
 #endif
+#elif  defined(AFS_XBSD_ENV)
+    if (av->va_gid != (gid_t)VNOVAL) {
 #else
     if (av->va_gid != -1) {
-#endif
-#endif /* AFS_SUN5_ENV */
+#endif /* AFS_LINUX22_ENV */
        mask |= AFS_SETGROUP;
        as->Group = av->va_gid;
     }
-#if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
+#if defined(AFS_LINUX22_ENV)
+    if (av->va_mask & ATTR_UID) {
+#elif defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
     if (av->va_mask & AT_UID) {
-#else
-#if (defined(AFS_HPUX_ENV) || defined(AFS_SUN_ENV))
+#elif (defined(AFS_HPUX_ENV) || defined(AFS_SUN_ENV))
 #if    defined(AFS_HPUX102_ENV)
     if (av->va_uid != UID_NO_CHANGE) {
+#elif  defined(AFS_XBSD_ENV)
+    if (av->va_uid != (uid_t)VNOVAL) {
 #else
     if (av->va_uid != ((unsigned short)-1)) {
 #endif
 #else
     if (av->va_uid != -1) {
-#endif
-#endif /* AFS_SUN5_ENV */
+#endif /* AFS_LINUX22_ENV */
        mask |= AFS_SETOWNER;
        as->Owner = av->va_uid;
     }
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
+#if    defined(AFS_LINUX22_ENV)
+    if (av->va_mask & ATTR_MTIME) {
+#else
+#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
     if (av->va_mask & AT_MTIME) {
 #else
     if (av->va_mtime.tv_sec != -1) {
 #endif
+#endif
        mask |= AFS_SETMODTIME;
 #ifndef        AFS_SGI_ENV
 #if    defined(AFS_SUN5_ENV) || defined(AFS_AIX41_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
@@ -474,9 +493,9 @@ afs_setattr(OSI_VC_DECL(avc), register struct vattr *attrs,
     struct AFSStoreStatus astat;
     register afs_int32 code;
     struct afs_fakestat_state fakestate;
-    OSI_VC_CONVERT(avc)
+    OSI_VC_CONVERT(avc);
 
-       AFS_STATCNT(afs_setattr);
+    AFS_STATCNT(afs_setattr);
 #if defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
     afs_Trace4(afs_iclSetp, CM_TRACE_SETATTR, ICL_TYPE_POINTER, avc,
               ICL_TYPE_INT32, attrs->va_mask, ICL_TYPE_OFFSET,
@@ -517,19 +536,17 @@ afs_setattr(OSI_VC_DECL(avc), register struct vattr *attrs,
      * path (unlike BSD or SUNOS), so we skip this check for Ultrix.
      *
      */
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
+#if    defined(AFS_LINUX22_ENV)
+    if (attrs->va_mask & ATTR_SIZE) {
+#elif  defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
     if (attrs->va_mask & AT_SIZE) {
-#else
-#ifdef AFS_OSF_ENV
+#elif  defined(AFS_OSF_ENV) || defined(AFS_XBSD_ENV)
     if (attrs->va_size != VNOVAL) {
-#else
-#ifdef AFS_AIX41_ENV
+#elif  defined(AFS_AIX41_ENV)
     if (attrs->va_size != -1) {
 #else
     if (attrs->va_size != ~0) {
 #endif
-#endif
-#endif
        if (!afs_AccessOK(avc, PRSFS_WRITE, &treq, DONT_CHECK_MODE_BITS)) {
            code = EACCES;
            goto done;
@@ -551,15 +568,15 @@ afs_setattr(OSI_VC_DECL(avc), register struct vattr *attrs,
 #if defined(AFS_SGI_ENV)
     AFS_RWLOCK((vnode_t *) avc, VRWLOCK_WRITE);
 #endif
-#if    defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV) || defined(AFS_LINUX22_ENV)
+#if    defined(AFS_LINUX22_ENV)
+    if (attrs->va_mask & ATTR_SIZE) {
+#elif  defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
     if (attrs->va_mask & AT_SIZE) {
-#else
-#if    defined(AFS_OSF_ENV)
+#elif  defined(AFS_OSF_ENV) || defined(AFS_XBSD_ENV)
     if (attrs->va_size != VNOVAL) {
-#else /* AFS_OSF_ENV */
+#else
     if (attrs->va_size != -1) {
 #endif
-#endif
        afs_size_t tsize = attrs->va_size;
        ObtainWriteLock(&avc->lock, 128);
        avc->states |= CDirty;