1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* |
3 | * NILFS segment usage file. |
4 | * |
5 | * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation. |
6 | * |
7 | * Written by Koji Sato. |
8 | */ |
9 | |
10 | #ifndef _NILFS_SUFILE_H |
11 | #define _NILFS_SUFILE_H |
12 | |
13 | #include <linux/fs.h> |
14 | #include <linux/buffer_head.h> |
15 | #include "mdt.h" |
16 | |
17 | |
18 | static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile) |
19 | { |
20 | return ((struct the_nilfs *)sufile->i_sb->s_fs_info)->ns_nsegments; |
21 | } |
22 | |
23 | unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile); |
24 | |
25 | int nilfs_sufile_set_alloc_range(struct inode *sufile, __u64 start, __u64 end); |
26 | int nilfs_sufile_alloc(struct inode *, __u64 *); |
27 | int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum); |
28 | int nilfs_sufile_set_segment_usage(struct inode *sufile, __u64 segnum, |
29 | unsigned long nblocks, time64_t modtime); |
30 | int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *); |
31 | ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, void *, unsigned int, |
32 | size_t); |
33 | ssize_t nilfs_sufile_set_suinfo(struct inode *, void *, unsigned int, size_t); |
34 | |
35 | int nilfs_sufile_updatev(struct inode *, __u64 *, size_t, int, size_t *, |
36 | void (*dofunc)(struct inode *, __u64, |
37 | struct buffer_head *, |
38 | struct buffer_head *)); |
39 | int nilfs_sufile_update(struct inode *, __u64, int, |
40 | void (*dofunc)(struct inode *, __u64, |
41 | struct buffer_head *, |
42 | struct buffer_head *)); |
43 | void nilfs_sufile_do_scrap(struct inode *, __u64, struct buffer_head *, |
44 | struct buffer_head *); |
45 | void nilfs_sufile_do_free(struct inode *, __u64, struct buffer_head *, |
46 | struct buffer_head *); |
47 | void nilfs_sufile_do_cancel_free(struct inode *, __u64, struct buffer_head *, |
48 | struct buffer_head *); |
49 | void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *, |
50 | struct buffer_head *); |
51 | |
52 | int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs); |
53 | int nilfs_sufile_read(struct super_block *sb, size_t susize, |
54 | struct nilfs_inode *raw_inode, struct inode **inodep); |
55 | int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range); |
56 | |
57 | /** |
58 | * nilfs_sufile_scrap - make a segment garbage |
59 | * @sufile: inode of segment usage file |
60 | * @segnum: segment number to be freed |
61 | */ |
62 | static inline int nilfs_sufile_scrap(struct inode *sufile, __u64 segnum) |
63 | { |
64 | return nilfs_sufile_update(sufile, segnum, 1, dofunc: nilfs_sufile_do_scrap); |
65 | } |
66 | |
67 | /** |
68 | * nilfs_sufile_free - free segment |
69 | * @sufile: inode of segment usage file |
70 | * @segnum: segment number to be freed |
71 | */ |
72 | static inline int nilfs_sufile_free(struct inode *sufile, __u64 segnum) |
73 | { |
74 | return nilfs_sufile_update(sufile, segnum, 0, dofunc: nilfs_sufile_do_free); |
75 | } |
76 | |
77 | /** |
78 | * nilfs_sufile_freev - free segments |
79 | * @sufile: inode of segment usage file |
80 | * @segnumv: array of segment numbers |
81 | * @nsegs: size of @segnumv array |
82 | * @ndone: place to store the number of freed segments |
83 | */ |
84 | static inline int nilfs_sufile_freev(struct inode *sufile, __u64 *segnumv, |
85 | size_t nsegs, size_t *ndone) |
86 | { |
87 | return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone, |
88 | dofunc: nilfs_sufile_do_free); |
89 | } |
90 | |
91 | /** |
92 | * nilfs_sufile_cancel_freev - reallocate freeing segments |
93 | * @sufile: inode of segment usage file |
94 | * @segnumv: array of segment numbers |
95 | * @nsegs: size of @segnumv array |
96 | * @ndone: place to store the number of cancelled segments |
97 | * |
98 | * Return Value: On success, 0 is returned. On error, a negative error codes |
99 | * is returned. |
100 | */ |
101 | static inline int nilfs_sufile_cancel_freev(struct inode *sufile, |
102 | __u64 *segnumv, size_t nsegs, |
103 | size_t *ndone) |
104 | { |
105 | return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone, |
106 | dofunc: nilfs_sufile_do_cancel_free); |
107 | } |
108 | |
109 | /** |
110 | * nilfs_sufile_set_error - mark a segment as erroneous |
111 | * @sufile: inode of segment usage file |
112 | * @segnum: segment number |
113 | * |
114 | * Description: nilfs_sufile_set_error() marks the segment specified by |
115 | * @segnum as erroneous. The error segment will never be used again. |
116 | * |
117 | * Return Value: On success, 0 is returned. On error, one of the following |
118 | * negative error codes is returned. |
119 | * |
120 | * %-EIO - I/O error. |
121 | * |
122 | * %-ENOMEM - Insufficient amount of memory available. |
123 | * |
124 | * %-EINVAL - Invalid segment usage number. |
125 | */ |
126 | static inline int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum) |
127 | { |
128 | return nilfs_sufile_update(sufile, segnum, 0, |
129 | dofunc: nilfs_sufile_do_set_error); |
130 | } |
131 | |
132 | #endif /* _NILFS_SUFILE_H */ |
133 | |