diff options
author | Jan Kara <jack@suse.cz> | 2011-05-24 16:24:47 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2011-06-25 11:29:51 -0400 |
commit | 40680f2fa4670ab35ee554822a69dda1a118f966 (patch) | |
tree | 24d8fa1e6354b851b2a268a6681270fde4ef8b5a /fs/ext3 | |
parent | 99cb1a318c37bf462c53d43f4dacb7b4896ce0c9 (diff) |
ext3: Convert ext3 to new truncate calling convention
Mostly trivial conversion. We fix a bug that IS_IMMUTABLE and IS_APPEND files
could not be truncated during failed writes as we change the code. In fact the
test is not needed at all because both IS_IMMUTABLE and IS_APPEND is tested in
upper layers in do_sys_[f]truncate(), may_write(), etc.
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3')
-rw-r--r-- | fs/ext3/file.c | 1 | ||||
-rw-r--r-- | fs/ext3/inode.c | 27 |
2 files changed, 11 insertions, 17 deletions
diff --git a/fs/ext3/file.c b/fs/ext3/file.c index f55df0e61cbd..86c8ab343f6f 100644 --- a/fs/ext3/file.c +++ b/fs/ext3/file.c | |||
@@ -71,7 +71,6 @@ const struct file_operations ext3_file_operations = { | |||
71 | }; | 71 | }; |
72 | 72 | ||
73 | const struct inode_operations ext3_file_inode_operations = { | 73 | const struct inode_operations ext3_file_inode_operations = { |
74 | .truncate = ext3_truncate, | ||
75 | .setattr = ext3_setattr, | 74 | .setattr = ext3_setattr, |
76 | #ifdef CONFIG_EXT3_FS_XATTR | 75 | #ifdef CONFIG_EXT3_FS_XATTR |
77 | .setxattr = generic_setxattr, | 76 | .setxattr = generic_setxattr, |
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 | ||
2415 | int ext3_can_truncate(struct inode *inode) | 2413 | int 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); |