aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2010-06-06 09:50:39 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-08-09 16:48:04 -0400
commit9df2f85128def59185f8a1c584f8af41df17405a (patch)
tree42a861708d9180d3dd838491af6a6be5de526614
parentac14a95b5239d37b6082c3791b88d7ab4e8e444c (diff)
switch bfs to ->evict_inode(), clean up
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/bfs/inode.c70
1 files changed, 32 insertions, 38 deletions
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c
index f22a7d3dc362..0499822b1568 100644
--- a/fs/bfs/inode.c
+++ b/fs/bfs/inode.c
@@ -99,6 +99,24 @@ error:
99 return ERR_PTR(-EIO); 99 return ERR_PTR(-EIO);
100} 100}
101 101
102static struct bfs_inode *find_inode(struct super_block *sb, u16 ino, struct buffer_head **p)
103{
104 if ((ino < BFS_ROOT_INO) || (ino > BFS_SB(sb)->si_lasti)) {
105 printf("Bad inode number %s:%08x\n", sb->s_id, ino);
106 return ERR_PTR(-EIO);
107 }
108
109 ino -= BFS_ROOT_INO;
110
111 *p = sb_bread(sb, 1 + ino / BFS_INODES_PER_BLOCK);
112 if (!*p) {
113 printf("Unable to read inode %s:%08x\n", sb->s_id, ino);
114 return ERR_PTR(-EIO);
115 }
116
117 return (struct bfs_inode *)(*p)->b_data + ino % BFS_INODES_PER_BLOCK;
118}
119
102static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc) 120static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc)
103{ 121{
104 struct bfs_sb_info *info = BFS_SB(inode->i_sb); 122 struct bfs_sb_info *info = BFS_SB(inode->i_sb);
@@ -106,28 +124,15 @@ static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc)
106 unsigned long i_sblock; 124 unsigned long i_sblock;
107 struct bfs_inode *di; 125 struct bfs_inode *di;
108 struct buffer_head *bh; 126 struct buffer_head *bh;
109 int block, off;
110 int err = 0; 127 int err = 0;
111 128
112 dprintf("ino=%08x\n", ino); 129 dprintf("ino=%08x\n", ino);
113 130
114 if ((ino < BFS_ROOT_INO) || (ino > BFS_SB(inode->i_sb)->si_lasti)) { 131 di = find_inode(inode->i_sb, ino, &bh);
115 printf("Bad inode number %s:%08x\n", inode->i_sb->s_id, ino); 132 if (IS_ERR(di))
116 return -EIO; 133 return PTR_ERR(di);
117 }
118 134
119 mutex_lock(&info->bfs_lock); 135 mutex_lock(&info->bfs_lock);
120 block = (ino - BFS_ROOT_INO) / BFS_INODES_PER_BLOCK + 1;
121 bh = sb_bread(inode->i_sb, block);
122 if (!bh) {
123 printf("Unable to read inode %s:%08x\n",
124 inode->i_sb->s_id, ino);
125 mutex_unlock(&info->bfs_lock);
126 return -EIO;
127 }
128
129 off = (ino - BFS_ROOT_INO) % BFS_INODES_PER_BLOCK;
130 di = (struct bfs_inode *)bh->b_data + off;
131 136
132 if (ino == BFS_ROOT_INO) 137 if (ino == BFS_ROOT_INO)
133 di->i_vtype = cpu_to_le32(BFS_VDIR); 138 di->i_vtype = cpu_to_le32(BFS_VDIR);
@@ -158,12 +163,11 @@ static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc)
158 return err; 163 return err;
159} 164}
160 165
161static void bfs_delete_inode(struct inode *inode) 166static void bfs_evict_inode(struct inode *inode)
162{ 167{
163 unsigned long ino = inode->i_ino; 168 unsigned long ino = inode->i_ino;
164 struct bfs_inode *di; 169 struct bfs_inode *di;
165 struct buffer_head *bh; 170 struct buffer_head *bh;
166 int block, off;
167 struct super_block *s = inode->i_sb; 171 struct super_block *s = inode->i_sb;
168 struct bfs_sb_info *info = BFS_SB(s); 172 struct bfs_sb_info *info = BFS_SB(s);
169 struct bfs_inode_info *bi = BFS_I(inode); 173 struct bfs_inode_info *bi = BFS_I(inode);
@@ -171,28 +175,19 @@ static void bfs_delete_inode(struct inode *inode)
171 dprintf("ino=%08lx\n", ino); 175 dprintf("ino=%08lx\n", ino);
172 176
173 truncate_inode_pages(&inode->i_data, 0); 177 truncate_inode_pages(&inode->i_data, 0);
178 invalidate_inode_buffers(inode);
179 end_writeback(inode);
174 180
175 if ((ino < BFS_ROOT_INO) || (ino > info->si_lasti)) { 181 if (inode->i_nlink)
176 printf("invalid ino=%08lx\n", ino);
177 return; 182 return;
178 }
179
180 inode->i_size = 0;
181 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
182 mutex_lock(&info->bfs_lock);
183 mark_inode_dirty(inode);
184 183
185 block = (ino - BFS_ROOT_INO) / BFS_INODES_PER_BLOCK + 1; 184 di = find_inode(s, inode->i_ino, &bh);
186 bh = sb_bread(s, block); 185 if (IS_ERR(di))
187 if (!bh) {
188 printf("Unable to read inode %s:%08lx\n",
189 inode->i_sb->s_id, ino);
190 mutex_unlock(&info->bfs_lock);
191 return; 186 return;
192 } 187
193 off = (ino - BFS_ROOT_INO) % BFS_INODES_PER_BLOCK; 188 mutex_lock(&info->bfs_lock);
194 di = (struct bfs_inode *)bh->b_data + off; 189 /* clear on-disk inode */
195 memset((void *)di, 0, sizeof(struct bfs_inode)); 190 memset(di, 0, sizeof(struct bfs_inode));
196 mark_buffer_dirty(bh); 191 mark_buffer_dirty(bh);
197 brelse(bh); 192 brelse(bh);
198 193
@@ -214,7 +209,6 @@ static void bfs_delete_inode(struct inode *inode)
214 mark_buffer_dirty(info->si_sbh); 209 mark_buffer_dirty(info->si_sbh);
215 } 210 }
216 mutex_unlock(&info->bfs_lock); 211 mutex_unlock(&info->bfs_lock);
217 clear_inode(inode);
218} 212}
219 213
220static int bfs_sync_fs(struct super_block *sb, int wait) 214static int bfs_sync_fs(struct super_block *sb, int wait)
@@ -319,7 +313,7 @@ static const struct super_operations bfs_sops = {
319 .alloc_inode = bfs_alloc_inode, 313 .alloc_inode = bfs_alloc_inode,
320 .destroy_inode = bfs_destroy_inode, 314 .destroy_inode = bfs_destroy_inode,
321 .write_inode = bfs_write_inode, 315 .write_inode = bfs_write_inode,
322 .delete_inode = bfs_delete_inode, 316 .evict_inode = bfs_evict_inode,
323 .put_super = bfs_put_super, 317 .put_super = bfs_put_super,
324 .write_super = bfs_write_super, 318 .write_super = bfs_write_super,
325 .sync_fs = bfs_sync_fs, 319 .sync_fs = bfs_sync_fs,