aboutsummaryrefslogtreecommitdiffstats
path: root/fs/omfs/inode.c
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2010-08-11 03:36:51 -0400
committerJiri Kosina <jkosina@suse.cz>2010-08-11 03:36:51 -0400
commit6396fc3b3ff3f6b942992b653a62df11dcef9bea (patch)
treedb3c7cbe833b43c653adc99f70941431c5ff7c4e /fs/omfs/inode.c
parent4785879e4d340e24e54f6de2ccfc42728b912808 (diff)
parent3d30701b58970425e1d45994d6cb82f828924fdd (diff)
Merge branch 'master' into for-next
Conflicts: fs/exofs/inode.c
Diffstat (limited to 'fs/omfs/inode.c')
-rw-r--r--fs/omfs/inode.c53
1 files changed, 39 insertions, 14 deletions
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c
index 089839a6cc64..14a22863291a 100644
--- a/fs/omfs/inode.c
+++ b/fs/omfs/inode.c
@@ -19,6 +19,15 @@ MODULE_AUTHOR("Bob Copeland <me@bobcopeland.com>");
19MODULE_DESCRIPTION("OMFS (ReplayTV/Karma) Filesystem for Linux"); 19MODULE_DESCRIPTION("OMFS (ReplayTV/Karma) Filesystem for Linux");
20MODULE_LICENSE("GPL"); 20MODULE_LICENSE("GPL");
21 21
22struct buffer_head *omfs_bread(struct super_block *sb, sector_t block)
23{
24 struct omfs_sb_info *sbi = OMFS_SB(sb);
25 if (block >= sbi->s_num_blocks)
26 return NULL;
27
28 return sb_bread(sb, clus_to_blk(sbi, block));
29}
30
22struct inode *omfs_new_inode(struct inode *dir, int mode) 31struct inode *omfs_new_inode(struct inode *dir, int mode)
23{ 32{
24 struct inode *inode; 33 struct inode *inode;
@@ -93,15 +102,13 @@ static int __omfs_write_inode(struct inode *inode, int wait)
93 struct omfs_inode *oi; 102 struct omfs_inode *oi;
94 struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb); 103 struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb);
95 struct buffer_head *bh, *bh2; 104 struct buffer_head *bh, *bh2;
96 unsigned int block;
97 u64 ctime; 105 u64 ctime;
98 int i; 106 int i;
99 int ret = -EIO; 107 int ret = -EIO;
100 int sync_failed = 0; 108 int sync_failed = 0;
101 109
102 /* get current inode since we may have written sibling ptrs etc. */ 110 /* get current inode since we may have written sibling ptrs etc. */
103 block = clus_to_blk(sbi, inode->i_ino); 111 bh = omfs_bread(inode->i_sb, inode->i_ino);
104 bh = sb_bread(inode->i_sb, block);
105 if (!bh) 112 if (!bh)
106 goto out; 113 goto out;
107 114
@@ -140,8 +147,7 @@ static int __omfs_write_inode(struct inode *inode, int wait)
140 147
141 /* if mirroring writes, copy to next fsblock */ 148 /* if mirroring writes, copy to next fsblock */
142 for (i = 1; i < sbi->s_mirrors; i++) { 149 for (i = 1; i < sbi->s_mirrors; i++) {
143 bh2 = sb_bread(inode->i_sb, block + i * 150 bh2 = omfs_bread(inode->i_sb, inode->i_ino + i);
144 (sbi->s_blocksize / sbi->s_sys_blocksize));
145 if (!bh2) 151 if (!bh2)
146 goto out_brelse; 152 goto out_brelse;
147 153
@@ -175,9 +181,13 @@ int omfs_sync_inode(struct inode *inode)
175 * called when an entry is deleted, need to clear the bits in the 181 * called when an entry is deleted, need to clear the bits in the
176 * bitmaps. 182 * bitmaps.
177 */ 183 */
178static void omfs_delete_inode(struct inode *inode) 184static void omfs_evict_inode(struct inode *inode)
179{ 185{
180 truncate_inode_pages(&inode->i_data, 0); 186 truncate_inode_pages(&inode->i_data, 0);
187 end_writeback(inode);
188
189 if (inode->i_nlink)
190 return;
181 191
182 if (S_ISREG(inode->i_mode)) { 192 if (S_ISREG(inode->i_mode)) {
183 inode->i_size = 0; 193 inode->i_size = 0;
@@ -185,7 +195,6 @@ static void omfs_delete_inode(struct inode *inode)
185 } 195 }
186 196
187 omfs_clear_range(inode->i_sb, inode->i_ino, 2); 197 omfs_clear_range(inode->i_sb, inode->i_ino, 2);
188 clear_inode(inode);
189} 198}
190 199
191struct inode *omfs_iget(struct super_block *sb, ino_t ino) 200struct inode *omfs_iget(struct super_block *sb, ino_t ino)
@@ -193,7 +202,6 @@ struct inode *omfs_iget(struct super_block *sb, ino_t ino)
193 struct omfs_sb_info *sbi = OMFS_SB(sb); 202 struct omfs_sb_info *sbi = OMFS_SB(sb);
194 struct omfs_inode *oi; 203 struct omfs_inode *oi;
195 struct buffer_head *bh; 204 struct buffer_head *bh;
196 unsigned int block;
197 u64 ctime; 205 u64 ctime;
198 unsigned long nsecs; 206 unsigned long nsecs;
199 struct inode *inode; 207 struct inode *inode;
@@ -204,8 +212,7 @@ struct inode *omfs_iget(struct super_block *sb, ino_t ino)
204 if (!(inode->i_state & I_NEW)) 212 if (!(inode->i_state & I_NEW))
205 return inode; 213 return inode;
206 214
207 block = clus_to_blk(sbi, ino); 215 bh = omfs_bread(inode->i_sb, ino);
208 bh = sb_bread(inode->i_sb, block);
209 if (!bh) 216 if (!bh)
210 goto iget_failed; 217 goto iget_failed;
211 218
@@ -284,7 +291,7 @@ static int omfs_statfs(struct dentry *dentry, struct kstatfs *buf)
284 291
285static const struct super_operations omfs_sops = { 292static const struct super_operations omfs_sops = {
286 .write_inode = omfs_write_inode, 293 .write_inode = omfs_write_inode,
287 .delete_inode = omfs_delete_inode, 294 .evict_inode = omfs_evict_inode,
288 .put_super = omfs_put_super, 295 .put_super = omfs_put_super,
289 .statfs = omfs_statfs, 296 .statfs = omfs_statfs,
290 .show_options = generic_show_options, 297 .show_options = generic_show_options,
@@ -319,6 +326,9 @@ static int omfs_get_imap(struct super_block *sb)
319 goto nomem; 326 goto nomem;
320 327
321 block = clus_to_blk(sbi, sbi->s_bitmap_ino); 328 block = clus_to_blk(sbi, sbi->s_bitmap_ino);
329 if (block >= sbi->s_num_blocks)
330 goto nomem;
331
322 ptr = sbi->s_imap; 332 ptr = sbi->s_imap;
323 for (count = bitmap_size; count > 0; count -= sb->s_blocksize) { 333 for (count = bitmap_size; count > 0; count -= sb->s_blocksize) {
324 bh = sb_bread(sb, block++); 334 bh = sb_bread(sb, block++);
@@ -417,7 +427,6 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent)
417 struct omfs_root_block *omfs_rb; 427 struct omfs_root_block *omfs_rb;
418 struct omfs_sb_info *sbi; 428 struct omfs_sb_info *sbi;
419 struct inode *root; 429 struct inode *root;
420 sector_t start;
421 int ret = -EINVAL; 430 int ret = -EINVAL;
422 431
423 save_mount_options(sb, (char *) data); 432 save_mount_options(sb, (char *) data);
@@ -486,8 +495,7 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent)
486 sbi->s_block_shift = get_bitmask_order(sbi->s_blocksize) - 495 sbi->s_block_shift = get_bitmask_order(sbi->s_blocksize) -
487 get_bitmask_order(sbi->s_sys_blocksize); 496 get_bitmask_order(sbi->s_sys_blocksize);
488 497
489 start = clus_to_blk(sbi, be64_to_cpu(omfs_sb->s_root_block)); 498 bh2 = omfs_bread(sb, be64_to_cpu(omfs_sb->s_root_block));
490 bh2 = sb_bread(sb, start);
491 if (!bh2) 499 if (!bh2)
492 goto out_brelse_bh; 500 goto out_brelse_bh;
493 501
@@ -504,6 +512,21 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent)
504 goto out_brelse_bh2; 512 goto out_brelse_bh2;
505 } 513 }
506 514
515 if (sbi->s_bitmap_ino != ~0ULL &&
516 sbi->s_bitmap_ino > sbi->s_num_blocks) {
517 printk(KERN_ERR "omfs: free space bitmap location is corrupt "
518 "(%llx, total blocks %llx)\n",
519 (unsigned long long) sbi->s_bitmap_ino,
520 (unsigned long long) sbi->s_num_blocks);
521 goto out_brelse_bh2;
522 }
523 if (sbi->s_clustersize < 1 ||
524 sbi->s_clustersize > OMFS_MAX_CLUSTER_SIZE) {
525 printk(KERN_ERR "omfs: cluster size out of range (%d)",
526 sbi->s_clustersize);
527 goto out_brelse_bh2;
528 }
529
507 ret = omfs_get_imap(sb); 530 ret = omfs_get_imap(sb);
508 if (ret) 531 if (ret)
509 goto out_brelse_bh2; 532 goto out_brelse_bh2;
@@ -529,6 +552,8 @@ out_brelse_bh2:
529out_brelse_bh: 552out_brelse_bh:
530 brelse(bh); 553 brelse(bh);
531end: 554end:
555 if (ret)
556 kfree(sbi);
532 return ret; 557 return ret;
533} 558}
534 559