xref: /linux/fs/udf/udf_i.h (revision ab52c59103002b49f2455371e4b9c56ba3ef1781)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _UDF_I_H
3 #define _UDF_I_H
4 
5 struct extent_position {
6 	struct buffer_head *bh;
7 	uint32_t offset;
8 	struct kernel_lb_addr block;
9 };
10 
11 struct udf_ext_cache {
12 	/* Extent position */
13 	struct extent_position epos;
14 	/* Start logical offset in bytes */
15 	loff_t lstart;
16 };
17 
18 /*
19  * The i_data_sem and i_mutex serve for protection of allocation information
20  * of a regular files and symlinks. This includes all extents belonging to
21  * the file/symlink, a fact whether data are in-inode or in external data
22  * blocks, preallocation, goal block information... When extents are read,
23  * i_mutex or i_data_sem must be held (for reading is enough in case of
24  * i_data_sem). When extents are changed, i_data_sem must be held for writing
25  * and also i_mutex must be held.
26  *
27  * For directories i_mutex is used for all the necessary protection.
28  */
29 
30 struct udf_inode_info {
31 	struct timespec64	i_crtime;
32 	/* Physical address of inode */
33 	struct kernel_lb_addr		i_location;
34 	__u64			i_unique;
35 	__u32			i_lenEAttr;
36 	__u32			i_lenAlloc;
37 	__u64			i_lenExtents;
38 	__u32			i_next_alloc_block;
39 	__u32			i_next_alloc_goal;
40 	__u32			i_checkpoint;
41 	__u32			i_extraPerms;
42 	unsigned		i_alloc_type : 3;
43 	unsigned		i_efe : 1;	/* extendedFileEntry */
44 	unsigned		i_use : 1;	/* unallocSpaceEntry */
45 	unsigned		i_strat4096 : 1;
46 	unsigned		i_streamdir : 1;
47 	unsigned		i_hidden : 1;	/* hidden system inode */
48 	unsigned		reserved : 24;
49 	__u8			*i_data;
50 	struct kernel_lb_addr	i_locStreamdir;
51 	__u64			i_lenStreams;
52 	struct rw_semaphore	i_data_sem;
53 	struct udf_ext_cache cached_extent;
54 	/* Spinlock for protecting extent cache */
55 	spinlock_t i_extent_cache_lock;
56 	struct inode vfs_inode;
57 };
58 
59 static inline struct udf_inode_info *UDF_I(struct inode *inode)
60 {
61 	return container_of(inode, struct udf_inode_info, vfs_inode);
62 }
63 
64 #endif /* _UDF_I_H) */
65