diff options
| author | Ingo Molnar <mingo@elte.hu> | 2010-08-12 15:38:56 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-08-12 15:39:04 -0400 |
| commit | f46a6804135795f77d096ab0128f27531c7d051c (patch) | |
| tree | 7cd33f69e3661327739ae4c96e5a8389e7fc912e /fs/omfs/inode.c | |
| parent | b3e84ffa21f916e3354a12a7f19169c9febe96d0 (diff) | |
| parent | ad41a1e0cab07c5125456e8d38e5b1ab148d04aa (diff) | |
Merge branch 'linus' into perf/urgent
Merge reason: Fix upstream breakage introduced by:
de5d9bf: Move list types from <linux/list.h> to <linux/types.h>.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/omfs/inode.c')
| -rw-r--r-- | fs/omfs/inode.c | 53 |
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>"); | |||
| 19 | MODULE_DESCRIPTION("OMFS (ReplayTV/Karma) Filesystem for Linux"); | 19 | MODULE_DESCRIPTION("OMFS (ReplayTV/Karma) Filesystem for Linux"); |
| 20 | MODULE_LICENSE("GPL"); | 20 | MODULE_LICENSE("GPL"); |
| 21 | 21 | ||
| 22 | struct 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 | |||
| 22 | struct inode *omfs_new_inode(struct inode *dir, int mode) | 31 | struct 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 | */ |
| 178 | static void omfs_delete_inode(struct inode *inode) | 184 | static 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 | ||
| 191 | struct inode *omfs_iget(struct super_block *sb, ino_t ino) | 200 | struct 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 | ||
| 285 | static const struct super_operations omfs_sops = { | 292 | static 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: | |||
| 529 | out_brelse_bh: | 552 | out_brelse_bh: |
| 530 | brelse(bh); | 553 | brelse(bh); |
| 531 | end: | 554 | end: |
| 555 | if (ret) | ||
| 556 | kfree(sbi); | ||
| 532 | return ret; | 557 | return ret; |
| 533 | } | 558 | } |
| 534 | 559 | ||
