summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-06-18 20:17:32 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-07-06 17:39:51 -0400
commitf53bd1421b3eb84375e9e6964665d23d4190400d (patch)
tree15abaa510b8bf935c856cd8537ff1ba3e6036f5c
parentcc7231e30916f5326bdde55a7a4c59431e15bc1b (diff)
downloadlinux-stable-f53bd1421b3eb84375e9e6964665d23d4190400d.tar.gz
linux-stable-f53bd1421b3eb84375e9e6964665d23d4190400d.tar.bz2
linux-stable-f53bd1421b3eb84375e9e6964665d23d4190400d.zip
__ufs_truncate_blocks(): avoid excessive dirtying of indirect blocks
There's a case when an indirect block gets dirtied for no good reason - when there's a hole starting in the middle of area covered by it and spanning past its end, and truncate() is done precisely to the beginning of the hole. The block is obviously not modified at all - all removals happen beyond it. However, existing code ends up dirtying it just in case. It's trivial to fix and while it's not a real bug by any stretch of imagination, it makes the damn thing harder to follow. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/ufs/inode.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c
index 424949f459c8..86cc1eea0fb2 100644
--- a/fs/ufs/inode.c
+++ b/fs/ufs/inode.c
@@ -1251,10 +1251,8 @@ static void __ufs_truncate_blocks(struct inode *inode)
}
p = ubh_get_data_ptr(uspi, ubh[i], offsets[i + 1]);
}
- while (i--) {
- ubh_mark_buffer_dirty(ubh[i]);
+ while (i--)
free_branch_tail(inode, offsets[i + 1], ubh[i], depth - i - 1);
- }
}
for (i = offsets[0]; i <= UFS_TIND_BLOCK; i++) {
p = ufs_get_direct_data_ptr(uspi, ufsi, i);