file.c (7022b15e2a9f878fd5184586064c63352c3dd225) | file.c (dca3c33652e437ed02c30ed3eca3cecd0cc00838) |
---|---|
1/* 2 * linux/fs/affs/file.c 3 * 4 * (c) 1996 Hans-Joachim Widmaier - Rewritten 5 * 6 * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. 7 * 8 * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. --- 34 unchanged lines hidden (view full) --- 43 .setattr = affs_notify_change, 44}; 45 46static int 47affs_file_open(struct inode *inode, struct file *filp) 48{ 49 if (atomic_read(&filp->f_count) != 1) 50 return 0; | 1/* 2 * linux/fs/affs/file.c 3 * 4 * (c) 1996 Hans-Joachim Widmaier - Rewritten 5 * 6 * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. 7 * 8 * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. --- 34 unchanged lines hidden (view full) --- 43 .setattr = affs_notify_change, 44}; 45 46static int 47affs_file_open(struct inode *inode, struct file *filp) 48{ 49 if (atomic_read(&filp->f_count) != 1) 50 return 0; |
51 pr_debug("AFFS: open(%d)\n", AFFS_I(inode)->i_opencnt); 52 AFFS_I(inode)->i_opencnt++; | 51 pr_debug("AFFS: open(%lu,%d)\n", 52 inode->i_ino, atomic_read(&AFFS_I(inode)->i_opencnt)); 53 atomic_inc(&AFFS_I(inode)->i_opencnt); |
53 return 0; 54} 55 56static int 57affs_file_release(struct inode *inode, struct file *filp) 58{ 59 if (atomic_read(&filp->f_count) != 0) 60 return 0; | 54 return 0; 55} 56 57static int 58affs_file_release(struct inode *inode, struct file *filp) 59{ 60 if (atomic_read(&filp->f_count) != 0) 61 return 0; |
61 pr_debug("AFFS: release(%d)\n", AFFS_I(inode)->i_opencnt); 62 AFFS_I(inode)->i_opencnt--; 63 if (!AFFS_I(inode)->i_opencnt) | 62 pr_debug("AFFS: release(%lu, %d)\n", 63 inode->i_ino, atomic_read(&AFFS_I(inode)->i_opencnt)); 64 65 if (atomic_dec_and_test(&AFFS_I(inode)->i_opencnt)) { 66 mutex_lock(&inode->i_mutex); 67 if (inode->i_size != AFFS_I(inode)->mmu_private) 68 affs_truncate(inode); |
64 affs_free_prealloc(inode); | 69 affs_free_prealloc(inode); |
70 mutex_unlock(&inode->i_mutex); 71 } |
|
65 66 return 0; 67} 68 69static int 70affs_grow_extcache(struct inode *inode, u32 lc_idx) 71{ 72 struct super_block *sb = inode->i_sb; --- 102 unchanged lines hidden (view full) --- 175} 176 177static inline struct buffer_head * 178affs_get_extblock(struct inode *inode, u32 ext) 179{ 180 /* inline the simplest case: same extended block as last time */ 181 struct buffer_head *bh = AFFS_I(inode)->i_ext_bh; 182 if (ext == AFFS_I(inode)->i_ext_last) | 72 73 return 0; 74} 75 76static int 77affs_grow_extcache(struct inode *inode, u32 lc_idx) 78{ 79 struct super_block *sb = inode->i_sb; --- 102 unchanged lines hidden (view full) --- 182} 183 184static inline struct buffer_head * 185affs_get_extblock(struct inode *inode, u32 ext) 186{ 187 /* inline the simplest case: same extended block as last time */ 188 struct buffer_head *bh = AFFS_I(inode)->i_ext_bh; 189 if (ext == AFFS_I(inode)->i_ext_last) |
183 atomic_inc(&bh->b_count); | 190 get_bh(bh); |
184 else 185 /* we have to do more (not inlined) */ 186 bh = affs_get_extblock_slow(inode, ext); 187 188 return bh; 189} 190 191static struct buffer_head * --- 109 unchanged lines hidden (view full) --- 301 goto err_bread; 302 //lock cache 303 304store_ext: 305 /* release old cached extended block and store the new one */ 306 affs_brelse(AFFS_I(inode)->i_ext_bh); 307 AFFS_I(inode)->i_ext_last = ext; 308 AFFS_I(inode)->i_ext_bh = bh; | 191 else 192 /* we have to do more (not inlined) */ 193 bh = affs_get_extblock_slow(inode, ext); 194 195 return bh; 196} 197 198static struct buffer_head * --- 109 unchanged lines hidden (view full) --- 308 goto err_bread; 309 //lock cache 310 311store_ext: 312 /* release old cached extended block and store the new one */ 313 affs_brelse(AFFS_I(inode)->i_ext_bh); 314 AFFS_I(inode)->i_ext_last = ext; 315 AFFS_I(inode)->i_ext_bh = bh; |
309 atomic_inc(&bh->b_count); | 316 get_bh(bh); |
310 311 return bh; 312 313err_bread: 314 affs_brelse(bh); 315 return ERR_PTR(-EIO); 316} 317 318static int 319affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create) 320{ 321 struct super_block *sb = inode->i_sb; 322 struct buffer_head *ext_bh; 323 u32 ext; 324 325 pr_debug("AFFS: get_block(%u, %lu)\n", (u32)inode->i_ino, (unsigned long)block); 326 | 317 318 return bh; 319 320err_bread: 321 affs_brelse(bh); 322 return ERR_PTR(-EIO); 323} 324 325static int 326affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create) 327{ 328 struct super_block *sb = inode->i_sb; 329 struct buffer_head *ext_bh; 330 u32 ext; 331 332 pr_debug("AFFS: get_block(%u, %lu)\n", (u32)inode->i_ino, (unsigned long)block); 333 |
327 | |
328 BUG_ON(block > (sector_t)0x7fffffffUL); 329 330 if (block >= AFFS_I(inode)->i_blkcnt) { 331 if (block > AFFS_I(inode)->i_blkcnt || !create) 332 goto err_big; 333 } else 334 create = 0; 335 --- 486 unchanged lines hidden (view full) --- 822 struct page *page; 823 void *fsdata; 824 u32 size = inode->i_size; 825 int res; 826 827 res = mapping->a_ops->write_begin(NULL, mapping, size, 0, 0, &page, &fsdata); 828 if (!res) 829 res = mapping->a_ops->write_end(NULL, mapping, size, 0, 0, page, fsdata); | 334 BUG_ON(block > (sector_t)0x7fffffffUL); 335 336 if (block >= AFFS_I(inode)->i_blkcnt) { 337 if (block > AFFS_I(inode)->i_blkcnt || !create) 338 goto err_big; 339 } else 340 create = 0; 341 --- 486 unchanged lines hidden (view full) --- 828 struct page *page; 829 void *fsdata; 830 u32 size = inode->i_size; 831 int res; 832 833 res = mapping->a_ops->write_begin(NULL, mapping, size, 0, 0, &page, &fsdata); 834 if (!res) 835 res = mapping->a_ops->write_end(NULL, mapping, size, 0, 0, page, fsdata); |
836 else 837 inode->i_size = AFFS_I(inode)->mmu_private; |
|
830 mark_inode_dirty(inode); 831 return; 832 } else if (inode->i_size == AFFS_I(inode)->mmu_private) 833 return; 834 835 // lock cache 836 ext_bh = affs_get_extblock(inode, ext); 837 if (IS_ERR(ext_bh)) { --- 19 unchanged lines hidden (view full) --- 857 blkcnt = AFFS_I(inode)->i_blkcnt; 858 i = 0; 859 blk = last_blk; 860 if (inode->i_size) { 861 i = last_blk % AFFS_SB(sb)->s_hashsize + 1; 862 blk++; 863 } else 864 AFFS_HEAD(ext_bh)->first_data = 0; | 838 mark_inode_dirty(inode); 839 return; 840 } else if (inode->i_size == AFFS_I(inode)->mmu_private) 841 return; 842 843 // lock cache 844 ext_bh = affs_get_extblock(inode, ext); 845 if (IS_ERR(ext_bh)) { --- 19 unchanged lines hidden (view full) --- 865 blkcnt = AFFS_I(inode)->i_blkcnt; 866 i = 0; 867 blk = last_blk; 868 if (inode->i_size) { 869 i = last_blk % AFFS_SB(sb)->s_hashsize + 1; 870 blk++; 871 } else 872 AFFS_HEAD(ext_bh)->first_data = 0; |
873 AFFS_HEAD(ext_bh)->block_count = cpu_to_be32(i); |
|
865 size = AFFS_SB(sb)->s_hashsize; 866 if (size > blkcnt - blk + i) 867 size = blkcnt - blk + i; 868 for (; i < size; i++, blk++) { 869 affs_free_block(sb, be32_to_cpu(AFFS_BLOCK(sb, ext_bh, i))); 870 AFFS_BLOCK(sb, ext_bh, i) = 0; 871 } 872 AFFS_TAIL(sb, ext_bh)->extension = 0; --- 40 unchanged lines hidden --- | 874 size = AFFS_SB(sb)->s_hashsize; 875 if (size > blkcnt - blk + i) 876 size = blkcnt - blk + i; 877 for (; i < size; i++, blk++) { 878 affs_free_block(sb, be32_to_cpu(AFFS_BLOCK(sb, ext_bh, i))); 879 AFFS_BLOCK(sb, ext_bh, i) = 0; 880 } 881 AFFS_TAIL(sb, ext_bh)->extension = 0; --- 40 unchanged lines hidden --- |