static int zfs_replay_acl_v0(zfsvfs_t *zfsvfs, lr_acl_v0_t *lr, boolean_t byteswap) { ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */ vsecattr_t vsa; znode_t *zp; int error; if (byteswap) { byteswap_uint64_array(lr, sizeof (*lr)); zfs_oldace_byteswap(ace, lr->lr_aclcnt); } if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) return (error); bzero(&vsa, sizeof (vsa)); vsa.vsa_mask = VSA_ACE | VSA_ACECNT; vsa.vsa_aclcnt = lr->lr_aclcnt; vsa.vsa_aclentsz = sizeof (ace_t) * vsa.vsa_aclcnt; vsa.vsa_aclflags = 0; vsa.vsa_aclentp = ace; #ifdef TODO error = VOP_SETSECATTR(ZTOV(zp), &vsa, 0, kcred, NULL); #else panic("%s:%u: unsupported condition", __func__, __LINE__); #endif VN_RELE(ZTOV(zp)); return (error); }
static int zfs_replay_acl_v0(void *arg1, void *arg2, boolean_t byteswap) { zfsvfs_t *zfsvfs = arg1; lr_acl_v0_t *lr = arg2; ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */ vsecattr_t vsa; vnode_t *vp; znode_t *zp; int error; if (byteswap) { byteswap_uint64_array(lr, sizeof (*lr)); zfs_oldace_byteswap(ace, lr->lr_aclcnt); } if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) return (error); bzero(&vsa, sizeof (vsa)); vsa.vsa_mask = VSA_ACE | VSA_ACECNT; vsa.vsa_aclcnt = lr->lr_aclcnt; vsa.vsa_aclentsz = sizeof (ace_t) * vsa.vsa_aclcnt; vsa.vsa_aclflags = 0; vsa.vsa_aclentp = ace; vp = ZTOV(zp); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); error = zfs_setsecattr(vp, &vsa, 0, kcred, NULL); VOP_UNLOCK(vp, 0); VN_RELE(vp); return (error); }
static int zfs_replay_acl_v0(zfsvfs_t *zfsvfs, lr_acl_v0_t *lr, boolean_t byteswap) { ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */ vsecattr_t vsa; znode_t *zp; int error; if (byteswap) { byteswap_uint64_array(lr, sizeof (*lr)); zfs_oldace_byteswap(ace, lr->lr_aclcnt); } if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) return (error); bzero(&vsa, sizeof (vsa)); vsa.vsa_mask = VSA_ACE | VSA_ACECNT; vsa.vsa_aclcnt = lr->lr_aclcnt; vsa.vsa_aclentsz = sizeof (ace_t) * vsa.vsa_aclcnt; vsa.vsa_aclflags = 0; vsa.vsa_aclentp = ace; error = zfs_setsecattr(ZTOI(zp), &vsa, 0, kcred); iput(ZTOI(zp)); return (error); }
static int zfs_replay_acl_v0(zfsvfs_t *zfsvfs, lr_acl_v0_t *lr, boolean_t byteswap) { ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */ vsecattr_t vsa; znode_t *zp; int error; if (byteswap) { byteswap_uint64_array(lr, sizeof (*lr)); zfs_oldace_byteswap(ace, lr->lr_aclcnt); } if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) { /* * As we can log acls out of order, it's possible the * file has been removed. In this case just drop the acl * and return success. */ if (error == ENOENT) error = 0; return (error); } bzero(&vsa, sizeof (vsa)); vsa.vsa_mask = VSA_ACE | VSA_ACECNT; vsa.vsa_aclcnt = lr->lr_aclcnt; vsa.vsa_aclentp = ace; error = VOP_SETSECATTR(ZTOV(zp), &vsa, 0, kcred, NULL); VN_RELE(ZTOV(zp)); return (error); }
/* ARGSUSED */ void zfs_oldacl_byteswap(void *buf, size_t size) { int cnt; /* * Arggh, since we don't know how many ACEs are in * the array, we have to swap the entire block */ cnt = size / sizeof (ace_t); zfs_oldace_byteswap((ace_t *)buf, cnt); }
void zfs_znode_byteswap(void *buf, size_t size) { znode_phys_t *zp = buf; ASSERT(size >= sizeof (znode_phys_t)); zp->zp_crtime[0] = BSWAP_64(zp->zp_crtime[0]); zp->zp_crtime[1] = BSWAP_64(zp->zp_crtime[1]); zp->zp_atime[0] = BSWAP_64(zp->zp_atime[0]); zp->zp_atime[1] = BSWAP_64(zp->zp_atime[1]); zp->zp_mtime[0] = BSWAP_64(zp->zp_mtime[0]); zp->zp_mtime[1] = BSWAP_64(zp->zp_mtime[1]); zp->zp_ctime[0] = BSWAP_64(zp->zp_ctime[0]); zp->zp_ctime[1] = BSWAP_64(zp->zp_ctime[1]); zp->zp_gen = BSWAP_64(zp->zp_gen); zp->zp_mode = BSWAP_64(zp->zp_mode); zp->zp_size = BSWAP_64(zp->zp_size); zp->zp_parent = BSWAP_64(zp->zp_parent); zp->zp_links = BSWAP_64(zp->zp_links); zp->zp_xattr = BSWAP_64(zp->zp_xattr); zp->zp_rdev = BSWAP_64(zp->zp_rdev); zp->zp_flags = BSWAP_64(zp->zp_flags); zp->zp_uid = BSWAP_64(zp->zp_uid); zp->zp_gid = BSWAP_64(zp->zp_gid); zp->zp_zap = BSWAP_64(zp->zp_zap); zp->zp_s2size = BSWAP_64(zp->zp_s2size); zp->zp_s2ptruncgen = BSWAP_32(zp->zp_s2ptruncgen); zp->zp_s2gen = BSWAP_32(zp->zp_s2gen); zp->zp_s2fid = BSWAP_64(zp->zp_s2fid); zp->zp_acl.z_acl_extern_obj = BSWAP_64(zp->zp_acl.z_acl_extern_obj); zp->zp_acl.z_acl_size = BSWAP_32(zp->zp_acl.z_acl_size); zp->zp_acl.z_acl_version = BSWAP_16(zp->zp_acl.z_acl_version); zp->zp_acl.z_acl_count = BSWAP_16(zp->zp_acl.z_acl_count); if (zp->zp_acl.z_acl_version == ZFS_ACL_VERSION) { zfs_acl_byteswap((void *)&zp->zp_acl.z_ace_data[0], ZFS_ACE_SPACE); } else { zfs_oldace_byteswap((ace_t *)&zp->zp_acl.z_ace_data[0], ACE_SLOT_CNT); } }