1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __XFS_LOG_FORMAT_H__
19#define __XFS_LOG_FORMAT_H__
20
21struct xfs_mount;
22struct xfs_trans_res;
23
24
25
26
27
28
29
30
31
32
33
34typedef __uint32_t xlog_tid_t;
35
36#define XLOG_MIN_ICLOGS 2
37#define XLOG_MAX_ICLOGS 8
38#define XLOG_HEADER_MAGIC_NUM 0xFEEDbabe
39#define XLOG_VERSION_1 1
40#define XLOG_VERSION_2 2
41#define XLOG_VERSION_OKBITS (XLOG_VERSION_1 | XLOG_VERSION_2)
42#define XLOG_MIN_RECORD_BSIZE (16*1024)
43#define XLOG_BIG_RECORD_BSIZE (32*1024)
44#define XLOG_MAX_RECORD_BSIZE (256*1024)
45#define XLOG_HEADER_CYCLE_SIZE (32*1024)
46#define XLOG_MIN_RECORD_BSHIFT 14
47#define XLOG_BIG_RECORD_BSHIFT 15
48#define XLOG_MAX_RECORD_BSHIFT 18
49#define XLOG_BTOLSUNIT(log, b) (((b)+(log)->l_mp->m_sb.sb_logsunit-1) / \
50 (log)->l_mp->m_sb.sb_logsunit)
51#define XLOG_LSUNITTOB(log, su) ((su) * (log)->l_mp->m_sb.sb_logsunit)
52
53#define XLOG_HEADER_SIZE 512
54
55
56#define XFS_MIN_LOG_FACTOR 3
57
58#define XLOG_REC_SHIFT(log) \
59 BTOBB(1 << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \
60 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
61#define XLOG_TOTAL_REC_SHIFT(log) \
62 BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \
63 XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
64
65
66#define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
67#define BLOCK_LSN(lsn) ((uint)(lsn))
68
69
70#define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0])
71
72static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block)
73{
74 return ((xfs_lsn_t)cycle << 32) | block;
75}
76
77static inline uint xlog_get_cycle(char *ptr)
78{
79 if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM)
80 return be32_to_cpu(*((__be32 *)ptr + 1));
81 else
82 return be32_to_cpu(*(__be32 *)ptr);
83}
84
85
86#define XFS_TRANSACTION 0x69
87#define XFS_VOLUME 0x2
88#define XFS_LOG 0xaa
89
90#define XLOG_UNMOUNT_TYPE 0x556e
91
92
93#define XLOG_REG_TYPE_BFORMAT 1
94#define XLOG_REG_TYPE_BCHUNK 2
95#define XLOG_REG_TYPE_EFI_FORMAT 3
96#define XLOG_REG_TYPE_EFD_FORMAT 4
97#define XLOG_REG_TYPE_IFORMAT 5
98#define XLOG_REG_TYPE_ICORE 6
99#define XLOG_REG_TYPE_IEXT 7
100#define XLOG_REG_TYPE_IBROOT 8
101#define XLOG_REG_TYPE_ILOCAL 9
102#define XLOG_REG_TYPE_IATTR_EXT 10
103#define XLOG_REG_TYPE_IATTR_BROOT 11
104#define XLOG_REG_TYPE_IATTR_LOCAL 12
105#define XLOG_REG_TYPE_QFORMAT 13
106#define XLOG_REG_TYPE_DQUOT 14
107#define XLOG_REG_TYPE_QUOTAOFF 15
108#define XLOG_REG_TYPE_LRHEADER 16
109#define XLOG_REG_TYPE_UNMOUNT 17
110#define XLOG_REG_TYPE_COMMIT 18
111#define XLOG_REG_TYPE_TRANSHDR 19
112#define XLOG_REG_TYPE_ICREATE 20
113#define XLOG_REG_TYPE_MAX 20
114
115
116
117
118
119
120
121
122
123
124
125
126#define XLOG_START_TRANS 0x01
127#define XLOG_COMMIT_TRANS 0x02
128#define XLOG_CONTINUE_TRANS 0x04
129#define XLOG_WAS_CONT_TRANS 0x08
130#define XLOG_END_TRANS 0x10
131#define XLOG_UNMOUNT_TRANS 0x20
132
133
134typedef struct xlog_op_header {
135 __be32 oh_tid;
136 __be32 oh_len;
137 __u8 oh_clientid;
138 __u8 oh_flags;
139 __u16 oh_res2;
140} xlog_op_header_t;
141
142
143#define XLOG_FMT_UNKNOWN 0
144#define XLOG_FMT_LINUX_LE 1
145#define XLOG_FMT_LINUX_BE 2
146#define XLOG_FMT_IRIX_BE 3
147
148
149#ifdef XFS_NATIVE_HOST
150#define XLOG_FMT XLOG_FMT_LINUX_BE
151#else
152#define XLOG_FMT XLOG_FMT_LINUX_LE
153#endif
154
155typedef struct xlog_rec_header {
156 __be32 h_magicno;
157 __be32 h_cycle;
158 __be32 h_version;
159 __be32 h_len;
160 __be64 h_lsn;
161 __be64 h_tail_lsn;
162 __le32 h_crc;
163 __be32 h_prev_block;
164 __be32 h_num_logops;
165 __be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE];
166
167 __be32 h_fmt;
168 uuid_t h_fs_uuid;
169 __be32 h_size;
170} xlog_rec_header_t;
171
172typedef struct xlog_rec_ext_header {
173 __be32 xh_cycle;
174 __be32 xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE];
175} xlog_rec_ext_header_t;
176
177
178
179
180typedef union xlog_in_core2 {
181 xlog_rec_header_t hic_header;
182 xlog_rec_ext_header_t hic_xheader;
183 char hic_sector[XLOG_HEADER_SIZE];
184} xlog_in_core_2_t;
185
186
187typedef struct xfs_log_iovec {
188 void *i_addr;
189 int i_len;
190 uint i_type;
191} xfs_log_iovec_t;
192
193
194
195
196
197
198
199
200
201
202
203
204
205typedef struct xfs_trans_header {
206 uint th_magic;
207 uint th_type;
208 __int32_t th_tid;
209 uint th_num_items;
210} xfs_trans_header_t;
211
212#define XFS_TRANS_HEADER_MAGIC 0x5452414e
213
214
215
216
217#define XFS_LI_EFI 0x1236
218#define XFS_LI_EFD 0x1237
219#define XFS_LI_IUNLINK 0x1238
220#define XFS_LI_INODE 0x123b
221#define XFS_LI_BUF 0x123c
222#define XFS_LI_DQUOT 0x123d
223#define XFS_LI_QUOTAOFF 0x123e
224#define XFS_LI_ICREATE 0x123f
225
226#define XFS_LI_TYPE_DESC \
227 { XFS_LI_EFI, "XFS_LI_EFI" }, \
228 { XFS_LI_EFD, "XFS_LI_EFD" }, \
229 { XFS_LI_IUNLINK, "XFS_LI_IUNLINK" }, \
230 { XFS_LI_INODE, "XFS_LI_INODE" }, \
231 { XFS_LI_BUF, "XFS_LI_BUF" }, \
232 { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \
233 { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \
234 { XFS_LI_ICREATE, "XFS_LI_ICREATE" }
235
236
237
238
239
240
241
242
243
244typedef struct xfs_inode_log_format {
245 __uint16_t ilf_type;
246 __uint16_t ilf_size;
247 __uint32_t ilf_fields;
248 __uint16_t ilf_asize;
249 __uint16_t ilf_dsize;
250 __uint64_t ilf_ino;
251 union {
252 __uint32_t ilfu_rdev;
253 uuid_t ilfu_uuid;
254 } ilf_u;
255 __int64_t ilf_blkno;
256 __int32_t ilf_len;
257 __int32_t ilf_boffset;
258} xfs_inode_log_format_t;
259
260typedef struct xfs_inode_log_format_32 {
261 __uint16_t ilf_type;
262 __uint16_t ilf_size;
263 __uint32_t ilf_fields;
264 __uint16_t ilf_asize;
265 __uint16_t ilf_dsize;
266 __uint64_t ilf_ino;
267 union {
268 __uint32_t ilfu_rdev;
269 uuid_t ilfu_uuid;
270 } ilf_u;
271 __int64_t ilf_blkno;
272 __int32_t ilf_len;
273 __int32_t ilf_boffset;
274} __attribute__((packed)) xfs_inode_log_format_32_t;
275
276typedef struct xfs_inode_log_format_64 {
277 __uint16_t ilf_type;
278 __uint16_t ilf_size;
279 __uint32_t ilf_fields;
280 __uint16_t ilf_asize;
281 __uint16_t ilf_dsize;
282 __uint32_t ilf_pad;
283 __uint64_t ilf_ino;
284 union {
285 __uint32_t ilfu_rdev;
286 uuid_t ilfu_uuid;
287 } ilf_u;
288 __int64_t ilf_blkno;
289 __int32_t ilf_len;
290 __int32_t ilf_boffset;
291} xfs_inode_log_format_64_t;
292
293
294
295
296#define XFS_ILOG_CORE 0x001
297#define XFS_ILOG_DDATA 0x002
298#define XFS_ILOG_DEXT 0x004
299#define XFS_ILOG_DBROOT 0x008
300#define XFS_ILOG_DEV 0x010
301#define XFS_ILOG_UUID 0x020
302#define XFS_ILOG_ADATA 0x040
303#define XFS_ILOG_AEXT 0x080
304#define XFS_ILOG_ABROOT 0x100
305#define XFS_ILOG_DOWNER 0x200
306#define XFS_ILOG_AOWNER 0x400
307
308
309
310
311
312
313
314
315#define XFS_ILOG_TIMESTAMP 0x4000
316
317#define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \
318 XFS_ILOG_DBROOT | XFS_ILOG_DEV | \
319 XFS_ILOG_UUID | XFS_ILOG_ADATA | \
320 XFS_ILOG_AEXT | XFS_ILOG_ABROOT | \
321 XFS_ILOG_DOWNER | XFS_ILOG_AOWNER)
322
323#define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \
324 XFS_ILOG_DBROOT)
325
326#define XFS_ILOG_AFORK (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
327 XFS_ILOG_ABROOT)
328
329#define XFS_ILOG_ALL (XFS_ILOG_CORE | XFS_ILOG_DDATA | \
330 XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \
331 XFS_ILOG_DEV | XFS_ILOG_UUID | \
332 XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
333 XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP | \
334 XFS_ILOG_DOWNER | XFS_ILOG_AOWNER)
335
336static inline int xfs_ilog_fbroot(int w)
337{
338 return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT);
339}
340
341static inline int xfs_ilog_fext(int w)
342{
343 return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT);
344}
345
346static inline int xfs_ilog_fdata(int w)
347{
348 return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA);
349}
350
351
352
353
354
355
356
357typedef struct xfs_ictimestamp {
358 __int32_t t_sec;
359 __int32_t t_nsec;
360} xfs_ictimestamp_t;
361
362
363
364
365
366typedef struct xfs_icdinode {
367 __uint16_t di_magic;
368 __uint16_t di_mode;
369 __int8_t di_version;
370 __int8_t di_format;
371 __uint16_t di_onlink;
372 __uint32_t di_uid;
373 __uint32_t di_gid;
374 __uint32_t di_nlink;
375 __uint16_t di_projid_lo;
376 __uint16_t di_projid_hi;
377 __uint8_t di_pad[6];
378 __uint16_t di_flushiter;
379 xfs_ictimestamp_t di_atime;
380 xfs_ictimestamp_t di_mtime;
381 xfs_ictimestamp_t di_ctime;
382 xfs_fsize_t di_size;
383 xfs_rfsblock_t di_nblocks;
384 xfs_extlen_t di_extsize;
385 xfs_extnum_t di_nextents;
386 xfs_aextnum_t di_anextents;
387 __uint8_t di_forkoff;
388 __int8_t di_aformat;
389 __uint32_t di_dmevmask;
390 __uint16_t di_dmstate;
391 __uint16_t di_flags;
392 __uint32_t di_gen;
393
394
395 xfs_agino_t di_next_unlinked;
396
397
398 __uint32_t di_crc;
399 __uint64_t di_changecount;
400 xfs_lsn_t di_lsn;
401 __uint64_t di_flags2;
402 __uint8_t di_pad2[16];
403
404
405 xfs_ictimestamp_t di_crtime;
406 xfs_ino_t di_ino;
407 uuid_t di_uuid;
408
409
410} xfs_icdinode_t;
411
412static inline uint xfs_icdinode_size(int version)
413{
414 if (version == 3)
415 return sizeof(struct xfs_icdinode);
416 return offsetof(struct xfs_icdinode, di_next_unlinked);
417}
418
419
420
421
422
423
424#define XFS_BLF_CHUNK 128
425#define XFS_BLF_SHIFT 7
426#define BIT_TO_WORD_SHIFT 5
427#define NBWORD (NBBY * sizeof(unsigned int))
428
429
430
431
432
433#define XFS_BLF_INODE_BUF (1<<0)
434
435
436
437
438
439#define XFS_BLF_CANCEL (1<<1)
440
441
442
443
444
445#define XFS_BLF_UDQUOT_BUF (1<<2)
446#define XFS_BLF_PDQUOT_BUF (1<<3)
447#define XFS_BLF_GDQUOT_BUF (1<<4)
448
449
450
451
452
453
454#define XFS_BLF_DATAMAP_SIZE ((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD)
455
456typedef struct xfs_buf_log_format {
457 unsigned short blf_type;
458 unsigned short blf_size;
459 ushort blf_flags;
460 ushort blf_len;
461 __int64_t blf_blkno;
462 unsigned int blf_map_size;
463 unsigned int blf_data_map[XFS_BLF_DATAMAP_SIZE];
464} xfs_buf_log_format_t;
465
466
467
468
469
470
471
472
473
474#define XFS_BLFT_BITS 5
475#define XFS_BLFT_SHIFT 11
476#define XFS_BLFT_MASK (((1 << XFS_BLFT_BITS) - 1) << XFS_BLFT_SHIFT)
477
478enum xfs_blft {
479 XFS_BLFT_UNKNOWN_BUF = 0,
480 XFS_BLFT_UDQUOT_BUF,
481 XFS_BLFT_PDQUOT_BUF,
482 XFS_BLFT_GDQUOT_BUF,
483 XFS_BLFT_BTREE_BUF,
484 XFS_BLFT_AGF_BUF,
485 XFS_BLFT_AGFL_BUF,
486 XFS_BLFT_AGI_BUF,
487 XFS_BLFT_DINO_BUF,
488 XFS_BLFT_SYMLINK_BUF,
489 XFS_BLFT_DIR_BLOCK_BUF,
490 XFS_BLFT_DIR_DATA_BUF,
491 XFS_BLFT_DIR_FREE_BUF,
492 XFS_BLFT_DIR_LEAF1_BUF,
493 XFS_BLFT_DIR_LEAFN_BUF,
494 XFS_BLFT_DA_NODE_BUF,
495 XFS_BLFT_ATTR_LEAF_BUF,
496 XFS_BLFT_ATTR_RMT_BUF,
497 XFS_BLFT_SB_BUF,
498 XFS_BLFT_MAX_BUF = (1 << XFS_BLFT_BITS),
499};
500
501static inline void
502xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type)
503{
504 ASSERT(type > XFS_BLFT_UNKNOWN_BUF && type < XFS_BLFT_MAX_BUF);
505 blf->blf_flags &= ~XFS_BLFT_MASK;
506 blf->blf_flags |= ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK);
507}
508
509static inline __uint16_t
510xfs_blft_from_flags(struct xfs_buf_log_format *blf)
511{
512 return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT;
513}
514
515
516
517
518typedef struct xfs_extent {
519 xfs_fsblock_t ext_start;
520 xfs_extlen_t ext_len;
521} xfs_extent_t;
522
523
524
525
526
527
528
529typedef struct xfs_extent_32 {
530 __uint64_t ext_start;
531 __uint32_t ext_len;
532} __attribute__((packed)) xfs_extent_32_t;
533
534typedef struct xfs_extent_64 {
535 __uint64_t ext_start;
536 __uint32_t ext_len;
537 __uint32_t ext_pad;
538} xfs_extent_64_t;
539
540
541
542
543
544
545typedef struct xfs_efi_log_format {
546 __uint16_t efi_type;
547 __uint16_t efi_size;
548 __uint32_t efi_nextents;
549 __uint64_t efi_id;
550 xfs_extent_t efi_extents[1];
551} xfs_efi_log_format_t;
552
553typedef struct xfs_efi_log_format_32 {
554 __uint16_t efi_type;
555 __uint16_t efi_size;
556 __uint32_t efi_nextents;
557 __uint64_t efi_id;
558 xfs_extent_32_t efi_extents[1];
559} __attribute__((packed)) xfs_efi_log_format_32_t;
560
561typedef struct xfs_efi_log_format_64 {
562 __uint16_t efi_type;
563 __uint16_t efi_size;
564 __uint32_t efi_nextents;
565 __uint64_t efi_id;
566 xfs_extent_64_t efi_extents[1];
567} xfs_efi_log_format_64_t;
568
569
570
571
572
573
574typedef struct xfs_efd_log_format {
575 __uint16_t efd_type;
576 __uint16_t efd_size;
577 __uint32_t efd_nextents;
578 __uint64_t efd_efi_id;
579 xfs_extent_t efd_extents[1];
580} xfs_efd_log_format_t;
581
582typedef struct xfs_efd_log_format_32 {
583 __uint16_t efd_type;
584 __uint16_t efd_size;
585 __uint32_t efd_nextents;
586 __uint64_t efd_efi_id;
587 xfs_extent_32_t efd_extents[1];
588} __attribute__((packed)) xfs_efd_log_format_32_t;
589
590typedef struct xfs_efd_log_format_64 {
591 __uint16_t efd_type;
592 __uint16_t efd_size;
593 __uint32_t efd_nextents;
594 __uint64_t efd_efi_id;
595 xfs_extent_64_t efd_extents[1];
596} xfs_efd_log_format_64_t;
597
598
599
600
601
602
603
604typedef struct xfs_dq_logformat {
605 __uint16_t qlf_type;
606 __uint16_t qlf_size;
607 xfs_dqid_t qlf_id;
608 __int64_t qlf_blkno;
609 __int32_t qlf_len;
610 __uint32_t qlf_boffset;
611} xfs_dq_logformat_t;
612
613
614
615
616
617
618
619
620
621typedef struct xfs_qoff_logformat {
622 unsigned short qf_type;
623 unsigned short qf_size;
624 unsigned int qf_flags;
625 char qf_pad[12];
626} xfs_qoff_logformat_t;
627
628
629
630
631#define XFS_UQUOTA_ACCT 0x0001
632#define XFS_UQUOTA_ENFD 0x0002
633#define XFS_UQUOTA_CHKD 0x0004
634#define XFS_PQUOTA_ACCT 0x0008
635#define XFS_OQUOTA_ENFD 0x0010
636#define XFS_OQUOTA_CHKD 0x0020
637#define XFS_GQUOTA_ACCT 0x0040
638
639
640
641
642
643#define XFS_GQUOTA_ENFD 0x0080
644#define XFS_GQUOTA_CHKD 0x0100
645#define XFS_PQUOTA_ENFD 0x0200
646#define XFS_PQUOTA_CHKD 0x0400
647
648#define XFS_ALL_QUOTA_ACCT \
649 (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT | XFS_PQUOTA_ACCT)
650#define XFS_ALL_QUOTA_ENFD \
651 (XFS_UQUOTA_ENFD | XFS_GQUOTA_ENFD | XFS_PQUOTA_ENFD)
652#define XFS_ALL_QUOTA_CHKD \
653 (XFS_UQUOTA_CHKD | XFS_GQUOTA_CHKD | XFS_PQUOTA_CHKD)
654
655#define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
656 XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\
657 XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD|\
658 XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD|\
659 XFS_PQUOTA_CHKD)
660
661
662
663
664
665
666
667
668struct xfs_icreate_log {
669 __uint16_t icl_type;
670 __uint16_t icl_size;
671 __be32 icl_ag;
672 __be32 icl_agbno;
673 __be32 icl_count;
674 __be32 icl_isize;
675 __be32 icl_length;
676 __be32 icl_gen;
677};
678
679#endif
680