Subversion Repositories Kolibri OS

Rev

Rev 4429 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4923 Serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2013-2014. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 4850 $
9
 
10
 
4429 Serge 11
; from stat.h
12
; distinguish file types
13
S_IFMT      = 0170000o  ; These bits determine file type.
14
S_IFDIR     = 0040000o  ; Directory.
15
S_IFCHR     = 0020000o  ; Character device.
16
S_IFBLK     = 0060000o  ; Block device.
17
S_IFREG     = 0100000o  ; Regular file.
18
S_IFIFO     = 0010000o  ; FIFO.
19
S_IFLNK     = 0120000o  ; Symbolic link.
20
S_IFSOCK    = 0140000o  ; Socket.
21
; end stat.h
22
 
23
 
24
; XFS null constant: empty fields must be all ones, not zeros!
25
XFS_NULL                = -1
26
 
27
 
28
; static sector numbers
29
XFS_SECT_SB             = 0
30
XFS_SECT_AGF            = 1
31
XFS_SECT_AGI            = 2
32
XFS_SECT_AGFL           = 3
33
 
34
 
35
; signatures of file system structures
36
; 'string' numbers are treated by fasm as big endian
37
XFS_SB_MAGIC            = 'XFSB'
38
XFS_AGF_MAGIC           = 'XAGF'
39
XFS_AGI_MAGIC           = 'XAGI'
40
XFS_ABTB_MAGIC          = 'ABTB'
41
XFS_ABTC_MAGIC          = 'ABTC'
42
XFS_IBT_MAGIC           = 'IABT'
43
XFS_DINODE_MAGIC        = 'IN'
44
XFS_BMAP_MAGIC          = 'BMAP'
45
XFS_DA_NODE_MAGIC       = 0xbefe        ; those are little endian here
46
XFS_ATTR_LEAF_MAGIC     = 0xeefb        ; but big endian in docs
47
XFS_DIR2_LEAF1_MAGIC    = 0xf1d2        ; pay attention!
48
XFS_DIR2_LEAFN_MAGIC    = 0xffd2        ;
49
XFS_DIR2_BLOCK_MAGIC    = 'XD2B'
50
XFS_DIR2_DATA_MAGIC     = 'XD2D'
51
XFS_DIR2_FREE_MAGIC     = 'XD2F'
52
XFS_DQUOT_MAGIC         = 'DQ'
53
 
54
 
55
; bitfield lengths for packed extent
56
; MSB to LSB / left to right
57
BMBT_EXNTFLAG_BITLEN    =  1
58
BMBT_STARTOFF_BITLEN    = 54
59
BMBT_STARTBLOCK_BITLEN  = 52
60
BMBT_BLOCKCOUNT_BITLEN  = 21
61
 
62
 
63
; those constants are taken from linux source (xfs_dir2_leaf.h)
64
; they are magic infile offsets for directories
65
XFS_DIR2_DATA_ALIGN_LOG = 3     ; i.e., 8 bytes
66
XFS_DIR2_LEAF_SPACE     = 1
67
XFS_DIR2_SPACE_SIZE     = (1 SHL (32 + XFS_DIR2_DATA_ALIGN_LOG))
68
XFS_DIR2_LEAF_OFFSET    = (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE)
69
XFS_DIR2_FREE_SPACE     = 2
70
XFS_DIR2_SPACE_SIZE     = (1 SHL (32 + XFS_DIR2_DATA_ALIGN_LOG))
71
XFS_DIR2_FREE_OFFSET    = (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE)
72
 
73
 
74
; data section magic constants for directories (xfs_dir2_data.h)
75
XFS_DIR2_DATA_FD_COUNT  = 3
76
XFS_DIR2_DATA_FREE_TAG  = 0xffff
77
 
78
 
79
; valid inode formats
80
; enum xfs_dinode_fmt (xfs_dinode.h)
81
XFS_DINODE_FMT_DEV      = 0     ; xfs_dev_t
82
XFS_DINODE_FMT_LOCAL    = 1     ; one inode is enough (shortdir)
83
XFS_DINODE_FMT_EXTENTS  = 2     ; one or more extents (leafdir, nodedir, regular files)
84
XFS_DINODE_FMT_BTREE    = 3     ; highly fragmented files or really huge directories
85
XFS_DINODE_FMT_UUID     = 4     ; uuid_t
86
 
87
 
88
; size of the unlinked inode hash table in the agi
89
XFS_AGI_UNLINKED_BUCKETS = 64
90
 
91
 
92
; possible extent states
93
; enum xfs_exntst_t (xfs_bmap_btree.h)
94
XFS_EXT_NORM            = 0
95
XFS_EXT_UNWRITTEN       = 1
96
XFS_EXT_DMAPI_OFFLINE   = 2
97
XFS_EXT_INVALID         = 3
98
 
99
 
100
; values for inode core flags / di_flags (xfs_dinode.h)
101
XFS_DIFLAG_REALTIME_BIT     =  0        ; file's blocks come from rt area
102
XFS_DIFLAG_PREALLOC_BIT     =  1        ; file space has been preallocated
103
XFS_DIFLAG_NEWRTBM_BIT      =  2        ; for rtbitmap inode, new format
104
XFS_DIFLAG_IMMUTABLE_BIT    =  3        ; inode is immutable
105
XFS_DIFLAG_APPEND_BIT       =  4        ; inode is append-only
106
XFS_DIFLAG_SYNC_BIT         =  5        ; inode is written synchronously
107
XFS_DIFLAG_NOATIME_BIT      =  6        ; do not update atime
108
XFS_DIFLAG_NODUMP_BIT       =  7        ; do not dump
109
XFS_DIFLAG_RTINHERIT_BIT    =  8        ; create with realtime bit set
110
XFS_DIFLAG_PROJINHERIT_BIT  =  9        ; create with parents projid
111
XFS_DIFLAG_NOSYMLINKS_BIT   = 10        ; disallow symlink creation
112
XFS_DIFLAG_EXTSIZE_BIT      = 11        ; inode extent size allocator hint
113
XFS_DIFLAG_EXTSZINHERIT_BIT = 12        ; inherit inode extent size
114
XFS_DIFLAG_NODEFRAG_BIT     = 13        ; do not reorganize/defragment
115
XFS_DIFLAG_FILESTREAM_BIT   = 14        ; use filestream allocator
116
XFS_DIFLAG_REALTIME         = (1 SHL XFS_DIFLAG_REALTIME_BIT)
117
XFS_DIFLAG_PREALLOC         = (1 SHL XFS_DIFLAG_PREALLOC_BIT)
118
XFS_DIFLAG_NEWRTBM          = (1 SHL XFS_DIFLAG_NEWRTBM_BIT)
119
XFS_DIFLAG_IMMUTABLE        = (1 SHL XFS_DIFLAG_IMMUTABLE_BIT)
120
XFS_DIFLAG_APPEND           = (1 SHL XFS_DIFLAG_APPEND_BIT)
121
XFS_DIFLAG_SYNC             = (1 SHL XFS_DIFLAG_SYNC_BIT)
122
XFS_DIFLAG_NOATIME          = (1 SHL XFS_DIFLAG_NOATIME_BIT)
123
XFS_DIFLAG_NODUMP           = (1 SHL XFS_DIFLAG_NODUMP_BIT)
124
XFS_DIFLAG_RTINHERIT        = (1 SHL XFS_DIFLAG_RTINHERIT_BIT)
125
XFS_DIFLAG_PROJINHERIT      = (1 SHL XFS_DIFLAG_PROJINHERIT_BIT)
126
XFS_DIFLAG_NOSYMLINKS       = (1 SHL XFS_DIFLAG_NOSYMLINKS_BIT)
127
XFS_DIFLAG_EXTSIZE          = (1 SHL XFS_DIFLAG_EXTSIZE_BIT)
128
XFS_DIFLAG_EXTSZINHERIT     = (1 SHL XFS_DIFLAG_EXTSZINHERIT_BIT)
129
XFS_DIFLAG_NODEFRAG         = (1 SHL XFS_DIFLAG_NODEFRAG_BIT)
130
XFS_DIFLAG_FILESTREAM       = (1 SHL XFS_DIFLAG_FILESTREAM_BIT)
131
 
132
 
133
; superblock _ondisk_ structure (xfs_sb.h)
134
; this is _not_ the partition structure
135
; for XFS partition structure see XFS below
136
struct xfs_sb
137
        sb_magicnum     dd ?    ; signature, must be XFS_SB_MAGIC
138
        sb_blocksize    dd ?    ; block is the minimal file system unit, in bytes
139
        sb_dblocks      dq ?    ; number of data blocks
140
        sb_rblocks      dq ?    ; number of realtime blocks (not supported yet!)
141
        sb_rextents     dq ?    ; number of realtime extents (not supported yet!)
142
        sb_uuid         rb 16   ; file system unique identifier
143
        sb_logstart     dq ?    ; starting block of log (for internal journal; journals on separate devices are not supported!)
144
        sb_rootino      dq ?    ; root inode number
145
        sb_rbmino       dq ?    ; bitmap inode for realtime extents (ignored)
146
        sb_rsumino      dq ?    ; summary inode for rt bitmap (ignored)
147
        sb_rextsize     dd ?    ; realtime extent size, blocks
148
        sb_agblocks     dd ?    ; size of an allocation group (the last one may be smaller!)
149
        sb_agcount      dd ?    ; number of allocation groups
150
        sb_rbmblocks    dd ?    ; number of rt bitmap blocks
151
        sb_logblocks    dd ?    ; number of log blocks
152
        sb_versionnum   dw ?    ; header version == XFS_SB_VERSION
153
        sb_sectsize     dw ?    ; volume sector size in bytes (only 512B sectors are supported)
154
        sb_inodesize    dw ?    ; inode size, bytes
155
        sb_inopblock    dw ?    ; inodes per block
156
        sb_fname        rb 12   ; inodes per block (aka label)
157
        sb_blocklog     db ?    ; log2 of sb_blocksize
158
        sb_sectlog      db ?    ; log2 of sb_blocksize
159
        sb_inodelog     db ?    ; log2 of sb_inodesize
160
        sb_inopblog     db ?    ; log2 of sb_inopblock
161
        sb_agblklog     db ?    ; log2 of sb_agblocks (rounded up!)
162
        sb_rextslog     db ?    ; log2 of sb_rextents
163
        sb_inprogress   db ?    ; mkfs is in progress, don't mount
164
        sb_imax_pct     db ?    ; max % of fs for inode space
165
        ; statistics
166
        sb_icount       dq ?    ; allocated inodes
167
        sb_ifree        dq ?    ; free inodes
168
        sb_fdblocks     dq ?    ; free data blocks
169
        sb_frextents    dq ?    ; free realtime extents
170
 
171
        sb_uquotino     dq ?    ; user quota inode
172
        sb_gquotino     dq ?    ; group quota inode
173
        sb_qflags       dw ?    ; quota flags
174
        sb_flags        db ?    ; misc. flags
175
        sb_shared_vn    db ?    ; shared version number
176
        sb_inoalignmt   dd ?    ; inode chunk alignment, fsblocks
177
        sb_unit         dd ?    ; stripe or raid unit
178
        sb_width        dd ?    ; stripe or raid width
179
        sb_dirblklog    db ?    ; log2 of dir block size (fsbs)
180
        sb_logsectlog   db ?    ; log2 of the log sector size
181
        sb_logsectsize  dw ?    ; sector size for the log, bytes
182
        sb_logsunit     dd ?    ; stripe unit size for the log
183
        sb_features2    dd ?    ; additional feature bits
184
ends
185
 
186
 
187
; allocation group inode (xfs_ag.h)
188
struct xfs_agi
189
        agi_magicnum    dd ?    ; magic number == XFS_AGI_MAGIC
190
        agi_versionnum  dd ?    ; header version == XFS_AGI_VERSION
191
        agi_seqno       dd ?    ; sequence number starting from 0
192
        agi_length      dd ?    ; size in blocks of a.g.
193
        agi_count       dd ?    ; count of allocated inodes
194
        agi_root        dd ?    ; root of inode btree
195
        agi_level       dd ?    ; levels in inode btree
196
        agi_freecount   dd ?    ; number of free inodes
197
        agi_newino      dd ?    ; new inode just allocated
198
        agi_dirino      dd ?    ; last directory inode chunk
199
        agi_unlinked    rd XFS_AGI_UNLINKED_BUCKETS     ; Hash table of inodes which have been unlinked but are still being referenced
200
ends
201
 
202
 
203
; superblock structure of b+tree node/leaf (same structure, bb_level matters)
204
struct xfs_btree_sblock
205
        bb_magic        dd ?
206
        bb_level        dw ?    ; distinguishes nodeds and leaves
207
        bb_numrecs      dw ?
208
        bb_leftsib      dd ?
209
        bb_rightsib     dd ?
210
ends
211
 
212
 
213
; record of b+tree inode
214
struct xfs_inobt_rec
215
        ir_startino     dd ?
216
        ir_freecount    dd ?
217
        ir_free         dq ?
218
ends
219
 
220
 
221
; structure to store create, access and modification time in inode core
222
struct xfs_timestamp
223
        t_sec           dd ?
224
        t_nsec          dd ?    ; nanoseconds
225
ends
226
 
227
 
228
; inode core structure: basic information about file
229
struct xfs_dinode_core
230
        di_magic        dw ?            ; inode magic = XFS_DINODE_MAGIC
231
        di_mode         dw ?            ; mode and type of file
232
        di_version      db ?            ; inode version
233
        di_format       db ?            ; format of di_c data
234
        di_onlink       dw ?            ; old number of links to file
235
        di_uid          dd ?            ; owner's user id
236
        di_gid          dd ?            ; owner's group id
237
        di_nlink        dd ?            ; number of links to file
238
        di_projid       dw ?            ; owner's project id
239
        di_pad          rb 8            ; unused, zeroed space
240
        di_flushiter    dw ?            ; incremented on flush
241
        di_atime        xfs_timestamp   ; time last accessed
242
        di_mtime        xfs_timestamp   ; time last modified
243
        di_ctime        xfs_timestamp   ; time created/inode modified
244
        di_size         dq ?            ; number of bytes in file
245
        di_nblocks      dq ?            ; number of direct & btree blocks used
246
        di_extsize      dd ?            ; basic/minimum extent size for file
247
        di_nextents     dd ?            ; number of extents in data fork
248
        di_anextents    dw ?            ; number of extents in attribute fork
249
        di_forkoff      db ?            ; attr fork offs, <<3 for 64b align
250
        di_aformat      db ?            ; format of attr fork's data
251
        di_dmevmask     dd ?            ; DMIG event mask
252
        di_dmstate      dw ?            ; DMIG state info
253
        di_flags        dw ?            ; random flags, XFS_DIFLAG_...
254
        di_gen          dd ?            ; generation number
255
ends
256
 
257
 
258
; shortform dir header
259
struct xfs_dir2_sf_hdr
260
        count           db ?            ; the number of directory entries, used only if each inode number fits 4 bytes; zero otherwise
261
        i8count         db ?            ; the number of directory entries, used only when count is zero
262
        parent          dq ?            ; parent inode number: xfs_dir2_inou_t (4 or 8 bytes)
263
ends
264
 
265
 
266
; shortform dir entry
267
struct xfs_dir2_sf_entry
268
        namelen         db ?            ; actual name length (ASCII)
269
        offset          rb 2            ; saved offset
270
        name            db ?            ; name, variable size
271
;       inumber         dq ?            ; xfs_dir2_inou_t
272
ends
273
 
274
 
275
; active entry in a data block
276
; aligned to 8 bytes
277
; tag appears as the last 2 bytes
278
struct xfs_dir2_data_entry
279
        inumber         dq ?            ; inode number
280
        namelen         db ?            ; name length
281
        name            db ?            ; name bytes, no null
282
;       tag             dw ?            ; starting offset of us
283
ends
284
 
285
 
286
; unused entry in a data block
287
; aligned to 8 bytes
288
; tag appears as the last 2 bytes
289
struct xfs_dir2_data_unused
290
        freetag         dw ?            ; XFS_DIR2_DATA_FREE_TAG
291
        length          dw ?            ; total free length
292
;        tag             dw ?           ; starting offset of us
293
ends
294
 
295
 
296
; generic data entry
297
struct xfs_dir2_data_union
298
  union
299
        xentry          xfs_dir2_data_entry
300
        unused          xfs_dir2_data_unused
301
  ends
302
ends
303
 
304
 
305
; describe a free area in the data block
306
; the freespace will be formatted as a xfs_dir2_data_unused_t
307
struct xfs_dir2_data_free
308
        offset          dw ?            ; start of freespace
309
        length          dw ?            ; length of freespace
310
ends
311
 
312
 
313
; header for the data blocks
314
; always at the beginning of a directory-sized block
315
; the code knows that XFS_DIR2_DATA_FD_COUNT is 3
316
struct xfs_dir2_data_hdr
317
        magic           dd ?                    ; XFS_DIR2_DATA_MAGIC or XFS_DIR2_BLOCK_MAGIC
318
        bestfree        xfs_dir2_data_free
319
        bestfree2       xfs_dir2_data_free
320
        bestfree3       xfs_dir2_data_free
321
ends
322
 
323
 
324
; leaf block entry
325
struct xfs_dir2_leaf_entry
326
        hashval         dd ?            ; hash value of name
327
        address         dd ?            ; address of data entry
328
ends
329
 
330
 
331
; the tail of directory block
332
struct xfs_dir2_block_tail
333
        count           dd ?            ; count of leaf entries
334
        stale           dd ?            ; count of stale leaf entries
335
ends
336
 
337
 
338
; generic single-block structure, for xfs_db
339
struct xfs_dir2_block
340
        hdr             xfs_dir2_data_hdr
341
        u               xfs_dir2_data_union
342
;        leaf            xfs_dir2_leaf_entry
343
;        tail            xfs_dir2_block_tail
344
ends
345
 
346
 
347
;
348
struct xfs_dir2_data
349
        hdr             xfs_dir2_data_hdr       ; magic XFS_DIR2_DATA_MAGIC
350
        u               xfs_dir2_data_union
351
ends
352
 
353
 
354
;
355
struct xfs_da_blkinfo
356
        forw            dd ?            ; previous block in list
357
        back            dd ?            ; following block in list
358
        magic           dw ?            ; validity check on block
359
        pad             dw ?            ; unused
360
ends
361
 
362
 
363
; leaf block header
364
struct xfs_dir2_leaf_hdr
365
        info            xfs_da_blkinfo  ; header for da routines
366
        count           dw ?            ; count of entries
367
        stale           dw ?            ; count of stale entries
368
ends
369
 
370
 
371
; leaf block tail
372
struct xfs_dir2_leaf_tail
373
        bestcount       dd ?
374
ends
375
 
376
 
377
; leaf block
378
; bests and tail are at the end of the block for single-leaf only
379
; (magic = XFS_DIR2_LEAF1_MAGIC not XFS_DIR2_LEAFN_MAGIC)
380
struct xfs_dir2_leaf
381
        hdr             xfs_dir2_leaf_hdr       ; leaf header
382
        ents            xfs_dir2_leaf_entry     ; entries
383
;       bests           dw ?                    ; best free counts
384
;       tail            xfs_dir2_leaf_tail      ; leaf tail
385
ends
386
 
387
 
388
; header of 'free' block part
389
struct xfs_dir2_free_hdr
390
        magic           dd ?    ; XFS_DIR2_FREE_MAGIC
391
        firstdb         dd ?    ; db of first entry
392
        nvalid          dd ?    ; count of valid entries
393
        nused           dd ?    ; count of used entries
394
ends
395
 
396
 
397
; 'free' part of directiry block
398
struct xfs_dir2_free
399
        hdr             xfs_dir2_free_hdr       ; block header
400
        bests           dw ?                    ; best free counts
401
                                                ; unused entries are -1 (XFS_NULL)
402
ends
403
 
404
 
405
; b+tree node header
406
struct xfs_da_node_hdr
407
        info            xfs_da_blkinfo
408
        count           dw ?
409
        level           dw ?
410
ends
411
 
412
 
413
; b+tree node
414
struct xfs_da_node_entry
415
        hashval         dd ?            ; hash value for this descendant
416
        before          dd ?            ; Btree block before this key
417
ends
418
 
419
 
420
;
421
struct xfs_da_intnode
422
        hdr             xfs_da_node_hdr
423
        btree           xfs_da_node_entry
424
ends
425
 
426
 
427
; packet extent
428
struct xfs_bmbt_rec
429
        l0              dq ?
430
        l1              dq ?
431
ends
432
 
433
 
434
; unpacked extent
435
struct xfs_bmbt_irec
436
        br_startoff     dq ?            ; starting file offset
437
        br_startblock   dq ?            ; starting block number
438
        br_blockcount   dd ?            ; number of blocks
439
        br_state        dd ?            ; extent state
440
ends
441
 
442
 
443
; bmap root header, on-disk form only
444
struct xfs_bmdr_block
445
        bb_level        dw ?            ; 0 is a leaf
446
        bb_numrecs      dw ?            ; current number of data records
447
ends
448
 
449
 
450
; key structure for non-leaf levels of the tree
451
struct xfs_bmbt_key
452
        br_startoff     dq ?            ; starting file offset
453
ends
454
 
455
 
456
sizeof.xfs_bmbt_ptr = 8                 ; workaround
457
sizeof.xfs_bmdr_ptr = 8                 ; workaround
458
 
459
 
460
; long form header: bmap btrees
461
; xfs_btree_lblock is xfs_bmbt_block (xfs_btree.h)
462
struct xfs_bmbt_block
463
        bb_magic        dd ?            ; magic number for block type
464
        bb_level        dw ?            ; 0 is a leaf
465
        bb_numrecs      dw ?            ; current number of data records
466
        bb_leftsib      dq ?            ; left sibling block or NULLDFSBNO
467
        bb_rightsib     dq ?            ; right sibling block or NULLDFSBNO
468
ends
469
 
470
 
471
; high level inode structure
472
struct xfs_inode
473
        di_core                 xfs_dinode_core ; main info, aka core
474
        di_next_unlinked        dd ?            ; unlinked but still used inode (if any, XFS_NULL otherwise)
475
        di_u                    db ?            ; data fork inode part
476
;        di_a                    db ?           ; data attribute
477
ends
478
 
479
 
480
; internal data for every XFS partition
481
; this _is_ XFS partition structure
482
; most fields are unpacked or bswap'ed values from the superblock, so see xfs_sb structure above
483
struct XFS PARTITION
484
        Lock                    MUTEX ?         ; access mutex
485
        blocksize               dd ?
486
        sectsize                dd ?
487
        dirblocksize            dd ?
488
        rootino                 dq ?
489
        cur_block               dd ?
490
        cur_inode               dd ?
491
        cur_sect                dd ?
492
        cur_dirblock            dd ?
493
        tmp_inode               dd ?
494
        versionnum              dd ?
495
        features2               dd ?
496
        inodesize               dd ?
497
        inopblock               dd ?
498
        blocklog                dd ?
499
        sectlog                 dd ?
500
        inodelog                dd ?
501
        inopblog                dd ?
502
        agblklog                dd ?
503
        blockmsectlog           dd ?
504
        inodetoblocklog         dd ?
505
        dirblklog               dd ?
506
        sectpblock              dd ?
507
        agblocks                dd ?
508
        ; helpers, temporary vars, etc
509
        agblockmask             dq ?
510
        extent                  xfs_bmbt_irec
511
        left_extents            dd ?
512
        left_leaves             dd ?
513
        bytes_to_read           dd ?
514
        bytes_read              dd ?
515
        entries_read            dd ?
516
        file_offset             dq ?
517
        max_dirblockaddr        dd ?
518
        next_block_num          dq ?
519
        dir2_leaf_offset_blocks dd ?
520
        dir2_free_offset_blocks dd ?
521
        cur_inode_save          dd ?
522
        bytes_left_in_file      dq ?
523
        ro_nextents             dd ?
524
        bb_ptrs                 dd ?
525
        maxnumrecs              dd ?
526
        buffer_pos              dd ?
527
        eof                     dd ?
528
ends