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