diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2011-02-25 14:44:58 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2011-02-25 14:44:58 +0100 |
commit | 8d56addd70c7c0626502569e22cc8fce49ae39f5 (patch) | |
tree | 43e5e51dfa7a1b7e566cb235d44d5991e0c806d0 /fs/fuse/dir.c | |
parent | fuse: fix hang of single threaded fuseblk filesystem (diff) | |
download | linux-8d56addd70c7c0626502569e22cc8fce49ae39f5.tar.xz linux-8d56addd70c7c0626502569e22cc8fce49ae39f5.zip |
fuse: fix truncate after open
Commit e1181ee6 "vfs: pass struct file to do_truncate on O_TRUNC
opens" broke the behavior of open(O_TRUNC|O_RDONLY) in fuse. Fuse
assumed that when called from open, a truncate() will be done, not an
ftruncate().
Fix by restoring the old behavior, based on the ATTR_OPEN flag.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to '')
-rw-r--r-- | fs/fuse/dir.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index bfed8447ed80..83543b5ff941 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1283,8 +1283,11 @@ static int fuse_do_setattr(struct dentry *entry, struct iattr *attr, if (err) return err; - if ((attr->ia_valid & ATTR_OPEN) && fc->atomic_o_trunc) - return 0; + if (attr->ia_valid & ATTR_OPEN) { + if (fc->atomic_o_trunc) + return 0; + file = NULL; + } if (attr->ia_valid & ATTR_SIZE) is_truncate = true; |