summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-06-19 04:39:46 +0200
committerAl Viro <viro@zeniv.linux.org.uk>2015-07-06 23:39:52 +0200
commit5a39c25562aa5eab5a798919855cf41ddeed8b0d (patch)
tree93d8998d91be23821e4e1e0f90c633f967f75927
parent__ufs_truncate_blocks(): avoid excessive dirtying of indirect blocks (diff)
downloadlinux-5a39c25562aa5eab5a798919855cf41ddeed8b0d.tar.xz
linux-5a39c25562aa5eab5a798919855cf41ddeed8b0d.zip
ufs_inode_get{frag,block}(): get rid of retries
We are holding ->truncate_mutex, so nobody else can alter our block pointers. Rechecks/retries were needed back when we only held BKL there, and had to cope with write_begin/writepage and writepage/truncate races. Can't happen anymore... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/ufs/inode.c43
1 files changed, 8 insertions, 35 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c
index 86cc1eea0fb2..95cb0a8f5ec9 100644
--- a/fs/ufs/inode.c
+++ b/fs/ufs/inode.c
@@ -248,20 +248,12 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment,
goal = 0;
-repeat:
tmp = ufs_data_ptr_to_cpu(sb, p);
lastfrag = ufsi->i_lastfrag;
if (tmp && fragment < lastfrag) {
if (!phys) {
- result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff);
- if (tmp == ufs_data_ptr_to_cpu(sb, p)) {
- UFSD("EXIT, result %llu\n",
- (unsigned long long)tmp + blockoff);
- return result;
- }
- brelse (result);
- goto repeat;
+ return sb_getblk(sb, uspi->s_sbbase + tmp + blockoff);
} else {
*phys = uspi->s_sbbase + tmp + blockoff;
return NULL;
@@ -283,14 +275,9 @@ repeat:
ufs_data_ptr_to_cpu(sb, p2),
uspi->s_fpb - lastblockoff,
err, locked_page);
- if (!tmp) {
- if (lastfrag != ufsi->i_lastfrag)
- goto repeat;
- else
- return NULL;
- }
+ if (!tmp)
+ return NULL;
lastfrag = ufsi->i_lastfrag;
-
}
tmp = ufs_data_ptr_to_cpu(sb,
ufs_get_direct_data_ptr(uspi, ufsi,
@@ -325,9 +312,6 @@ repeat:
phys != NULL ? locked_page : NULL);
}
if (!tmp) {
- if ((!blockoff && ufs_data_ptr_to_cpu(sb, p)) ||
- (blockoff && lastfrag != ufsi->i_lastfrag))
- goto repeat;
*err = -ENOSPC;
return NULL;
}
@@ -345,7 +329,6 @@ repeat:
if (IS_SYNC(inode))
ufs_sync_inode (inode);
mark_inode_dirty(inode);
- UFSD("EXIT, result %llu\n", (unsigned long long)tmp + blockoff);
return result;
/* This part : To be implemented ....
@@ -409,19 +392,14 @@ ufs_inode_getblock(struct inode *inode, struct buffer_head *bh,
p = (__fs64 *)bh->b_data + block;
else
p = (__fs32 *)bh->b_data + block;
-repeat:
+
tmp = ufs_data_ptr_to_cpu(sb, p);
if (tmp) {
- if (!phys) {
+ if (!phys)
result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff);
- if (tmp == ufs_data_ptr_to_cpu(sb, p))
- goto out;
- brelse (result);
- goto repeat;
- } else {
+ else
*phys = uspi->s_sbbase + tmp + blockoff;
- goto out;
- }
+ goto out;
}
if (block && (uspi->fs_magic == UFS2_MAGIC ?
@@ -432,12 +410,8 @@ repeat:
goal = bh->b_blocknr + uspi->s_fpb;
tmp = ufs_new_fragments(inode, p, ufs_blknum(new_fragment), goal,
uspi->s_fpb, err, locked_page);
- if (!tmp) {
- if (ufs_data_ptr_to_cpu(sb, p))
- goto repeat;
+ if (!tmp)
goto out;
- }
-
if (!phys) {
result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff);
@@ -451,7 +425,6 @@ repeat:
sync_dirty_buffer(bh);
inode->i_ctime = CURRENT_TIME_SEC;
mark_inode_dirty(inode);
- UFSD("result %llu\n", (unsigned long long)tmp + blockoff);
out:
brelse (bh);
UFSD("EXIT\n");