]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/ufs/ffs/ffs_vfsops.c
xnu-1228.15.4.tar.gz
[apple/xnu.git] / bsd / ufs / ffs / ffs_vfsops.c
index a9e787a49cd772258d6dca729827349d34dc4e62..2214f3753587aa3de5edb56ffa41ecd675f5a150 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -93,7 +93,7 @@
 #include <ufs/ffs/ffs_extern.h>
 #if REV_ENDIAN_FS
 #include <ufs/ufs/ufs_byte_order.h>
-#include <architecture/byte_order.h>
+#include <libkern/OSByteOrder.h>
 #endif /* REV_ENDIAN_FS */
 
 int ffs_sbupdate(struct ufsmount *, int);
@@ -235,9 +235,10 @@ ffs_mount(struct mount *mp, vnode_t devvp, __unused user_addr_t data,  vfs_conte
                        return(0);
                }
        }
-       if ((mp->mnt_flag & MNT_UPDATE) == 0)
+       if ((mp->mnt_flag & MNT_UPDATE) == 0) {
+               ufs_ihashinit();
                error = ffs_mountfs(devvp, mp, context);
-       else {
+       else {
                if (devvp != ump->um_devvp)
                        error = EINVAL; /* needs translation */
        }
@@ -538,10 +539,6 @@ ffs_mountfs(devvp, mp, context)
                error = EINVAL;
                goto out;
        }
-        /*
-         * Buffer cache does not handle multiple pages in a buf when
-
 
        /*
         * Buffer cache does not handle multiple pages in a buf when
@@ -984,7 +981,7 @@ ffs_vfs_getattr(mp, fsap, context)
                        length = ulp->ul_namelen;
 #if REV_ENDIAN_FS
                        if (mp->mnt_flag & MNT_REVEND)
-                               length = NXSwapShort(length);
+                               length = OSSwapInt16(length);
 #endif
                        if (length > 0 && length <= UFS_MAX_LABEL_NAME) {
                                bcopy(ulp->ul_name, fsap->f_vol_name, length);
@@ -1004,7 +1001,8 @@ ffs_vfs_getattr(mp, fsap, context)
                    VOL_CAP_FMT_SPARSE_FILES |
                    VOL_CAP_FMT_CASE_SENSITIVE |
                    VOL_CAP_FMT_CASE_PRESERVING |
-                   VOL_CAP_FMT_FAST_STATFS ;
+                   VOL_CAP_FMT_FAST_STATFS |
+                   VOL_CAP_FMT_HIDDEN_FILES ;
                fsap->f_capabilities.capabilities[VOL_CAPABILITIES_INTERFACES]
                    = VOL_CAP_INT_NFSEXPORT |
                    VOL_CAP_INT_VOL_RENAME |
@@ -1028,7 +1026,9 @@ ffs_vfs_getattr(mp, fsap, context)
                    VOL_CAP_FMT_CASE_SENSITIVE |
                    VOL_CAP_FMT_CASE_PRESERVING |
                    VOL_CAP_FMT_FAST_STATFS |
-                   VOL_CAP_FMT_2TB_FILESIZE;
+                   VOL_CAP_FMT_2TB_FILESIZE |
+                   VOL_CAP_FMT_OPENDENYMODES |
+                   VOL_CAP_FMT_HIDDEN_FILES ;
                fsap->f_capabilities.valid[VOL_CAPABILITIES_INTERFACES] =
                    VOL_CAP_INT_SEARCHFS |
                    VOL_CAP_INT_ATTRLIST |
@@ -1039,7 +1039,8 @@ ffs_vfs_getattr(mp, fsap, context)
                    VOL_CAP_INT_ALLOCATE |
                    VOL_CAP_INT_VOL_RENAME |
                    VOL_CAP_INT_ADVLOCK |
-                   VOL_CAP_INT_FLOCK ;
+                   VOL_CAP_INT_FLOCK |
+                   VOL_CAP_INT_MANLOCK;
                fsap->f_capabilities.valid[VOL_CAPABILITIES_RESERVED1] = 0;
                fsap->f_capabilities.valid[VOL_CAPABILITIES_RESERVED2] = 0;
 
@@ -1112,14 +1113,15 @@ ffs_vfs_setattr(mp, fsap, context)
 
                /* Copy new name over existing name */
                ulp->ul_namelen = strlen(fsap->f_vol_name);
-#if REV_ENDIAN_FS
-               if (mp->mnt_flag & MNT_REVEND)
-                       ulp->ul_namelen = NXSwapShort(ulp->ul_namelen);
-#endif
                bcopy(fsap->f_vol_name, ulp->ul_name, ulp->ul_namelen);
                ulp->ul_name[UFS_MAX_LABEL_NAME - 1] = '\0';
                ulp->ul_name[ulp->ul_namelen] = '\0';
 
+#if REV_ENDIAN_FS
+               if (mp->mnt_flag & MNT_REVEND)
+                       ulp->ul_namelen = OSSwapInt16(ulp->ul_namelen);
+#endif
+
                /* Update the checksum */
                ulp->ul_checksum = 0;
                ulp->ul_checksum = ul_cksum(ulp, sizeof(*ulp));
@@ -1461,21 +1463,22 @@ ffs_fhtovp(mp, fhlen, fhp, vpp, context)
        struct vnode *nvp;
        struct fs *fs;
        int error;
+       ino_t     ino;
 
        if (fhlen < (int)sizeof(struct ufid))
                return (EINVAL);
        ufhp = (struct ufid *)fhp;
        fs = VFSTOUFS(mp)->um_fs;
-       if (ufhp->ufid_ino < ROOTINO ||
-           ufhp->ufid_ino >= fs->fs_ncg * fs->fs_ipg)
+       ino = ntohl(ufhp->ufid_ino);
+       if (ino < ROOTINO || ino >= fs->fs_ncg * fs->fs_ipg)
                return (ESTALE);
-       error = ffs_vget_internal(mp, ufhp->ufid_ino, &nvp, NULL, NULL, 0, 1);
+       error = ffs_vget_internal(mp, ino, &nvp, NULL, NULL, 0, 1);
        if (error) {
                *vpp = NULLVP;
                return (error);
        }
        ip = VTOI(nvp);
-       if (ip->i_mode == 0 || ip->i_gen != ufhp->ufid_gen) {
+       if (ip->i_mode == 0 || ip->i_gen != ntohl(ufhp->ufid_gen)) {
                vnode_put(nvp);
                *vpp = NULLVP;
                return (ESTALE);
@@ -1502,8 +1505,8 @@ ffs_vptofh(vp, fhlenp, fhp, context)
                return (EOVERFLOW);
        ip = VTOI(vp);
        ufhp = (struct ufid *)fhp;
-       ufhp->ufid_ino = ip->i_number;
-       ufhp->ufid_gen = ip->i_gen;
+       ufhp->ufid_ino = htonl(ip->i_number);
+       ufhp->ufid_gen = htonl(ip->i_gen);
        *fhlenp = sizeof(struct ufid);
        return (0);
 }
@@ -1629,7 +1632,7 @@ ffs_sbupdate(mp, waitfor)
        *  before writing
        */
        if (rev_endian) {
-               dfs->fs_maxfilesize = NXSwapLongLong(mp->um_savedmaxfilesize);          /* XXX */
+               dfs->fs_maxfilesize = OSSwapInt64(mp->um_savedmaxfilesize);             /* XXX */
        } else {
 #endif /* REV_ENDIAN_FS */
                dfs->fs_maxfilesize = mp->um_savedmaxfilesize;  /* XXX */