diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-10-13 19:48:19 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2006-10-13 19:48:19 +0000 |
commit | bcfa416e38d180c5687219f05c23f343879752f7 (patch) | |
tree | 3a979a6be1b57626708da7ab84611c66fa4fe8c2 /kernel/file.c | |
parent | d6f8db71b84a139c1d74d6d0c654659951219c38 (diff) | |
download | libfuse-bcfa416e38d180c5687219f05c23f343879752f7.tar.gz |
fix hang, etc
Diffstat (limited to 'kernel/file.c')
-rw-r--r-- | kernel/file.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/file.c b/kernel/file.c index b9d86ed..0470069 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -495,8 +495,11 @@ static int fuse_commit_write(struct file *file, struct page *page, err = -EIO; if (!err) { pos += count; - if (pos > i_size_read(inode)) + if (pos > i_size_read(inode)) { + spin_lock(&fc->lock); i_size_write(inode, pos); + spin_unlock(&fc->lock); + } if (offset == 0 && to == PAGE_CACHE_SIZE) { clear_page_dirty(page); @@ -601,8 +604,11 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf, } fuse_put_request(fc, req); if (res > 0) { - if (write && pos > i_size_read(inode)) + if (write && pos > i_size_read(inode)) { + spin_lock(&fc->lock); i_size_write(inode, pos); + spin_unlock(&fc->lock); + } *ppos = pos; } fuse_invalidate_attr(inode); |