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 ---