49
49
#include <sys/spa.h>
50
50
#include <sys/zap.h>
51
51
#include <sys/sa.h>
52
+ #include <sys/sa_impl.h>
52
53
#include <sys/varargs.h>
53
54
#include <sys/policy.h>
54
55
#include <sys/atomic.h>
63
64
#include <sys/dnlc.h>
64
65
#include <sys/dmu_objset.h>
65
66
#include <sys/spa_boot.h>
66
- #include <sys/sa.h>
67
67
#include <sys/zpl.h>
68
68
#include "zfs_comutil.h"
69
69
@@ -300,7 +300,6 @@ static int
300
300
zfs_space_delta_cb (dmu_object_type_t bonustype , void * data ,
301
301
uint64_t * userp , uint64_t * groupp )
302
302
{
303
- znode_phys_t * znp = data ;
304
303
int error = 0 ;
305
304
306
305
/*
@@ -319,27 +318,44 @@ zfs_space_delta_cb(dmu_object_type_t bonustype, void *data,
319
318
return (EEXIST );
320
319
321
320
if (bonustype == DMU_OT_ZNODE ) {
321
+ znode_phys_t * znp = data ;
322
322
* userp = znp -> zp_uid ;
323
323
* groupp = znp -> zp_gid ;
324
324
} else {
325
325
int hdrsize ;
326
+ sa_hdr_phys_t * sap = data ;
327
+ sa_hdr_phys_t sa = * sap ;
328
+ boolean_t swap = B_FALSE ;
326
329
327
330
ASSERT (bonustype == DMU_OT_SA );
328
- hdrsize = sa_hdrsize (data );
329
331
330
- if (hdrsize != 0 ) {
331
- * userp = * ((uint64_t * )((uintptr_t )data + hdrsize +
332
- SA_UID_OFFSET ));
333
- * groupp = * ((uint64_t * )((uintptr_t )data + hdrsize +
334
- SA_GID_OFFSET ));
335
- } else {
332
+ if (sa .sa_magic == 0 ) {
336
333
/*
337
334
* This should only happen for newly created
338
335
* files that haven't had the znode data filled
339
336
* in yet.
340
337
*/
341
338
* userp = 0 ;
342
339
* groupp = 0 ;
340
+ return (0 );
341
+ }
342
+ if (sa .sa_magic == BSWAP_32 (SA_MAGIC )) {
343
+ sa .sa_magic = SA_MAGIC ;
344
+ sa .sa_layout_info = BSWAP_16 (sa .sa_layout_info );
345
+ swap = B_TRUE ;
346
+ } else {
347
+ VERIFY3U (sa .sa_magic , = = , SA_MAGIC );
348
+ }
349
+
350
+ hdrsize = sa_hdrsize (& sa );
351
+ VERIFY3U (hdrsize , >=, sizeof (sa_hdr_phys_t ));
352
+ * userp = * ((uint64_t * )((uintptr_t )data + hdrsize +
353
+ SA_UID_OFFSET ));
354
+ * groupp = * ((uint64_t * )((uintptr_t )data + hdrsize +
355
+ SA_GID_OFFSET ));
356
+ if (swap ) {
357
+ * userp = BSWAP_64 (* userp );
358
+ * groupp = BSWAP_64 (* groupp );
343
359
}
344
360
}
345
361
return (error );
0 commit comments