Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 190091
b: refs/heads/master
c: b6349ac
h: refs/heads/master
i:
  190089: 564d75f
  190087: ba8e433
v: v3
  • Loading branch information
Joern Engel committed Apr 20, 2010
1 parent 3ede301 commit ad072e9
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b8639077abf034824046ed09e779b74c4393031f
refs/heads/master: b6349ac89eacb813f6963f7263da05bc3f483351
34 changes: 26 additions & 8 deletions trunk/fs/logfs/readwrite.c
Original file line number Diff line number Diff line change
Expand Up @@ -1837,19 +1837,37 @@ static int __logfs_truncate(struct inode *inode, u64 size)
return logfs_truncate_direct(inode, size);
}

int logfs_truncate(struct inode *inode, u64 size)
/*
* Truncate, by changing the segment file, can consume a fair amount
* of resources. So back off from time to time and do some GC.
* 8 or 2048 blocks should be well within safety limits even if
* every single block resided in a different segment.
*/
#define TRUNCATE_STEP (8 * 1024 * 1024)
int logfs_truncate(struct inode *inode, u64 target)
{
struct super_block *sb = inode->i_sb;
int err;
u64 size = i_size_read(inode);
int err = 0;

logfs_get_wblocks(sb, NULL, 1);
err = __logfs_truncate(inode, size);
if (!err)
err = __logfs_write_inode(inode, 0);
logfs_put_wblocks(sb, NULL, 1);
size = ALIGN(size, TRUNCATE_STEP);
while (size > target) {
if (size > TRUNCATE_STEP)
size -= TRUNCATE_STEP;
else
size = 0;
if (size < target)
size = target;

logfs_get_wblocks(sb, NULL, 1);
err = __logfs_truncate(inode, target);
if (!err)
err = __logfs_write_inode(inode, 0);
logfs_put_wblocks(sb, NULL, 1);
}

if (!err)
err = vmtruncate(inode, size);
err = vmtruncate(inode, target);

/* I don't trust error recovery yet. */
WARN_ON(err);
Expand Down

0 comments on commit ad072e9

Please sign in to comment.