1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #pragma ident "%Z%%M% %I% %E% SMI" 27 28 #include <sys/zfs_context.h> 29 #include <sys/vfs.h> 30 #include <sys/fs/zfs.h> 31 #include <sys/zfs_znode.h> 32 #include <sys/zfs_acl.h> 33 34 void 35 zfs_oldace_byteswap(ace_t *ace, int ace_cnt) 36 { 37 int i; 38 39 for (i = 0; i != ace_cnt; i++, ace++) { 40 ace->a_who = BSWAP_32(ace->a_who); 41 ace->a_access_mask = BSWAP_32(ace->a_access_mask); 42 ace->a_flags = BSWAP_16(ace->a_flags); 43 ace->a_type = BSWAP_16(ace->a_type); 44 } 45 } 46 47 /* 48 * swap ace_t and ace_oject_t 49 */ 50 void 51 zfs_ace_byteswap(void *buf, size_t size, boolean_t zfs_layout) 52 { 53 caddr_t end; 54 caddr_t ptr; 55 zfs_ace_t *zacep; 56 ace_t *acep; 57 uint16_t entry_type; 58 size_t entry_size; 59 int ace_type; 60 61 end = (caddr_t)buf + size; 62 ptr = buf; 63 64 while (ptr < end) { 65 if (zfs_layout) { 66 zacep = (zfs_ace_t *)ptr; 67 zacep->z_hdr.z_access_mask = 68 BSWAP_32(zacep->z_hdr.z_access_mask); 69 zacep->z_hdr.z_flags = BSWAP_16(zacep->z_hdr.z_flags); 70 ace_type = zacep->z_hdr.z_type = 71 BSWAP_16(zacep->z_hdr.z_type); 72 entry_type = zacep->z_hdr.z_flags & ACE_TYPE_FLAGS; 73 } else { 74 acep = (ace_t *)ptr; 75 acep->a_access_mask = BSWAP_32(acep->a_access_mask); 76 acep->a_flags = BSWAP_16(acep->a_flags); 77 ace_type = acep->a_type = BSWAP_16(acep->a_type); 78 acep->a_who = BSWAP_32(acep->a_who); 79 entry_type = acep->a_flags & ACE_TYPE_FLAGS; 80 } 81 switch (entry_type) { 82 case ACE_OWNER: 83 case ACE_EVERYONE: 84 case (ACE_IDENTIFIER_GROUP | ACE_GROUP): 85 entry_size = zfs_layout ? 86 sizeof (zfs_ace_hdr_t) : sizeof (ace_t); 87 break; 88 case ACE_IDENTIFIER_GROUP: 89 default: 90 if (zfs_layout) { 91 zacep->z_fuid = BSWAP_64(zacep->z_fuid); 92 } 93 switch (ace_type) { 94 case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE: 95 case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE: 96 case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE: 97 case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE: 98 entry_size = zfs_layout ? 99 sizeof (zfs_object_ace_t) : 100 sizeof (ace_object_t); 101 break; 102 default: 103 entry_size = zfs_layout ? sizeof (zfs_ace_t) : 104 sizeof (ace_t); 105 break; 106 } 107 } 108 ptr = ptr + entry_size; 109 } 110 } 111 112 /* ARGSUSED */ 113 void 114 zfs_oldacl_byteswap(void *buf, size_t size) 115 { 116 int cnt; 117 118 /* 119 * Arggh, since we don't know how many ACEs are in 120 * the array, we have to swap the entire block 121 */ 122 123 cnt = size / sizeof (ace_t); 124 125 zfs_oldace_byteswap((ace_t *)buf, cnt); 126 } 127 128 /* ARGSUSED */ 129 void 130 zfs_acl_byteswap(void *buf, size_t size) 131 { 132 zfs_ace_byteswap(buf, size, B_TRUE); 133 } 134 135 void 136 zfs_znode_byteswap(void *buf, size_t size) 137 { 138 znode_phys_t *zp = buf; 139 140 ASSERT(size >= sizeof (znode_phys_t)); 141 142 zp->zp_crtime[0] = BSWAP_64(zp->zp_crtime[0]); 143 zp->zp_crtime[1] = BSWAP_64(zp->zp_crtime[1]); 144 zp->zp_atime[0] = BSWAP_64(zp->zp_atime[0]); 145 zp->zp_atime[1] = BSWAP_64(zp->zp_atime[1]); 146 zp->zp_mtime[0] = BSWAP_64(zp->zp_mtime[0]); 147 zp->zp_mtime[1] = BSWAP_64(zp->zp_mtime[1]); 148 zp->zp_ctime[0] = BSWAP_64(zp->zp_ctime[0]); 149 zp->zp_ctime[1] = BSWAP_64(zp->zp_ctime[1]); 150 zp->zp_gen = BSWAP_64(zp->zp_gen); 151 zp->zp_mode = BSWAP_64(zp->zp_mode); 152 zp->zp_size = BSWAP_64(zp->zp_size); 153 zp->zp_parent = BSWAP_64(zp->zp_parent); 154 zp->zp_links = BSWAP_64(zp->zp_links); 155 zp->zp_xattr = BSWAP_64(zp->zp_xattr); 156 zp->zp_rdev = BSWAP_64(zp->zp_rdev); 157 zp->zp_flags = BSWAP_64(zp->zp_flags); 158 zp->zp_uid = BSWAP_64(zp->zp_uid); 159 zp->zp_gid = BSWAP_64(zp->zp_gid); 160 zp->zp_zap = BSWAP_64(zp->zp_zap); 161 zp->zp_pad[0] = BSWAP_64(zp->zp_pad[0]); 162 zp->zp_pad[1] = BSWAP_64(zp->zp_pad[1]); 163 zp->zp_pad[2] = BSWAP_64(zp->zp_pad[2]); 164 165 zp->zp_acl.z_acl_extern_obj = BSWAP_64(zp->zp_acl.z_acl_extern_obj); 166 zp->zp_acl.z_acl_size = BSWAP_32(zp->zp_acl.z_acl_size); 167 zp->zp_acl.z_acl_version = BSWAP_16(zp->zp_acl.z_acl_version); 168 zp->zp_acl.z_acl_count = BSWAP_16(zp->zp_acl.z_acl_count); 169 if (zp->zp_acl.z_acl_version == ZFS_ACL_VERSION) { 170 zfs_acl_byteswap((void *)&zp->zp_acl.z_ace_data[0], 171 ZFS_ACE_SPACE); 172 } else 173 zfs_oldace_byteswap((ace_t *)&zp->zp_acl.z_ace_data[0], 174 ACE_SLOT_CNT); 175 } 176