File: inode.h

package info (click to toggle)
apfsprogs 0%2Bgit20230206%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,036 kB
  • sloc: ansic: 14,691; makefile: 123
file content (89 lines) | stat: -rw-r--r-- 3,312 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 * Copyright (C) 2019 Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com>
 */

#ifndef _INODE_H
#define _INODE_H

#include <sys/stat.h> /* The macros for the inode mode */
#include <apfs/types.h>
#include "htable.h"

struct apfs_inode_key;
struct apfs_sibling_link_key;
struct apfs_sibling_map_key;

/* Flags for the bitmap of seen system xattrs (i_xattr_bmap) */
#define XATTR_BMAP_SYMLINK	0x01	/* Symlink target xattr */
#define XATTR_BMAP_RSRC_FORK	0x02	/* Resource fork xattr */
#define XATTR_BMAP_SECURITY	0x04	/* Security xattr */
#define XATTR_BMAP_FINDER_INFO	0x08	/* Finder info xattr */
#define XATTR_BMAP_COMPRESSED	0x10	/* Compression header xattr */

/*
 * Inode data in memory
 */
struct inode {
	struct htable_entry i_htable; /* Hash table entry header */

	u64		i_private_id;	/* Id of the inode's data stream */
	bool		i_seen;		/* Has this inode been seen? */

	/* Inode information read from its record (or from its dentries) */
	u16		i_mode;		/* File mode */
	union {
		u32	i_nchildren;	/* Number of children of directory */
		u32	i_nlink;	/* Number of hard links to file */
	};
	u64		i_sparse_bytes;	/* Number of sparse bytes */
	u64		i_flags;	/* Internal flags */
	u32		i_rdev;		/* Device ID */
	char		*i_name;	/* Name of primary link */
	u64		i_parent_id;	/* Parent id for the primary link */
	struct dstream	*i_dstream;	/* The inode's dstream (can be NULL) */
	u64		i_purg_flags;	/* Inode purgeable flags */
	char		*i_purg_name;	/* Purgeable dentry name (can be NULL) */
	u32		i_owner;	/* Id of the owner user */
	struct dirstat	*i_dirstat;	/* Directory statistics (can be NULL) */
	struct compress	*i_compress;	/* Compression data (can be NULL) */

	/* Inode stats measured by the fsck */
	u8		i_xattr_bmap;	/* Bitmap of system xattrs for inode */
	u16		i_xfield_bmap;	/* Bitmap of xfields for inode */
	u32		i_child_count;	/* Number of children of directory */
	u32		i_link_count;	/* Number of dentries for file */
	char		*i_first_name;	/* Name of first dentry encountered */
	u64		i_first_parent;	/* Parent id of the first dentry seen */
	struct sibling	*i_siblings;	/* Linked list of siblings for inode */
};
#define i_ino	i_htable.h_id		/* Inode number */

/*
 * Sibling link data in memory
 */
struct sibling {
	struct sibling	*s_next;	/* Next sibling in linked list */
	u64		s_id;		/* Sibling id */
	bool		s_checked;	/* Has this sibling been checked? */
	bool		s_mapped;	/* Has the sibling map been seen? */

	u64		s_parent_ino;	/* Inode number for parent */
	u16		s_name_len;	/* Name length */
	u8		*s_name;	/* In-memory copy of the name */
};

extern void free_inode_table(struct htable_entry **table);
extern struct inode *get_inode(u64 ino);
extern void check_inode_ids(u64 ino, u64 parent_ino);
extern void parse_inode_record(struct apfs_inode_key *key,
			       struct apfs_inode_val *val, int len);
extern struct sibling *get_sibling(u64 id, struct inode *inode);
extern void set_or_check_sibling(u64 parent_id, int namelen, u8 *name,
				 struct sibling *sibling);
extern void parse_sibling_record(struct apfs_sibling_link_key *key,
				 struct apfs_sibling_val *val, int len);
extern void parse_sibling_map_record(struct apfs_sibling_map_key *key,
				     struct apfs_sibling_map_val *val, int len);
extern void check_xfield_flags(u8 flags);

#endif	/* _INODE_H */