30
30
#include <linux/types.h>
31
31
#include <linux/nls.h>
32
32
33
- #include "endian24.h"
34
-
35
33
/*
36
34
* transaction and lock id's
37
35
*
@@ -59,26 +57,42 @@ struct timestruc_t {
59
57
60
58
/*
61
59
* physical xd (pxd)
60
+ *
61
+ * The leftmost 24 bits of len_addr are the extent length.
62
+ * The rightmost 8 bits of len_addr are the most signficant bits of
63
+ * the extent address
62
64
*/
63
65
typedef struct {
64
- unsigned len :24 ;
65
- unsigned addr1 :8 ;
66
+ __le32 len_addr ;
66
67
__le32 addr2 ;
67
68
} pxd_t ;
68
69
69
70
/* xd_t field construction */
70
71
71
- #define PXDlength (pxd , length32 ) ((pxd)->len = __cpu_to_le24(length32))
72
- #define PXDaddress (pxd , address64 )\
73
- {\
74
- (pxd)->addr1 = ((s64)address64) >> 32;\
75
- (pxd)->addr2 = __cpu_to_le32((address64) & 0xffffffff);\
72
+ static inline void PXDlength (pxd_t * pxd , __u32 len )
73
+ {
74
+ pxd -> len_addr = (pxd -> len_addr & cpu_to_le32 (~0xffffff )) |
75
+ cpu_to_le32 (len & 0xffffff );
76
+ }
77
+
78
+ static inline void PXDaddress (pxd_t * pxd , __u64 addr )
79
+ {
80
+ pxd -> len_addr = (pxd -> len_addr & cpu_to_le32 (0xffffff )) |
81
+ cpu_to_le32 ((addr >> 32 )<<24 );
82
+ pxd -> addr2 = cpu_to_le32 (addr & 0xffffffff );
76
83
}
77
84
78
85
/* xd_t field extraction */
79
- #define lengthPXD (pxd ) __le24_to_cpu((pxd)->len)
80
- #define addressPXD (pxd )\
81
- ( ((s64)((pxd)->addr1)) << 32 | __le32_to_cpu((pxd)->addr2))
86
+ static inline __u32 lengthPXD (pxd_t * pxd )
87
+ {
88
+ return le32_to_cpu ((pxd )-> len_addr ) & 0xffffff ;
89
+ }
90
+
91
+ static inline __u64 addressPXD (pxd_t * pxd )
92
+ {
93
+ __u64 n = le32_to_cpu (pxd -> len_addr ) & ~0xffffff ;
94
+ return (n << 8 ) + le32_to_cpu (pxd -> addr2 );
95
+ }
82
96
83
97
#define MAXTREEHEIGHT 8
84
98
/* pxd list */
@@ -93,12 +107,10 @@ struct pxdlist {
93
107
* data extent descriptor (dxd)
94
108
*/
95
109
typedef struct {
96
- unsigned flag : 8 ; /* 1: flags */
97
- unsigned rsrvd : 24 ;
110
+ __u8 flag ; /* 1: flags */
111
+ __u8 rsrvd [ 3 ] ;
98
112
__le32 size ; /* 4: size in byte */
99
- unsigned len :24 ; /* 3: length in unit of fsblksize */
100
- unsigned addr1 :8 ; /* 1: address in unit of fsblksize */
101
- __le32 addr2 ; /* 4: address in unit of fsblksize */
113
+ pxd_t loc ; /* 8: address and length in unit of fsblksize */
102
114
} dxd_t ; /* - 16 - */
103
115
104
116
/* dxd_t flags */
@@ -109,12 +121,11 @@ typedef struct {
109
121
#define DXD_CORRUPT 0x08 /* Inconsistency detected */
110
122
111
123
/* dxd_t field construction
112
- * Conveniently, the PXD macros work for DXD
113
124
*/
114
- #define DXDlength PXDlength
115
- #define DXDaddress PXDaddress
116
- #define lengthDXD lengthPXD
117
- #define addressDXD addressPXD
125
+ #define DXDlength ( dxd , len ) PXDlength(&(dxd)->loc, len)
126
+ #define DXDaddress ( dxd , addr ) PXDaddress(&(dxd)->loc, addr)
127
+ #define lengthDXD ( dxd ) lengthPXD(&(dxd)->loc)
128
+ #define addressDXD ( dxd ) addressPXD(&(dxd)->loc)
118
129
#define DXDsize (dxd , size32 ) ((dxd)->size = cpu_to_le32(size32))
119
130
#define sizeDXD (dxd ) le32_to_cpu((dxd)->size)
120
131
0 commit comments