Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
  9p: fix O_APPEND in legacy mode
This commit is contained in:
Linus Torvalds 2008-07-03 09:28:44 -07:00
commit 6beef7eb0c
3 changed files with 14 additions and 10 deletions

View file

@ -51,4 +51,4 @@ int v9fs_dir_release(struct inode *inode, struct file *filp);
int v9fs_file_open(struct inode *inode, struct file *file); int v9fs_file_open(struct inode *inode, struct file *file);
void v9fs_inode2stat(struct inode *inode, struct p9_stat *stat); void v9fs_inode2stat(struct inode *inode, struct p9_stat *stat);
void v9fs_dentry_release(struct dentry *); void v9fs_dentry_release(struct dentry *);
int v9fs_uflags2omode(int uflags); int v9fs_uflags2omode(int uflags, int extended);

View file

@ -59,7 +59,7 @@ int v9fs_file_open(struct inode *inode, struct file *file)
P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p \n", inode, file); P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p \n", inode, file);
v9ses = v9fs_inode2v9ses(inode); v9ses = v9fs_inode2v9ses(inode);
omode = v9fs_uflags2omode(file->f_flags); omode = v9fs_uflags2omode(file->f_flags, v9fs_extended(v9ses));
fid = file->private_data; fid = file->private_data;
if (!fid) { if (!fid) {
fid = v9fs_fid_clone(file->f_path.dentry); fid = v9fs_fid_clone(file->f_path.dentry);
@ -75,6 +75,8 @@ int v9fs_file_open(struct inode *inode, struct file *file)
inode->i_size = 0; inode->i_size = 0;
inode->i_blocks = 0; inode->i_blocks = 0;
} }
if ((file->f_flags & O_APPEND) && (!v9fs_extended(v9ses)))
generic_file_llseek(file, 0, SEEK_END);
} }
file->private_data = fid; file->private_data = fid;

View file

@ -132,10 +132,10 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
/** /**
* v9fs_uflags2omode- convert posix open flags to plan 9 mode bits * v9fs_uflags2omode- convert posix open flags to plan 9 mode bits
* @uflags: flags to convert * @uflags: flags to convert
* * @extended: if .u extensions are active
*/ */
int v9fs_uflags2omode(int uflags) int v9fs_uflags2omode(int uflags, int extended)
{ {
int ret; int ret;
@ -155,14 +155,16 @@ int v9fs_uflags2omode(int uflags)
break; break;
} }
if (uflags & O_EXCL)
ret |= P9_OEXCL;
if (uflags & O_TRUNC) if (uflags & O_TRUNC)
ret |= P9_OTRUNC; ret |= P9_OTRUNC;
if (uflags & O_APPEND) if (extended) {
ret |= P9_OAPPEND; if (uflags & O_EXCL)
ret |= P9_OEXCL;
if (uflags & O_APPEND)
ret |= P9_OAPPEND;
}
return ret; return ret;
} }
@ -506,7 +508,7 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
flags = O_RDWR; flags = O_RDWR;
fid = v9fs_create(v9ses, dir, dentry, NULL, perm, fid = v9fs_create(v9ses, dir, dentry, NULL, perm,
v9fs_uflags2omode(flags)); v9fs_uflags2omode(flags, v9fs_extended(v9ses)));
if (IS_ERR(fid)) { if (IS_ERR(fid)) {
err = PTR_ERR(fid); err = PTR_ERR(fid);
fid = NULL; fid = NULL;