summaryrefslogtreecommitdiffstats
path: root/fs/cifs/inode.c
diff options
context:
space:
mode:
authorSteve French2007-02-26 21:06:29 +0100
committerSteve French2007-02-26 21:06:29 +0100
commitba6a46a03f3c46ed68be551c722161bb37caf095 (patch)
tree86f01e0b3a06e74d4681e0bf9dfbfe36602c53fa /fs/cifs/inode.c
parent[CIFS] Fix locking problem around some cifs uses of i_size write (diff)
downloadkernel-qcow2-linux-ba6a46a03f3c46ed68be551c722161bb37caf095.tar.gz
kernel-qcow2-linux-ba6a46a03f3c46ed68be551c722161bb37caf095.tar.xz
kernel-qcow2-linux-ba6a46a03f3c46ed68be551c722161bb37caf095.zip
[CIFS] small piece missing from previous patch
There were two i_size_writes in the new truncate function - we missed one in the last patch. Noticed by Shaggy when he reviewed. Thank you Shaggy ... CC: Shaggy <shaggy@us.ibm.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r--fs/cifs/inode.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 24df13a256e5..03ade0f972b4 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -1139,15 +1139,17 @@ int cifs_vmtruncate(struct inode * inode, loff_t offset)
struct address_space *mapping = inode->i_mapping;
unsigned long limit;
+ spin_lock(&inode->i_lock);
if (inode->i_size < offset)
goto do_expand;
/*
* truncation of in-use swapfiles is disallowed - it would cause
* subsequent swapout to scribble on the now-freed blocks.
*/
- if (IS_SWAPFILE(inode))
+ if (IS_SWAPFILE(inode)) {
+ spin_unlock(&inode->i_lock);
goto out_busy;
- spin_lock(&inode->i_lock);
+ }
i_size_write(inode, offset);
spin_unlock(&inode->i_lock);
unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
@@ -1156,12 +1158,16 @@ int cifs_vmtruncate(struct inode * inode, loff_t offset)
do_expand:
limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
- if (limit != RLIM_INFINITY && offset > limit)
+ if (limit != RLIM_INFINITY && offset > limit) {
+ spin_unlock(&inode->i_lock);
goto out_sig;
- if (offset > inode->i_sb->s_maxbytes)
+ }
+ if (offset > inode->i_sb->s_maxbytes) {
+ spin_unlock(&inode->i_lock);
goto out_big;
+ }
i_size_write(inode, offset);
-
+ spin_unlock(&inode->i_lock);
out_truncate:
if (inode->i_op && inode->i_op->truncate)
inode->i_op->truncate(inode);