aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext3/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext3/inode.c')
-rw-r--r--fs/ext3/inode.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index 3aa05eebe0b8..b4051c9ac5f2 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -234,12 +234,10 @@ void ext3_evict_inode (struct inode *inode)
234 if (inode->i_blocks) 234 if (inode->i_blocks)
235 ext3_truncate(inode); 235 ext3_truncate(inode);
236 /* 236 /*
237 * Kill off the orphan record which ext3_truncate created. 237 * Kill off the orphan record created when the inode lost the last
238 * AKPM: I think this can be inside the above `if'. 238 * link. Note that ext3_orphan_del() has to be able to cope with the
239 * Note that ext3_orphan_del() has to be able to cope with the 239 * deletion of a non-existent orphan - ext3_truncate() could
240 * deletion of a non-existent orphan - this is because we don't 240 * have removed the record.
241 * know if ext3_truncate() actually created an orphan record.
242 * (Well, we could do this if we need to, but heck - it works)
243 */ 241 */
244 ext3_orphan_del(handle, inode); 242 ext3_orphan_del(handle, inode);
245 EXT3_I(inode)->i_dtime = get_seconds(); 243 EXT3_I(inode)->i_dtime = get_seconds();
@@ -890,6 +888,9 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
890 if (!create || err == -EIO) 888 if (!create || err == -EIO)
891 goto cleanup; 889 goto cleanup;
892 890
891 /*
892 * Block out ext3_truncate while we alter the tree
893 */
893 mutex_lock(&ei->truncate_mutex); 894 mutex_lock(&ei->truncate_mutex);
894 895
895 /* 896 /*
@@ -938,9 +939,6 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
938 */ 939 */
939 count = ext3_blks_to_allocate(partial, indirect_blks, 940 count = ext3_blks_to_allocate(partial, indirect_blks,
940 maxblocks, blocks_to_boundary); 941 maxblocks, blocks_to_boundary);
941 /*
942 * Block out ext3_truncate while we alter the tree
943 */
944 err = ext3_alloc_branch(handle, inode, indirect_blks, &count, goal, 942 err = ext3_alloc_branch(handle, inode, indirect_blks, &count, goal,
945 offsets + (partial - chain), partial); 943 offsets + (partial - chain), partial);
946 944
@@ -1849,7 +1847,7 @@ retry:
1849 loff_t end = offset + iov_length(iov, nr_segs); 1847 loff_t end = offset + iov_length(iov, nr_segs);
1850 1848
1851 if (end > isize) 1849 if (end > isize)
1852 vmtruncate(inode, isize); 1850 ext3_truncate_failed_write(inode);
1853 } 1851 }
1854 if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) 1852 if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
1855 goto retry; 1853 goto retry;
@@ -1863,7 +1861,7 @@ retry:
1863 /* This is really bad luck. We've written the data 1861 /* This is really bad luck. We've written the data
1864 * but cannot extend i_size. Truncate allocated blocks 1862 * but cannot extend i_size. Truncate allocated blocks
1865 * and pretend the write failed... */ 1863 * and pretend the write failed... */
1866 ext3_truncate(inode); 1864 ext3_truncate_failed_write(inode);
1867 ret = PTR_ERR(handle); 1865 ret = PTR_ERR(handle);
1868 goto out; 1866 goto out;
1869 } 1867 }
@@ -2414,8 +2412,6 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode,
2414 2412
2415int ext3_can_truncate(struct inode *inode) 2413int ext3_can_truncate(struct inode *inode)
2416{ 2414{
2417 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
2418 return 0;
2419 if (S_ISREG(inode->i_mode)) 2415 if (S_ISREG(inode->i_mode))
2420 return 1; 2416 return 1;
2421 if (S_ISDIR(inode->i_mode)) 2417 if (S_ISDIR(inode->i_mode))
@@ -3264,9 +3260,8 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr)
3264 3260
3265 if ((attr->ia_valid & ATTR_SIZE) && 3261 if ((attr->ia_valid & ATTR_SIZE) &&
3266 attr->ia_size != i_size_read(inode)) { 3262 attr->ia_size != i_size_read(inode)) {
3267 rc = vmtruncate(inode, attr->ia_size); 3263 truncate_setsize(inode, attr->ia_size);
3268 if (rc) 3264 ext3_truncate(inode);
3269 goto err_out;
3270 } 3265 }
3271 3266
3272 setattr_copy(inode, attr); 3267 setattr_copy(inode, attr);