1ae98043fSRyusuke Konishi /* SPDX-License-Identifier: GPL-2.0+ */
26c98cd4eSKoji Sato /*
3*94ee1d91SRyusuke Konishi * NILFS segment usage file.
46c98cd4eSKoji Sato *
56c98cd4eSKoji Sato * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation.
66c98cd4eSKoji Sato *
74b420ab4SRyusuke Konishi * Written by Koji Sato.
86c98cd4eSKoji Sato */
96c98cd4eSKoji Sato
106c98cd4eSKoji Sato #ifndef _NILFS_SUFILE_H
116c98cd4eSKoji Sato #define _NILFS_SUFILE_H
126c98cd4eSKoji Sato
136c98cd4eSKoji Sato #include <linux/fs.h>
146c98cd4eSKoji Sato #include <linux/buffer_head.h>
156c98cd4eSKoji Sato #include "mdt.h"
166c98cd4eSKoji Sato
176c98cd4eSKoji Sato
nilfs_sufile_get_nsegments(struct inode * sufile)186c98cd4eSKoji Sato static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile)
196c98cd4eSKoji Sato {
200ef28f9aSRyusuke Konishi return ((struct the_nilfs *)sufile->i_sb->s_fs_info)->ns_nsegments;
216c98cd4eSKoji Sato }
226c98cd4eSKoji Sato
23ef7d4757SRyusuke Konishi unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile);
24ef7d4757SRyusuke Konishi
25619205daSRyusuke Konishi int nilfs_sufile_set_alloc_range(struct inode *sufile, __u64 start, __u64 end);
266c98cd4eSKoji Sato int nilfs_sufile_alloc(struct inode *, __u64 *);
2761a189e9SRyusuke Konishi int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum);
28071ec54dSRyusuke Konishi int nilfs_sufile_set_segment_usage(struct inode *sufile, __u64 segnum,
29fb04b91bSArnd Bergmann unsigned long nblocks, time64_t modtime);
306c98cd4eSKoji Sato int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *);
31f19e78deSRyusuke Konishi ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, void *, unsigned int,
326c98cd4eSKoji Sato size_t);
33f19e78deSRyusuke Konishi ssize_t nilfs_sufile_set_suinfo(struct inode *, void *, unsigned int, size_t);
346c98cd4eSKoji Sato
35dda54f4bSRyusuke Konishi int nilfs_sufile_updatev(struct inode *, __u64 *, size_t, int, size_t *,
36dda54f4bSRyusuke Konishi void (*dofunc)(struct inode *, __u64,
37dda54f4bSRyusuke Konishi struct buffer_head *,
38dda54f4bSRyusuke Konishi struct buffer_head *));
39a703018fSRyusuke Konishi int nilfs_sufile_update(struct inode *, __u64, int,
40a703018fSRyusuke Konishi void (*dofunc)(struct inode *, __u64,
41a703018fSRyusuke Konishi struct buffer_head *,
42a703018fSRyusuke Konishi struct buffer_head *));
43c85399c2SRyusuke Konishi void nilfs_sufile_do_scrap(struct inode *, __u64, struct buffer_head *,
44c85399c2SRyusuke Konishi struct buffer_head *);
45a703018fSRyusuke Konishi void nilfs_sufile_do_free(struct inode *, __u64, struct buffer_head *,
46a703018fSRyusuke Konishi struct buffer_head *);
47071cb4b8SRyusuke Konishi void nilfs_sufile_do_cancel_free(struct inode *, __u64, struct buffer_head *,
48071cb4b8SRyusuke Konishi struct buffer_head *);
49a703018fSRyusuke Konishi void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *,
50a703018fSRyusuke Konishi struct buffer_head *);
51a703018fSRyusuke Konishi
524e33f9eaSRyusuke Konishi int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs);
53f1e89c86SRyusuke Konishi int nilfs_sufile_read(struct super_block *sb, size_t susize,
54f1e89c86SRyusuke Konishi struct nilfs_inode *raw_inode, struct inode **inodep);
5582e11e85SAndreas Rohner int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range);
5679739565SRyusuke Konishi
57a703018fSRyusuke Konishi /**
58c85399c2SRyusuke Konishi * nilfs_sufile_scrap - make a segment garbage
59c85399c2SRyusuke Konishi * @sufile: inode of segment usage file
60c85399c2SRyusuke Konishi * @segnum: segment number to be freed
61c85399c2SRyusuke Konishi */
nilfs_sufile_scrap(struct inode * sufile,__u64 segnum)62c85399c2SRyusuke Konishi static inline int nilfs_sufile_scrap(struct inode *sufile, __u64 segnum)
63c85399c2SRyusuke Konishi {
64c85399c2SRyusuke Konishi return nilfs_sufile_update(sufile, segnum, 1, nilfs_sufile_do_scrap);
65c85399c2SRyusuke Konishi }
66c85399c2SRyusuke Konishi
67c85399c2SRyusuke Konishi /**
68a703018fSRyusuke Konishi * nilfs_sufile_free - free segment
69a703018fSRyusuke Konishi * @sufile: inode of segment usage file
70a703018fSRyusuke Konishi * @segnum: segment number to be freed
71a703018fSRyusuke Konishi */
nilfs_sufile_free(struct inode * sufile,__u64 segnum)72a703018fSRyusuke Konishi static inline int nilfs_sufile_free(struct inode *sufile, __u64 segnum)
73a703018fSRyusuke Konishi {
74a703018fSRyusuke Konishi return nilfs_sufile_update(sufile, segnum, 0, nilfs_sufile_do_free);
75a703018fSRyusuke Konishi }
76a703018fSRyusuke Konishi
77a703018fSRyusuke Konishi /**
78071cb4b8SRyusuke Konishi * nilfs_sufile_freev - free segments
79071cb4b8SRyusuke Konishi * @sufile: inode of segment usage file
80071cb4b8SRyusuke Konishi * @segnumv: array of segment numbers
81071cb4b8SRyusuke Konishi * @nsegs: size of @segnumv array
82071cb4b8SRyusuke Konishi * @ndone: place to store the number of freed segments
83071cb4b8SRyusuke Konishi */
nilfs_sufile_freev(struct inode * sufile,__u64 * segnumv,size_t nsegs,size_t * ndone)84071cb4b8SRyusuke Konishi static inline int nilfs_sufile_freev(struct inode *sufile, __u64 *segnumv,
85071cb4b8SRyusuke Konishi size_t nsegs, size_t *ndone)
86071cb4b8SRyusuke Konishi {
87071cb4b8SRyusuke Konishi return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone,
88071cb4b8SRyusuke Konishi nilfs_sufile_do_free);
89071cb4b8SRyusuke Konishi }
90071cb4b8SRyusuke Konishi
91071cb4b8SRyusuke Konishi /**
92071cb4b8SRyusuke Konishi * nilfs_sufile_cancel_freev - reallocate freeing segments
93071cb4b8SRyusuke Konishi * @sufile: inode of segment usage file
94071cb4b8SRyusuke Konishi * @segnumv: array of segment numbers
95071cb4b8SRyusuke Konishi * @nsegs: size of @segnumv array
96071cb4b8SRyusuke Konishi * @ndone: place to store the number of cancelled segments
97071cb4b8SRyusuke Konishi *
98071cb4b8SRyusuke Konishi * Return Value: On success, 0 is returned. On error, a negative error codes
99071cb4b8SRyusuke Konishi * is returned.
100071cb4b8SRyusuke Konishi */
nilfs_sufile_cancel_freev(struct inode * sufile,__u64 * segnumv,size_t nsegs,size_t * ndone)101071cb4b8SRyusuke Konishi static inline int nilfs_sufile_cancel_freev(struct inode *sufile,
102071cb4b8SRyusuke Konishi __u64 *segnumv, size_t nsegs,
103071cb4b8SRyusuke Konishi size_t *ndone)
104071cb4b8SRyusuke Konishi {
105071cb4b8SRyusuke Konishi return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone,
106071cb4b8SRyusuke Konishi nilfs_sufile_do_cancel_free);
107071cb4b8SRyusuke Konishi }
108071cb4b8SRyusuke Konishi
109071cb4b8SRyusuke Konishi /**
110a703018fSRyusuke Konishi * nilfs_sufile_set_error - mark a segment as erroneous
111a703018fSRyusuke Konishi * @sufile: inode of segment usage file
112a703018fSRyusuke Konishi * @segnum: segment number
113a703018fSRyusuke Konishi *
114a703018fSRyusuke Konishi * Description: nilfs_sufile_set_error() marks the segment specified by
115a703018fSRyusuke Konishi * @segnum as erroneous. The error segment will never be used again.
116a703018fSRyusuke Konishi *
117a703018fSRyusuke Konishi * Return Value: On success, 0 is returned. On error, one of the following
118a703018fSRyusuke Konishi * negative error codes is returned.
119a703018fSRyusuke Konishi *
120a703018fSRyusuke Konishi * %-EIO - I/O error.
121a703018fSRyusuke Konishi *
122a703018fSRyusuke Konishi * %-ENOMEM - Insufficient amount of memory available.
123a703018fSRyusuke Konishi *
124a703018fSRyusuke Konishi * %-EINVAL - Invalid segment usage number.
125a703018fSRyusuke Konishi */
nilfs_sufile_set_error(struct inode * sufile,__u64 segnum)126a703018fSRyusuke Konishi static inline int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum)
127a703018fSRyusuke Konishi {
128a703018fSRyusuke Konishi return nilfs_sufile_update(sufile, segnum, 0,
129a703018fSRyusuke Konishi nilfs_sufile_do_set_error);
130a703018fSRyusuke Konishi }
1316c98cd4eSKoji Sato
1326c98cd4eSKoji Sato #endif /* _NILFS_SUFILE_H */
133