186 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __LINUX_UDF_SB_H3#define __LINUX_UDF_SB_H4 5#include <linux/mutex.h>6#include <linux/bitops.h>7#include <linux/magic.h>8 9/*10 * Even UDF 2.6 media should have version <= 0x250 but apparently there are11 * some broken filesystems with version set to 0x260. Accommodate those.12 */13#define UDF_MAX_READ_VERSION 0x026014#define UDF_MAX_WRITE_VERSION 0x020115 16#define UDF_FLAG_USE_EXTENDED_FE 017#define UDF_VERS_USE_EXTENDED_FE 0x020018#define UDF_FLAG_USE_STREAMS 119#define UDF_VERS_USE_STREAMS 0x020020#define UDF_FLAG_USE_SHORT_AD 221#define UDF_FLAG_USE_AD_IN_ICB 322#define UDF_FLAG_USE_FILE_CTIME_EA 423#define UDF_FLAG_STRICT 524#define UDF_FLAG_UNDELETE 625#define UDF_FLAG_UNHIDE 726#define UDF_FLAG_NOVRS 827#define UDF_FLAG_UID_FORGET 11 /* save -1 for uid to disk */28#define UDF_FLAG_GID_FORGET 1229#define UDF_FLAG_UID_SET 1330#define UDF_FLAG_GID_SET 1431#define UDF_FLAG_SESSION_SET 1532#define UDF_FLAG_LASTBLOCK_SET 1633#define UDF_FLAG_BLOCKSIZE_SET 1734#define UDF_FLAG_INCONSISTENT 1835#define UDF_FLAG_RW_INCOMPAT 19 /* Set when we find RW incompatible36 * feature */37 38#define UDF_PART_FLAG_UNALLOC_BITMAP 0x000139#define UDF_PART_FLAG_UNALLOC_TABLE 0x000240#define UDF_PART_FLAG_READ_ONLY 0x001041#define UDF_PART_FLAG_WRITE_ONCE 0x002042#define UDF_PART_FLAG_REWRITABLE 0x004043#define UDF_PART_FLAG_OVERWRITABLE 0x008044 45#define UDF_MAX_BLOCK_LOADED 846 47#define UDF_TYPE1_MAP15 0x1511U48#define UDF_VIRTUAL_MAP15 0x1512U49#define UDF_VIRTUAL_MAP20 0x2012U50#define UDF_SPARABLE_MAP15 0x1522U51#define UDF_METADATA_MAP25 0x2511U52 53#define UDF_INVALID_MODE ((umode_t)-1)54 55#define MF_DUPLICATE_MD 0x0156#define MF_MIRROR_FE_LOADED 0x0257 58#define EFSCORRUPTED EUCLEAN59 60struct udf_meta_data {61 __u32 s_meta_file_loc;62 __u32 s_mirror_file_loc;63 __u32 s_bitmap_file_loc;64 __u32 s_alloc_unit_size;65 __u16 s_align_unit_size;66 /*67 * Partition Reference Number of the associated physical / sparable68 * partition69 */70 __u16 s_phys_partition_ref;71 int s_flags;72 struct inode *s_metadata_fe;73 struct inode *s_mirror_fe;74 struct inode *s_bitmap_fe;75};76 77struct udf_sparing_data {78 __u16 s_packet_len;79 struct buffer_head *s_spar_map[4];80};81 82struct udf_virtual_data {83 __u32 s_num_entries;84 __u16 s_start_offset;85};86 87struct udf_bitmap {88 __u32 s_extPosition;89 int s_nr_groups;90 struct buffer_head *s_block_bitmap[] __counted_by(s_nr_groups);91};92 93struct udf_part_map {94 union {95 struct udf_bitmap *s_bitmap;96 struct inode *s_table;97 } s_uspace;98 __u32 s_partition_root;99 __u32 s_partition_len;100 __u16 s_partition_type;101 __u16 s_partition_num;102 union {103 struct udf_sparing_data s_sparing;104 struct udf_virtual_data s_virtual;105 struct udf_meta_data s_metadata;106 } s_type_specific;107 __u32 (*s_partition_func)(struct super_block *, __u32, __u16, __u32);108 __u16 s_volumeseqnum;109 __u16 s_partition_flags;110};111 112#pragma pack()113 114struct udf_sb_info {115 struct udf_part_map *s_partmaps;116 __u8 s_volume_ident[32];117 118 /* Overall info */119 __u16 s_partitions;120 __u16 s_partition;121 122 /* Sector headers */123 __s32 s_session;124 __u32 s_anchor;125 __u32 s_last_block;126 127 struct buffer_head *s_lvid_bh;128 129 /* Default permissions */130 umode_t s_umask;131 kgid_t s_gid;132 kuid_t s_uid;133 umode_t s_fmode;134 umode_t s_dmode;135 /* Lock protecting consistency of above permission settings */136 rwlock_t s_cred_lock;137 138 /* Root Info */139 struct timespec64 s_record_time;140 141 /* Fileset Info */142 __u16 s_serial_number;143 144 /* highest UDF revision we have recorded to this media */145 __u16 s_udfrev;146 147 /* Miscellaneous flags */148 unsigned long s_flags;149 150 /* Encoding info */151 struct nls_table *s_nls_map;152 153 /* VAT inode */154 struct inode *s_vat_inode;155 156 struct mutex s_alloc_mutex;157 /* Protected by s_alloc_mutex */158 unsigned int s_lvid_dirty;159};160 161static inline struct udf_sb_info *UDF_SB(struct super_block *sb)162{163 return sb->s_fs_info;164}165 166struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb);167 168int udf_compute_nr_groups(struct super_block *sb, u32 partition);169 170static inline int UDF_QUERY_FLAG(struct super_block *sb, int flag)171{172 return test_bit(flag, &UDF_SB(sb)->s_flags);173}174 175static inline void UDF_SET_FLAG(struct super_block *sb, int flag)176{177 set_bit(flag, &UDF_SB(sb)->s_flags);178}179 180static inline void UDF_CLEAR_FLAG(struct super_block *sb, int flag)181{182 clear_bit(flag, &UDF_SB(sb)->s_flags);183}184 185#endif /* __LINUX_UDF_SB_H */186