hc
2024-03-26 e9199a72d842cbda78ac614eee5db7cdaa6f2530
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __LINUX_UDF_SB_H
#define __LINUX_UDF_SB_H
 
#include <linux/mutex.h>
#include <linux/bitops.h>
#include <linux/magic.h>
 
#define UDF_MAX_READ_VERSION        0x0250
#define UDF_MAX_WRITE_VERSION        0x0201
 
#define UDF_FLAG_USE_EXTENDED_FE    0
#define UDF_VERS_USE_EXTENDED_FE    0x0200
#define UDF_FLAG_USE_STREAMS        1
#define UDF_VERS_USE_STREAMS        0x0200
#define UDF_FLAG_USE_SHORT_AD        2
#define UDF_FLAG_USE_AD_IN_ICB        3
#define UDF_FLAG_USE_FILE_CTIME_EA    4
#define UDF_FLAG_STRICT            5
#define UDF_FLAG_UNDELETE        6
#define UDF_FLAG_UNHIDE            7
#define UDF_FLAG_VARCONV        8
#define UDF_FLAG_UID_FORGET     11    /* save -1 for uid to disk */
#define UDF_FLAG_GID_FORGET     12
#define UDF_FLAG_UID_SET    13
#define UDF_FLAG_GID_SET    14
#define UDF_FLAG_SESSION_SET    15
#define UDF_FLAG_LASTBLOCK_SET    16
#define UDF_FLAG_BLOCKSIZE_SET    17
#define UDF_FLAG_INCONSISTENT    18
#define UDF_FLAG_RW_INCOMPAT    19    /* Set when we find RW incompatible
                    * feature */
 
#define UDF_PART_FLAG_UNALLOC_BITMAP    0x0001
#define UDF_PART_FLAG_UNALLOC_TABLE    0x0002
#define UDF_PART_FLAG_READ_ONLY        0x0010
#define UDF_PART_FLAG_WRITE_ONCE    0x0020
#define UDF_PART_FLAG_REWRITABLE    0x0040
#define UDF_PART_FLAG_OVERWRITABLE    0x0080
 
#define UDF_MAX_BLOCK_LOADED    8
 
#define UDF_TYPE1_MAP15            0x1511U
#define UDF_VIRTUAL_MAP15        0x1512U
#define UDF_VIRTUAL_MAP20        0x2012U
#define UDF_SPARABLE_MAP15        0x1522U
#define UDF_METADATA_MAP25        0x2511U
 
#define UDF_INVALID_MODE        ((umode_t)-1)
 
#define MF_DUPLICATE_MD        0x01
#define MF_MIRROR_FE_LOADED    0x02
 
struct udf_meta_data {
   __u32    s_meta_file_loc;
   __u32    s_mirror_file_loc;
   __u32    s_bitmap_file_loc;
   __u32    s_alloc_unit_size;
   __u16    s_align_unit_size;
   /*
    * Partition Reference Number of the associated physical / sparable
    * partition
    */
   __u16   s_phys_partition_ref;
   int    s_flags;
   struct inode *s_metadata_fe;
   struct inode *s_mirror_fe;
   struct inode *s_bitmap_fe;
};
 
struct udf_sparing_data {
   __u16    s_packet_len;
   struct buffer_head *s_spar_map[4];
};
 
struct udf_virtual_data {
   __u32    s_num_entries;
   __u16    s_start_offset;
};
 
struct udf_bitmap {
   __u32            s_extPosition;
   int            s_nr_groups;
   struct buffer_head    *s_block_bitmap[];
};
 
struct udf_part_map {
   union {
       struct udf_bitmap    *s_bitmap;
       struct inode        *s_table;
   } s_uspace;
   __u32    s_partition_root;
   __u32    s_partition_len;
   __u16    s_partition_type;
   __u16    s_partition_num;
   union {
       struct udf_sparing_data s_sparing;
       struct udf_virtual_data s_virtual;
       struct udf_meta_data s_metadata;
   } s_type_specific;
   __u32    (*s_partition_func)(struct super_block *, __u32, __u16, __u32);
   __u16    s_volumeseqnum;
   __u16    s_partition_flags;
};
 
#pragma pack()
 
struct udf_sb_info {
   struct udf_part_map    *s_partmaps;
   __u8            s_volume_ident[32];
 
   /* Overall info */
   __u16            s_partitions;
   __u16            s_partition;
 
   /* Sector headers */
   __s32            s_session;
   __u32            s_anchor;
   __u32            s_last_block;
 
   struct buffer_head    *s_lvid_bh;
 
   /* Default permissions */
   umode_t            s_umask;
   kgid_t            s_gid;
   kuid_t            s_uid;
   umode_t            s_fmode;
   umode_t            s_dmode;
   /* Lock protecting consistency of above permission settings */
   rwlock_t        s_cred_lock;
 
   /* Root Info */
   struct timespec64    s_record_time;
 
   /* Fileset Info */
   __u16            s_serial_number;
 
   /* highest UDF revision we have recorded to this media */
   __u16            s_udfrev;
 
   /* Miscellaneous flags */
   unsigned long        s_flags;
 
   /* Encoding info */
   struct nls_table    *s_nls_map;
 
   /* VAT inode */
   struct inode        *s_vat_inode;
 
   struct mutex        s_alloc_mutex;
   /* Protected by s_alloc_mutex */
   unsigned int        s_lvid_dirty;
};
 
static inline struct udf_sb_info *UDF_SB(struct super_block *sb)
{
   return sb->s_fs_info;
}
 
struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb);
 
int udf_compute_nr_groups(struct super_block *sb, u32 partition);
 
static inline int UDF_QUERY_FLAG(struct super_block *sb, int flag)
{
   return test_bit(flag, &UDF_SB(sb)->s_flags);
}
 
static inline void UDF_SET_FLAG(struct super_block *sb, int flag)
{
   set_bit(flag, &UDF_SB(sb)->s_flags);
}
 
static inline void UDF_CLEAR_FLAG(struct super_block *sb, int flag)
{
   clear_bit(flag, &UDF_SB(sb)->s_flags);
}
 
#endif /* __LINUX_UDF_SB_H */