diff options
author | Jan Kara <jack@suse.cz> | 2009-08-06 18:27:27 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2009-09-14 13:13:01 -0400 |
commit | cbc8cc33529b0e0e55ae0ff077b8cb0b71d54c7a (patch) | |
tree | 5edace261ca6d707456d1bde03c0bf719ac8a365 /fs/udf | |
parent | 81056dd04465902461b627169c4b4487a11acba1 (diff) |
udf: Fix possible corruption when close races with write
When we close a file, we remove preallocated blocks from it. But this
truncation was not protected by i_mutex and thus it could have raced with a
write through a different fd and cause crashes or even filesystem corruption.
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/file.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index 7464305382b5..b80cbd78833c 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -193,9 +193,11 @@ int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
193 | static int udf_release_file(struct inode *inode, struct file *filp) | 193 | static int udf_release_file(struct inode *inode, struct file *filp) |
194 | { | 194 | { |
195 | if (filp->f_mode & FMODE_WRITE) { | 195 | if (filp->f_mode & FMODE_WRITE) { |
196 | mutex_lock(&inode->i_mutex); | ||
196 | lock_kernel(); | 197 | lock_kernel(); |
197 | udf_discard_prealloc(inode); | 198 | udf_discard_prealloc(inode); |
198 | unlock_kernel(); | 199 | unlock_kernel(); |
200 | mutex_unlock(&inode->i_mutex); | ||
199 | } | 201 | } |
200 | return 0; | 202 | return 0; |
201 | } | 203 | } |