Blame view

fs/erofs/internal.h 11.9 KB
29b24f6ca   Gao Xiang   staging: erofs: u...
1
2
  /* SPDX-License-Identifier: GPL-2.0-only */
  /*
bfb8674dc   Gao Xiang   staging: erofs: a...
3
4
5
   * Copyright (C) 2017-2018 HUAWEI, Inc.
   *             http://www.huawei.com/
   * Created by Gao Xiang <gaoxiang25@huawei.com>
bfb8674dc   Gao Xiang   staging: erofs: a...
6
   */
14f362b4f   Gao Xiang   staging: erofs: c...
7
8
  #ifndef __EROFS_INTERNAL_H
  #define __EROFS_INTERNAL_H
bfb8674dc   Gao Xiang   staging: erofs: a...
9
10
11
12
13
14
15
  
  #include <linux/fs.h>
  #include <linux/dcache.h>
  #include <linux/mm.h>
  #include <linux/pagemap.h>
  #include <linux/bio.h>
  #include <linux/buffer_head.h>
47e4937a4   Gao Xiang   erofs: move erofs...
16
  #include <linux/magic.h>
bfb8674dc   Gao Xiang   staging: erofs: a...
17
18
19
20
21
22
23
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
  #include "erofs_fs.h"
  
  /* redefine pr_fmt "erofs: " */
  #undef pr_fmt
  #define pr_fmt(fmt) "erofs: " fmt
4f761fa25   Gao Xiang   erofs: rename err...
24
25
26
27
28
29
30
31
32
33
  __printf(3, 4) void _erofs_err(struct super_block *sb,
  			       const char *function, const char *fmt, ...);
  #define erofs_err(sb, fmt, ...)	\
  	_erofs_err(sb, __func__, fmt "
  ", ##__VA_ARGS__)
  __printf(3, 4) void _erofs_info(struct super_block *sb,
  			       const char *function, const char *fmt, ...);
  #define erofs_info(sb, fmt, ...) \
  	_erofs_info(sb, __func__, fmt "
  ", ##__VA_ARGS__)
bfb8674dc   Gao Xiang   staging: erofs: a...
34
  #ifdef CONFIG_EROFS_FS_DEBUG
4f761fa25   Gao Xiang   erofs: rename err...
35
36
  #define erofs_dbg(x, ...)       pr_debug(x "
  ", ##__VA_ARGS__)
bfb8674dc   Gao Xiang   staging: erofs: a...
37
38
  #define DBG_BUGON               BUG_ON
  #else
4f761fa25   Gao Xiang   erofs: rename err...
39
  #define erofs_dbg(x, ...)       ((void)0)
eef168789   Gao Xiang   staging: erofs: f...
40
  #define DBG_BUGON(x)            ((void)(x))
14f362b4f   Gao Xiang   staging: erofs: c...
41
  #endif	/* !CONFIG_EROFS_FS_DEBUG */
bfb8674dc   Gao Xiang   staging: erofs: a...
42
43
44
45
46
  
  /* EROFS_SUPER_MAGIC_V1 to represent the whole file system */
  #define EROFS_SUPER_MAGIC   EROFS_SUPER_MAGIC_V1
  
  typedef u64 erofs_nid_t;
14f362b4f   Gao Xiang   staging: erofs: c...
47
48
49
  typedef u64 erofs_off_t;
  /* data type for filesystem-wide blocks number */
  typedef u32 erofs_blk_t;
bfb8674dc   Gao Xiang   staging: erofs: a...
50
51
  
  struct erofs_sb_info {
22fe04a77   Gao Xiang   staging: erofs: c...
52
  #ifdef CONFIG_EROFS_FS_ZIP
2497ee412   Gao Xiang   staging: erofs: i...
53
54
  	/* list for all registered superblocks, mainly for shrinker */
  	struct list_head list;
a15813126   Gao Xiang   staging: erofs: i...
55
  	struct mutex umount_mutex;
2497ee412   Gao Xiang   staging: erofs: i...
56

e7e9a307b   Gao Xiang   staging: erofs: i...
57
58
  	/* the dedicated workstation for compression */
  	struct radix_tree_root workstn_tree;
105d4ad85   Gao Xiang   staging: erofs: i...
59

5fb76bb04   Gao Xiang   staging: erofs: c...
60
61
  	/* threshold for decompression synchronously */
  	unsigned int max_sync_decompress_pages;
22fe04a77   Gao Xiang   staging: erofs: c...
62
  	unsigned int shrinker_run_no;
4279f3f98   Gao Xiang   staging: erofs: t...
63
64
  	/* current strategy of how to use managed cache */
  	unsigned char cache_strategy;
105d4ad85   Gao Xiang   staging: erofs: i...
65

4279f3f98   Gao Xiang   staging: erofs: t...
66
67
  	/* pseudo inode to manage cached pages */
  	struct inode *managed_cache;
22fe04a77   Gao Xiang   staging: erofs: c...
68
69
70
71
72
  #endif	/* CONFIG_EROFS_FS_ZIP */
  	u32 blocks;
  	u32 meta_blkaddr;
  #ifdef CONFIG_EROFS_FS_XATTR
  	u32 xattr_blkaddr;
02827e179   Gao Xiang   staging: erofs: a...
73
  #endif
bfb8674dc   Gao Xiang   staging: erofs: a...
74

22fe04a77   Gao Xiang   staging: erofs: c...
75
76
  	/* inode slot unit size in bit shift */
  	unsigned char islotbits;
bfb8674dc   Gao Xiang   staging: erofs: a...
77
78
79
80
81
82
83
84
85
86
  	u32 build_time_nsec;
  	u64 build_time;
  
  	/* what we really care is nid, rather than ino.. */
  	erofs_nid_t root_nid;
  	/* used for statfs, f_files - f_favail */
  	u64 inos;
  
  	u8 uuid[16];                    /* 128-bit uuid for volume */
  	u8 volume_name[16];             /* volume name */
426a93089   Gao Xiang   erofs: use featur...
87
  	u32 feature_incompat;
5efe5137f   Gao Xiang   staging: erofs: a...
88

bfb8674dc   Gao Xiang   staging: erofs: a...
89
90
91
92
93
  	unsigned int mount_opt;
  };
  
  #define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info)
  #define EROFS_I_SB(inode) ((struct erofs_sb_info *)(inode)->i_sb->s_fs_info)
b17500a0f   Gao Xiang   staging: erofs: i...
94
95
96
  /* Mount flags set via mount options or defaults */
  #define EROFS_MOUNT_XATTR_USER		0x00000010
  #define EROFS_MOUNT_POSIX_ACL		0x00000020
bfb8674dc   Gao Xiang   staging: erofs: a...
97
98
99
  #define clear_opt(sbi, option)	((sbi)->mount_opt &= ~EROFS_MOUNT_##option)
  #define set_opt(sbi, option)	((sbi)->mount_opt |= EROFS_MOUNT_##option)
  #define test_opt(sbi, option)	((sbi)->mount_opt & EROFS_MOUNT_##option)
e7e9a307b   Gao Xiang   staging: erofs: i...
100
  #ifdef CONFIG_EROFS_FS_ZIP
4279f3f98   Gao Xiang   staging: erofs: t...
101
102
103
104
105
  enum {
  	EROFS_ZIP_CACHE_DISABLED,
  	EROFS_ZIP_CACHE_READAHEAD,
  	EROFS_ZIP_CACHE_READAROUND
  };
14f362b4f   Gao Xiang   staging: erofs: c...
106
  #define EROFS_LOCKED_MAGIC     (INT_MIN | 0xE0F510CCL)
e7e9a307b   Gao Xiang   staging: erofs: i...
107
108
109
110
111
112
113
114
  /* basic unit of the workstation of a super_block */
  struct erofs_workgroup {
  	/* the workgroup index in the workstation */
  	pgoff_t index;
  
  	/* overall workgroup reference count */
  	atomic_t refcount;
  };
73f5c66df   Gao Xiang   staging: erofs: f...
115
116
117
  #if defined(CONFIG_SMP)
  static inline bool erofs_workgroup_try_to_freeze(struct erofs_workgroup *grp,
  						 int val)
e7e9a307b   Gao Xiang   staging: erofs: i...
118
  {
e7e9a307b   Gao Xiang   staging: erofs: i...
119
  	preempt_disable();
73f5c66df   Gao Xiang   staging: erofs: f...
120
  	if (val != atomic_cmpxchg(&grp->refcount, val, EROFS_LOCKED_MAGIC)) {
e7e9a307b   Gao Xiang   staging: erofs: i...
121
122
123
  		preempt_enable();
  		return false;
  	}
e7e9a307b   Gao Xiang   staging: erofs: i...
124
125
  	return true;
  }
73f5c66df   Gao Xiang   staging: erofs: f...
126
127
  static inline void erofs_workgroup_unfreeze(struct erofs_workgroup *grp,
  					    int orig_val)
e7e9a307b   Gao Xiang   staging: erofs: i...
128
  {
948bbdb18   Gao Xiang   staging: erofs: a...
129
130
131
132
133
  	/*
  	 * other observers should notice all modifications
  	 * in the freezing period.
  	 */
  	smp_mb();
73f5c66df   Gao Xiang   staging: erofs: f...
134
  	atomic_set(&grp->refcount, orig_val);
e7e9a307b   Gao Xiang   staging: erofs: i...
135
136
  	preempt_enable();
  }
df134b8d1   Gao Xiang   staging: erofs: a...
137
138
139
140
141
142
  static inline int erofs_wait_on_workgroup_freezed(struct erofs_workgroup *grp)
  {
  	return atomic_cond_read_relaxed(&grp->refcount,
  					VAL != EROFS_LOCKED_MAGIC);
  }
  #else
73f5c66df   Gao Xiang   staging: erofs: f...
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
  static inline bool erofs_workgroup_try_to_freeze(struct erofs_workgroup *grp,
  						 int val)
  {
  	preempt_disable();
  	/* no need to spin on UP platforms, let's just disable preemption. */
  	if (val != atomic_read(&grp->refcount)) {
  		preempt_enable();
  		return false;
  	}
  	return true;
  }
  
  static inline void erofs_workgroup_unfreeze(struct erofs_workgroup *grp,
  					    int orig_val)
  {
  	preempt_enable();
  }
df134b8d1   Gao Xiang   staging: erofs: a...
160
161
162
163
164
165
166
167
  static inline int erofs_wait_on_workgroup_freezed(struct erofs_workgroup *grp)
  {
  	int v = atomic_read(&grp->refcount);
  
  	/* workgroup is never freezed on uniprocessor systems */
  	DBG_BUGON(v == EROFS_LOCKED_MAGIC);
  	return v;
  }
14f362b4f   Gao Xiang   staging: erofs: c...
168
  #endif	/* !CONFIG_SMP */
105d4ad85   Gao Xiang   staging: erofs: i...
169

14f362b4f   Gao Xiang   staging: erofs: c...
170
171
172
  /* hard limit of pages per compressed cluster */
  #define Z_EROFS_CLUSTER_MAX_PAGES       (CONFIG_EROFS_FS_CLUSTER_PAGE_LIMIT)
  #define EROFS_PCPUBUF_NR_PAGES          Z_EROFS_CLUSTER_MAX_PAGES
0a0b7e625   Gao Xiang   staging: erofs: a...
173
  #else
14f362b4f   Gao Xiang   staging: erofs: c...
174
  #define EROFS_PCPUBUF_NR_PAGES          0
14f362b4f   Gao Xiang   staging: erofs: c...
175
  #endif	/* !CONFIG_EROFS_FS_ZIP */
e7e9a307b   Gao Xiang   staging: erofs: i...
176

bfb8674dc   Gao Xiang   staging: erofs: a...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  /* we strictly follow PAGE_SIZE and no buffer head yet */
  #define LOG_BLOCK_SIZE		PAGE_SHIFT
  
  #undef LOG_SECTORS_PER_BLOCK
  #define LOG_SECTORS_PER_BLOCK	(PAGE_SHIFT - 9)
  
  #undef SECTORS_PER_BLOCK
  #define SECTORS_PER_BLOCK	(1 << SECTORS_PER_BLOCK)
  
  #define EROFS_BLKSIZ		(1 << LOG_BLOCK_SIZE)
  
  #if (EROFS_BLKSIZ % 4096 || !EROFS_BLKSIZ)
  #error erofs cannot be used in this platform
  #endif
  
  #define ROOT_NID(sb)		((sb)->root_nid)
bfb8674dc   Gao Xiang   staging: erofs: a...
193
194
195
196
197
198
199
200
  #define erofs_blknr(addr)       ((addr) / EROFS_BLKSIZ)
  #define erofs_blkoff(addr)      ((addr) % EROFS_BLKSIZ)
  #define blknr_to_addr(nr)       ((erofs_off_t)(nr) * EROFS_BLKSIZ)
  
  static inline erofs_off_t iloc(struct erofs_sb_info *sbi, erofs_nid_t nid)
  {
  	return blknr_to_addr(sbi->meta_blkaddr) + (nid << sbi->islotbits);
  }
62dc45979   Gao Xiang   staging: erofs: f...
201
  /* atomic flag definitions */
a5876e24f   Gao Xiang   erofs: use erofs_...
202
203
  #define EROFS_I_EA_INITED_BIT	0
  #define EROFS_I_Z_INITED_BIT	1
62dc45979   Gao Xiang   staging: erofs: f...
204
205
  
  /* bitlock definitions (arranged in reverse order) */
a5876e24f   Gao Xiang   erofs: use erofs_...
206
207
  #define EROFS_I_BL_XATTR_BIT	(BITS_PER_LONG - 1)
  #define EROFS_I_BL_Z_BIT	(BITS_PER_LONG - 2)
bfb8674dc   Gao Xiang   staging: erofs: a...
208

a5876e24f   Gao Xiang   erofs: use erofs_...
209
  struct erofs_inode {
bfb8674dc   Gao Xiang   staging: erofs: a...
210
  	erofs_nid_t nid;
62dc45979   Gao Xiang   staging: erofs: f...
211
212
213
  
  	/* atomic flags (including bitlocks) */
  	unsigned long flags;
bfb8674dc   Gao Xiang   staging: erofs: a...
214

8a7656822   Gao Xiang   erofs: better nam...
215
  	unsigned char datalayout;
bfb8674dc   Gao Xiang   staging: erofs: a...
216
217
  	unsigned char inode_isize;
  	unsigned short xattr_isize;
e82a9a17d   Pratik Shinde   staging: erofs:co...
218
219
  	unsigned int xattr_shared_count;
  	unsigned int *xattr_shared_xattrs;
bfb8674dc   Gao Xiang   staging: erofs: a...
220

152a333a5   Gao Xiang   staging: erofs: a...
221
222
223
224
225
226
227
228
229
  	union {
  		erofs_blk_t raw_blkaddr;
  #ifdef CONFIG_EROFS_FS_ZIP
  		struct {
  			unsigned short z_advise;
  			unsigned char  z_algorithmtype[2];
  			unsigned char  z_logical_clusterbits;
  			unsigned char  z_physical_clusterbits[2];
  		};
14f362b4f   Gao Xiang   staging: erofs: c...
230
  #endif	/* CONFIG_EROFS_FS_ZIP */
152a333a5   Gao Xiang   staging: erofs: a...
231
  	};
bfb8674dc   Gao Xiang   staging: erofs: a...
232
233
234
  	/* the corresponding vfs inode */
  	struct inode vfs_inode;
  };
a5876e24f   Gao Xiang   erofs: use erofs_...
235
236
  #define EROFS_I(ptr)	\
  	container_of(ptr, struct erofs_inode, vfs_inode)
bfb8674dc   Gao Xiang   staging: erofs: a...
237

99634bf38   Gao Xiang   erofs: add "erofs...
238
  static inline unsigned long erofs_inode_datablocks(struct inode *inode)
bfb8674dc   Gao Xiang   staging: erofs: a...
239
240
241
242
  {
  	/* since i_size cannot be changed */
  	return DIV_ROUND_UP(inode->i_size, EROFS_BLKSIZ);
  }
8a7656822   Gao Xiang   erofs: better nam...
243
244
245
246
247
248
249
250
251
  static inline unsigned int erofs_bitrange(unsigned int value, unsigned int bit,
  					  unsigned int bits)
  {
  
  	return (value >> bit) & ((1 << bits) - 1);
  }
  
  
  static inline unsigned int erofs_inode_version(unsigned int value)
bfb8674dc   Gao Xiang   staging: erofs: a...
252
  {
8a7656822   Gao Xiang   erofs: better nam...
253
254
  	return erofs_bitrange(value, EROFS_I_VERSION_BIT,
  			      EROFS_I_VERSION_BITS);
bfb8674dc   Gao Xiang   staging: erofs: a...
255
  }
8a7656822   Gao Xiang   erofs: better nam...
256
  static inline unsigned int erofs_inode_datalayout(unsigned int value)
bfb8674dc   Gao Xiang   staging: erofs: a...
257
  {
8a7656822   Gao Xiang   erofs: better nam...
258
259
  	return erofs_bitrange(value, EROFS_I_DATALAYOUT_BIT,
  			      EROFS_I_DATALAYOUT_BITS);
bfb8674dc   Gao Xiang   staging: erofs: a...
260
261
262
  }
  
  extern const struct super_operations erofs_sops;
bfb8674dc   Gao Xiang   staging: erofs: a...
263
264
  
  extern const struct address_space_operations erofs_raw_access_aops;
3883a79ab   Gao Xiang   staging: erofs: i...
265
266
267
  #ifdef CONFIG_EROFS_FS_ZIP
  extern const struct address_space_operations z_erofs_vle_normalaccess_aops;
  #endif
bfb8674dc   Gao Xiang   staging: erofs: a...
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  
  /*
   * Logical to physical block mapping, used by erofs_map_blocks()
   *
   * Different with other file systems, it is used for 2 access modes:
   *
   * 1) RAW access mode:
   *
   * Users pass a valid (m_lblk, m_lofs -- usually 0) pair,
   * and get the valid m_pblk, m_pofs and the longest m_len(in bytes).
   *
   * Note that m_lblk in the RAW access mode refers to the number of
   * the compressed ondisk block rather than the uncompressed
   * in-memory block for the compressed file.
   *
   * m_pofs equals to m_lofs except for the inline data page.
   *
   * 2) Normal access mode:
   *
   * If the inode is not compressed, it has no difference with
   * the RAW access mode. However, if the inode is compressed,
   * users should pass a valid (m_lblk, m_lofs) pair, and get
   * the needed m_pblk, m_pofs, m_len to get the compressed data
   * and the updated m_lblk, m_lofs which indicates the start
   * of the corresponding uncompressed data in the file.
   */
  enum {
  	BH_Zipped = BH_PrivateStart,
b6a76183d   Gao Xiang   staging: erofs: i...
296
  	BH_FullMapped,
bfb8674dc   Gao Xiang   staging: erofs: a...
297
298
299
300
301
302
303
304
  };
  
  /* Has a disk mapping */
  #define EROFS_MAP_MAPPED	(1 << BH_Mapped)
  /* Located in metadata (could be copied from bd_inode) */
  #define EROFS_MAP_META		(1 << BH_Meta)
  /* The extent has been compressed */
  #define EROFS_MAP_ZIPPED	(1 << BH_Zipped)
b6a76183d   Gao Xiang   staging: erofs: i...
305
306
  /* The length of extent is full */
  #define EROFS_MAP_FULL_MAPPED	(1 << BH_FullMapped)
bfb8674dc   Gao Xiang   staging: erofs: a...
307
308
309
310
311
312
  
  struct erofs_map_blocks {
  	erofs_off_t m_pa, m_la;
  	u64 m_plen, m_llen;
  
  	unsigned int m_flags;
3b423417d   Chao Yu   staging: erofs: c...
313
314
  
  	struct page *mpage;
bfb8674dc   Gao Xiang   staging: erofs: a...
315
316
317
318
  };
  
  /* Flags used by erofs_map_blocks() */
  #define EROFS_GET_BLOCKS_RAW    0x0001
152a333a5   Gao Xiang   staging: erofs: a...
319
  /* zmap.c */
3b423417d   Chao Yu   staging: erofs: c...
320
  #ifdef CONFIG_EROFS_FS_ZIP
152a333a5   Gao Xiang   staging: erofs: a...
321
  int z_erofs_fill_inode(struct inode *inode);
3b423417d   Chao Yu   staging: erofs: c...
322
323
324
325
  int z_erofs_map_blocks_iter(struct inode *inode,
  			    struct erofs_map_blocks *map,
  			    int flags);
  #else
ff784a78a   Gao Xiang   staging: erofs: c...
326
  static inline int z_erofs_fill_inode(struct inode *inode) { return -EOPNOTSUPP; }
3b423417d   Chao Yu   staging: erofs: c...
327
328
329
330
  static inline int z_erofs_map_blocks_iter(struct inode *inode,
  					  struct erofs_map_blocks *map,
  					  int flags)
  {
ff784a78a   Gao Xiang   staging: erofs: c...
331
  	return -EOPNOTSUPP;
3b423417d   Chao Yu   staging: erofs: c...
332
  }
14f362b4f   Gao Xiang   staging: erofs: c...
333
  #endif	/* !CONFIG_EROFS_FS_ZIP */
3b423417d   Chao Yu   staging: erofs: c...
334

bfb8674dc   Gao Xiang   staging: erofs: a...
335
  /* data.c */
e655b5b3a   Gao Xiang   erofs: kill prio ...
336
  struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr);
6e78901a9   Gao Xiang   staging: erofs: s...
337

2e1d66379   Gao Xiang   staging: erofs: d...
338
  int erofs_map_blocks(struct inode *, struct erofs_map_blocks *, int);
bfb8674dc   Gao Xiang   staging: erofs: a...
339

bfb8674dc   Gao Xiang   staging: erofs: a...
340
  /* inode.c */
2abd78141   Gao Xiang   staging: erofs: h...
341
342
343
344
345
346
347
348
  static inline unsigned long erofs_inode_hash(erofs_nid_t nid)
  {
  #if BITS_PER_LONG == 32
  	return (nid >> 32) ^ (nid & 0xffffffff);
  #else
  	return nid;
  #endif
  }
609398266   Gao Xiang   staging: erofs: r...
349
350
351
  extern const struct inode_operations erofs_generic_iops;
  extern const struct inode_operations erofs_symlink_iops;
  extern const struct inode_operations erofs_fast_symlink_iops;
b17500a0f   Gao Xiang   staging: erofs: i...
352

2e1d66379   Gao Xiang   staging: erofs: d...
353
  struct inode *erofs_iget(struct super_block *sb, erofs_nid_t nid, bool dir);
89f27eded   Gao Xiang   staging: erofs: s...
354
355
  int erofs_getattr(const struct path *path, struct kstat *stat,
  		  u32 request_mask, unsigned int query_flags);
2e1d66379   Gao Xiang   staging: erofs: d...
356

609398266   Gao Xiang   staging: erofs: r...
357
358
359
360
361
362
363
364
  /* namei.c */
  extern const struct inode_operations erofs_dir_iops;
  
  int erofs_namei(struct inode *dir, struct qstr *name,
  		erofs_nid_t *nid, unsigned int *d_type);
  
  /* dir.c */
  extern const struct file_operations erofs_dir_fops;
14f362b4f   Gao Xiang   staging: erofs: c...
365
  /* utils.c / zdata.c */
b25a15191   Gao Xiang   staging: erofs: r...
366
  struct page *erofs_allocpage(struct list_head *pool, gfp_t gfp, bool nofail);
fa61a33f5   Gao Xiang   staging: erofs: m...
367
368
369
370
371
372
373
374
375
376
  
  #if (EROFS_PCPUBUF_NR_PAGES > 0)
  void *erofs_get_pcpubuf(unsigned int pagenr);
  #define erofs_put_pcpubuf(buf) do { \
  	(void)&(buf);	\
  	preempt_enable();	\
  } while (0)
  #else
  static inline void *erofs_get_pcpubuf(unsigned int pagenr)
  {
ff784a78a   Gao Xiang   staging: erofs: c...
377
  	return ERR_PTR(-EOPNOTSUPP);
fa61a33f5   Gao Xiang   staging: erofs: m...
378
379
380
381
  }
  
  #define erofs_put_pcpubuf(buf) do {} while (0)
  #endif
22fe04a77   Gao Xiang   staging: erofs: c...
382
  #ifdef CONFIG_EROFS_FS_ZIP
14f362b4f   Gao Xiang   staging: erofs: c...
383
384
385
386
387
  int erofs_workgroup_put(struct erofs_workgroup *grp);
  struct erofs_workgroup *erofs_find_workgroup(struct super_block *sb,
  					     pgoff_t index, bool *tag);
  int erofs_register_workgroup(struct super_block *sb,
  			     struct erofs_workgroup *grp, bool tag);
14f362b4f   Gao Xiang   staging: erofs: c...
388
  void erofs_workgroup_free_rcu(struct erofs_workgroup *grp);
22fe04a77   Gao Xiang   staging: erofs: c...
389
390
391
392
393
394
  void erofs_shrinker_register(struct super_block *sb);
  void erofs_shrinker_unregister(struct super_block *sb);
  int __init erofs_init_shrinker(void);
  void erofs_exit_shrinker(void);
  int __init z_erofs_init_zip_subsystem(void);
  void z_erofs_exit_zip_subsystem(void);
14f362b4f   Gao Xiang   staging: erofs: c...
395
396
397
398
  int erofs_try_to_free_all_cached_pages(struct erofs_sb_info *sbi,
  				       struct erofs_workgroup *egrp);
  int erofs_try_to_free_cached_page(struct address_space *mapping,
  				  struct page *page);
22fe04a77   Gao Xiang   staging: erofs: c...
399
400
401
402
403
404
405
406
  #else
  static inline void erofs_shrinker_register(struct super_block *sb) {}
  static inline void erofs_shrinker_unregister(struct super_block *sb) {}
  static inline int erofs_init_shrinker(void) { return 0; }
  static inline void erofs_exit_shrinker(void) {}
  static inline int z_erofs_init_zip_subsystem(void) { return 0; }
  static inline void z_erofs_exit_zip_subsystem(void) {}
  #endif	/* !CONFIG_EROFS_FS_ZIP */
2e1d66379   Gao Xiang   staging: erofs: d...
407

a6b9b1d5e   Gao Xiang   staging: erofs: i...
408
  #define EFSCORRUPTED    EUCLEAN         /* Filesystem is corrupted */
14f362b4f   Gao Xiang   staging: erofs: c...
409
  #endif	/* __EROFS_INTERNAL_H */
bfb8674dc   Gao Xiang   staging: erofs: a...
410