Root/
1 | /* |
2 | * sufile.h - NILFS segment usage file. |
3 | * |
4 | * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation. |
5 | * |
6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * (at your option) any later version. |
10 | * |
11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
19 | * |
20 | * Written by Koji Sato <koji@osrg.net>. |
21 | */ |
22 | |
23 | #ifndef _NILFS_SUFILE_H |
24 | #define _NILFS_SUFILE_H |
25 | |
26 | #include <linux/fs.h> |
27 | #include <linux/buffer_head.h> |
28 | #include <linux/nilfs2_fs.h> |
29 | #include "mdt.h" |
30 | |
31 | |
32 | static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile) |
33 | { |
34 | return NILFS_MDT(sufile)->mi_nilfs->ns_nsegments; |
35 | } |
36 | |
37 | unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile); |
38 | |
39 | int nilfs_sufile_alloc(struct inode *, __u64 *); |
40 | int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum); |
41 | int nilfs_sufile_set_segment_usage(struct inode *sufile, __u64 segnum, |
42 | unsigned long nblocks, time_t modtime); |
43 | int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *); |
44 | ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, void *, unsigned, |
45 | size_t); |
46 | |
47 | int nilfs_sufile_updatev(struct inode *, __u64 *, size_t, int, size_t *, |
48 | void (*dofunc)(struct inode *, __u64, |
49 | struct buffer_head *, |
50 | struct buffer_head *)); |
51 | int nilfs_sufile_update(struct inode *, __u64, int, |
52 | void (*dofunc)(struct inode *, __u64, |
53 | struct buffer_head *, |
54 | struct buffer_head *)); |
55 | void nilfs_sufile_do_scrap(struct inode *, __u64, struct buffer_head *, |
56 | struct buffer_head *); |
57 | void nilfs_sufile_do_free(struct inode *, __u64, struct buffer_head *, |
58 | struct buffer_head *); |
59 | void nilfs_sufile_do_cancel_free(struct inode *, __u64, struct buffer_head *, |
60 | struct buffer_head *); |
61 | void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *, |
62 | struct buffer_head *); |
63 | |
64 | int nilfs_sufile_read(struct inode *sufile, struct nilfs_inode *raw_inode); |
65 | struct inode *nilfs_sufile_new(struct the_nilfs *nilfs, size_t susize); |
66 | |
67 | /** |
68 | * nilfs_sufile_scrap - make a segment garbage |
69 | * @sufile: inode of segment usage file |
70 | * @segnum: segment number to be freed |
71 | */ |
72 | static inline int nilfs_sufile_scrap(struct inode *sufile, __u64 segnum) |
73 | { |
74 | return nilfs_sufile_update(sufile, segnum, 1, nilfs_sufile_do_scrap); |
75 | } |
76 | |
77 | /** |
78 | * nilfs_sufile_free - free segment |
79 | * @sufile: inode of segment usage file |
80 | * @segnum: segment number to be freed |
81 | */ |
82 | static inline int nilfs_sufile_free(struct inode *sufile, __u64 segnum) |
83 | { |
84 | return nilfs_sufile_update(sufile, segnum, 0, nilfs_sufile_do_free); |
85 | } |
86 | |
87 | /** |
88 | * nilfs_sufile_freev - free segments |
89 | * @sufile: inode of segment usage file |
90 | * @segnumv: array of segment numbers |
91 | * @nsegs: size of @segnumv array |
92 | * @ndone: place to store the number of freed segments |
93 | */ |
94 | static inline int nilfs_sufile_freev(struct inode *sufile, __u64 *segnumv, |
95 | size_t nsegs, size_t *ndone) |
96 | { |
97 | return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone, |
98 | nilfs_sufile_do_free); |
99 | } |
100 | |
101 | /** |
102 | * nilfs_sufile_cancel_freev - reallocate freeing segments |
103 | * @sufile: inode of segment usage file |
104 | * @segnumv: array of segment numbers |
105 | * @nsegs: size of @segnumv array |
106 | * @ndone: place to store the number of cancelled segments |
107 | * |
108 | * Return Value: On success, 0 is returned. On error, a negative error codes |
109 | * is returned. |
110 | */ |
111 | static inline int nilfs_sufile_cancel_freev(struct inode *sufile, |
112 | __u64 *segnumv, size_t nsegs, |
113 | size_t *ndone) |
114 | { |
115 | return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone, |
116 | nilfs_sufile_do_cancel_free); |
117 | } |
118 | |
119 | /** |
120 | * nilfs_sufile_set_error - mark a segment as erroneous |
121 | * @sufile: inode of segment usage file |
122 | * @segnum: segment number |
123 | * |
124 | * Description: nilfs_sufile_set_error() marks the segment specified by |
125 | * @segnum as erroneous. The error segment will never be used again. |
126 | * |
127 | * Return Value: On success, 0 is returned. On error, one of the following |
128 | * negative error codes is returned. |
129 | * |
130 | * %-EIO - I/O error. |
131 | * |
132 | * %-ENOMEM - Insufficient amount of memory available. |
133 | * |
134 | * %-EINVAL - Invalid segment usage number. |
135 | */ |
136 | static inline int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum) |
137 | { |
138 | return nilfs_sufile_update(sufile, segnum, 0, |
139 | nilfs_sufile_do_set_error); |
140 | } |
141 | |
142 | #endif /* _NILFS_SUFILE_H */ |
143 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9