Blame view

fs/nilfs2/sufile.h 4.7 KB
6c98cd4ec   Koji Sato   nilfs2: segment u...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * sufile.h - NILFS segment usage file.
   *
   * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
4b420ab4e   Ryusuke Konishi   nilfs2: clean up ...
16
   * Written by Koji Sato.
6c98cd4ec   Koji Sato   nilfs2: segment u...
17
18
19
20
21
22
23
   */
  
  #ifndef _NILFS_SUFILE_H
  #define _NILFS_SUFILE_H
  
  #include <linux/fs.h>
  #include <linux/buffer_head.h>
6c98cd4ec   Koji Sato   nilfs2: segment u...
24
  #include "mdt.h"
6c98cd4ec   Koji Sato   nilfs2: segment u...
25
26
27
  
  static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile)
  {
0ef28f9ae   Ryusuke Konishi   nilfs2: get rid o...
28
  	return ((struct the_nilfs *)sufile->i_sb->s_fs_info)->ns_nsegments;
6c98cd4ec   Koji Sato   nilfs2: segment u...
29
  }
ef7d4757a   Ryusuke Konishi   nilfs2: simplify ...
30
  unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile);
619205da5   Ryusuke Konishi   nilfs2: add ioctl...
31
  int nilfs_sufile_set_alloc_range(struct inode *sufile, __u64 start, __u64 end);
6c98cd4ec   Koji Sato   nilfs2: segment u...
32
  int nilfs_sufile_alloc(struct inode *, __u64 *);
61a189e9c   Ryusuke Konishi   nilfs2: move rout...
33
  int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum);
071ec54dd   Ryusuke Konishi   nilfs2: move rout...
34
35
  int nilfs_sufile_set_segment_usage(struct inode *sufile, __u64 segnum,
  				   unsigned long nblocks, time_t modtime);
6c98cd4ec   Koji Sato   nilfs2: segment u...
36
  int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *);
f19e78dee   Ryusuke Konishi   nilfs2: remove sp...
37
  ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, void *, unsigned int,
6c98cd4ec   Koji Sato   nilfs2: segment u...
38
  				size_t);
f19e78dee   Ryusuke Konishi   nilfs2: remove sp...
39
  ssize_t nilfs_sufile_set_suinfo(struct inode *, void *, unsigned int, size_t);
6c98cd4ec   Koji Sato   nilfs2: segment u...
40

dda54f4b8   Ryusuke Konishi   nilfs2: add sufil...
41
42
43
44
  int nilfs_sufile_updatev(struct inode *, __u64 *, size_t, int, size_t *,
  			 void (*dofunc)(struct inode *, __u64,
  					struct buffer_head *,
  					struct buffer_head *));
a703018f7   Ryusuke Konishi   nilfs2: segment u...
45
46
47
48
  int nilfs_sufile_update(struct inode *, __u64, int,
  			void (*dofunc)(struct inode *, __u64,
  				       struct buffer_head *,
  				       struct buffer_head *));
c85399c2d   Ryusuke Konishi   nilfs2: fix possi...
49
50
  void nilfs_sufile_do_scrap(struct inode *, __u64, struct buffer_head *,
  			   struct buffer_head *);
a703018f7   Ryusuke Konishi   nilfs2: segment u...
51
52
  void nilfs_sufile_do_free(struct inode *, __u64, struct buffer_head *,
  			  struct buffer_head *);
071cb4b81   Ryusuke Konishi   nilfs2: eliminate...
53
54
  void nilfs_sufile_do_cancel_free(struct inode *, __u64, struct buffer_head *,
  				 struct buffer_head *);
a703018f7   Ryusuke Konishi   nilfs2: segment u...
55
56
  void nilfs_sufile_do_set_error(struct inode *, __u64, struct buffer_head *,
  			       struct buffer_head *);
4e33f9eab   Ryusuke Konishi   nilfs2: implement...
57
  int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs);
f1e89c86f   Ryusuke Konishi   nilfs2: use iget ...
58
59
  int nilfs_sufile_read(struct super_block *sb, size_t susize,
  		      struct nilfs_inode *raw_inode, struct inode **inodep);
82e11e857   Andreas Rohner   nilfs2: add nilfs...
60
  int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range);
79739565e   Ryusuke Konishi   nilfs2: separate ...
61

a703018f7   Ryusuke Konishi   nilfs2: segment u...
62
  /**
c85399c2d   Ryusuke Konishi   nilfs2: fix possi...
63
64
65
66
67
68
69
70
71
72
   * nilfs_sufile_scrap - make a segment garbage
   * @sufile: inode of segment usage file
   * @segnum: segment number to be freed
   */
  static inline int nilfs_sufile_scrap(struct inode *sufile, __u64 segnum)
  {
  	return nilfs_sufile_update(sufile, segnum, 1, nilfs_sufile_do_scrap);
  }
  
  /**
a703018f7   Ryusuke Konishi   nilfs2: segment u...
73
74
75
76
77
78
79
80
81
82
   * nilfs_sufile_free - free segment
   * @sufile: inode of segment usage file
   * @segnum: segment number to be freed
   */
  static inline int nilfs_sufile_free(struct inode *sufile, __u64 segnum)
  {
  	return nilfs_sufile_update(sufile, segnum, 0, nilfs_sufile_do_free);
  }
  
  /**
071cb4b81   Ryusuke Konishi   nilfs2: eliminate...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
   * nilfs_sufile_freev - free segments
   * @sufile: inode of segment usage file
   * @segnumv: array of segment numbers
   * @nsegs: size of @segnumv array
   * @ndone: place to store the number of freed segments
   */
  static inline int nilfs_sufile_freev(struct inode *sufile, __u64 *segnumv,
  				     size_t nsegs, size_t *ndone)
  {
  	return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone,
  				    nilfs_sufile_do_free);
  }
  
  /**
   * nilfs_sufile_cancel_freev - reallocate freeing segments
   * @sufile: inode of segment usage file
   * @segnumv: array of segment numbers
   * @nsegs: size of @segnumv array
   * @ndone: place to store the number of cancelled segments
   *
   * Return Value: On success, 0 is returned. On error, a negative error codes
   * is returned.
   */
  static inline int nilfs_sufile_cancel_freev(struct inode *sufile,
  					    __u64 *segnumv, size_t nsegs,
  					    size_t *ndone)
  {
  	return nilfs_sufile_updatev(sufile, segnumv, nsegs, 0, ndone,
  				    nilfs_sufile_do_cancel_free);
  }
  
  /**
a703018f7   Ryusuke Konishi   nilfs2: segment u...
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
   * nilfs_sufile_set_error - mark a segment as erroneous
   * @sufile: inode of segment usage file
   * @segnum: segment number
   *
   * Description: nilfs_sufile_set_error() marks the segment specified by
   * @segnum as erroneous. The error segment will never be used again.
   *
   * Return Value: On success, 0 is returned. On error, one of the following
   * negative error codes is returned.
   *
   * %-EIO - I/O error.
   *
   * %-ENOMEM - Insufficient amount of memory available.
   *
   * %-EINVAL - Invalid segment usage number.
   */
  static inline int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum)
  {
  	return nilfs_sufile_update(sufile, segnum, 0,
  				   nilfs_sufile_do_set_error);
  }
6c98cd4ec   Koji Sato   nilfs2: segment u...
136
137
  
  #endif	/* _NILFS_SUFILE_H */