mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
Illumos #3208 cross-endian incorrect user/group accounting
3208 moving zpool cross-endian results in incorrect user/group accounting Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Christopher Siden <chris.siden@delphix.com> Approved by: Richard Lowe <richlowe@richlowe.net> References: illumos/illumos-gate@e828a46d29 illumos changeset: 13835:eea81edc4f14 https://www.illumos.org/issues/3208 Ported-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #627 Closes #1136
This commit is contained in:
parent
e6f7d01502
commit
a94addd974
@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2012 by Delphix. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SYS_SA_IMPL_H
|
#ifndef _SYS_SA_IMPL_H
|
||||||
@ -181,7 +182,7 @@ typedef struct sa_hdr_phys {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define SA_HDR_LAYOUT_NUM(hdr) BF32_GET(hdr->sa_layout_info, 0, 10)
|
#define SA_HDR_LAYOUT_NUM(hdr) BF32_GET(hdr->sa_layout_info, 0, 10)
|
||||||
#define SA_HDR_SIZE(hdr) BF32_GET_SB(hdr->sa_layout_info, 10, 16, 3, 0)
|
#define SA_HDR_SIZE(hdr) BF32_GET_SB(hdr->sa_layout_info, 10, 6, 3, 0)
|
||||||
#define SA_HDR_LAYOUT_INFO_ENCODE(x, num, size) \
|
#define SA_HDR_LAYOUT_INFO_ENCODE(x, num, size) \
|
||||||
{ \
|
{ \
|
||||||
BF32_SET_SB(x, 10, 6, 3, 0, size); \
|
BF32_SET_SB(x, 10, 6, 3, 0, size); \
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include <sys/spa.h>
|
#include <sys/spa.h>
|
||||||
#include <sys/zap.h>
|
#include <sys/zap.h>
|
||||||
#include <sys/sa.h>
|
#include <sys/sa.h>
|
||||||
|
#include <sys/sa_impl.h>
|
||||||
#include <sys/varargs.h>
|
#include <sys/varargs.h>
|
||||||
#include <sys/policy.h>
|
#include <sys/policy.h>
|
||||||
#include <sys/atomic.h>
|
#include <sys/atomic.h>
|
||||||
@ -63,7 +64,6 @@
|
|||||||
#include <sys/dnlc.h>
|
#include <sys/dnlc.h>
|
||||||
#include <sys/dmu_objset.h>
|
#include <sys/dmu_objset.h>
|
||||||
#include <sys/spa_boot.h>
|
#include <sys/spa_boot.h>
|
||||||
#include <sys/sa.h>
|
|
||||||
#include <sys/zpl.h>
|
#include <sys/zpl.h>
|
||||||
#include "zfs_comutil.h"
|
#include "zfs_comutil.h"
|
||||||
|
|
||||||
@ -300,7 +300,6 @@ static int
|
|||||||
zfs_space_delta_cb(dmu_object_type_t bonustype, void *data,
|
zfs_space_delta_cb(dmu_object_type_t bonustype, void *data,
|
||||||
uint64_t *userp, uint64_t *groupp)
|
uint64_t *userp, uint64_t *groupp)
|
||||||
{
|
{
|
||||||
znode_phys_t *znp = data;
|
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -319,20 +318,18 @@ zfs_space_delta_cb(dmu_object_type_t bonustype, void *data,
|
|||||||
return (EEXIST);
|
return (EEXIST);
|
||||||
|
|
||||||
if (bonustype == DMU_OT_ZNODE) {
|
if (bonustype == DMU_OT_ZNODE) {
|
||||||
|
znode_phys_t *znp = data;
|
||||||
*userp = znp->zp_uid;
|
*userp = znp->zp_uid;
|
||||||
*groupp = znp->zp_gid;
|
*groupp = znp->zp_gid;
|
||||||
} else {
|
} else {
|
||||||
int hdrsize;
|
int hdrsize;
|
||||||
|
sa_hdr_phys_t *sap = data;
|
||||||
|
sa_hdr_phys_t sa = *sap;
|
||||||
|
boolean_t swap = B_FALSE;
|
||||||
|
|
||||||
ASSERT(bonustype == DMU_OT_SA);
|
ASSERT(bonustype == DMU_OT_SA);
|
||||||
hdrsize = sa_hdrsize(data);
|
|
||||||
|
|
||||||
if (hdrsize != 0) {
|
if (sa.sa_magic == 0) {
|
||||||
*userp = *((uint64_t *)((uintptr_t)data + hdrsize +
|
|
||||||
SA_UID_OFFSET));
|
|
||||||
*groupp = *((uint64_t *)((uintptr_t)data + hdrsize +
|
|
||||||
SA_GID_OFFSET));
|
|
||||||
} else {
|
|
||||||
/*
|
/*
|
||||||
* This should only happen for newly created
|
* This should only happen for newly created
|
||||||
* files that haven't had the znode data filled
|
* files that haven't had the znode data filled
|
||||||
@ -340,6 +337,25 @@ zfs_space_delta_cb(dmu_object_type_t bonustype, void *data,
|
|||||||
*/
|
*/
|
||||||
*userp = 0;
|
*userp = 0;
|
||||||
*groupp = 0;
|
*groupp = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (sa.sa_magic == BSWAP_32(SA_MAGIC)) {
|
||||||
|
sa.sa_magic = SA_MAGIC;
|
||||||
|
sa.sa_layout_info = BSWAP_16(sa.sa_layout_info);
|
||||||
|
swap = B_TRUE;
|
||||||
|
} else {
|
||||||
|
VERIFY3U(sa.sa_magic, ==, SA_MAGIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
hdrsize = sa_hdrsize(&sa);
|
||||||
|
VERIFY3U(hdrsize, >=, sizeof (sa_hdr_phys_t));
|
||||||
|
*userp = *((uint64_t *)((uintptr_t)data + hdrsize +
|
||||||
|
SA_UID_OFFSET));
|
||||||
|
*groupp = *((uint64_t *)((uintptr_t)data + hdrsize +
|
||||||
|
SA_GID_OFFSET));
|
||||||
|
if (swap) {
|
||||||
|
*userp = BSWAP_64(*userp);
|
||||||
|
*groupp = BSWAP_64(*groupp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (error);
|
return (error);
|
||||||
|
Loading…
Reference in New Issue
Block a user