9P2010.L handshake: Add VFS flags
Add 9P2000.u and 9P2010.L protocol flags to V9FS VFS This patch adds 9P2000.u and 9P2010.L protocol flags into V9FS VFS side code and removes the single flag used for 'extended'. Signed-off-by: Sripathi Kodi <sripathik@in.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
parent
c1a7c22620
commit
dd6102fbd9
@ -151,7 +151,7 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
|
||||
if (access == V9FS_ACCESS_SINGLE)
|
||||
return ERR_PTR(-EPERM);
|
||||
|
||||
if (v9fs_extended(v9ses))
|
||||
if (v9fs_proto_dotu(v9ses))
|
||||
uname = NULL;
|
||||
else
|
||||
uname = v9ses->uname;
|
||||
|
@ -241,7 +241,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
|
||||
list_add(&v9ses->slist, &v9fs_sessionlist);
|
||||
spin_unlock(&v9fs_sessionlist_lock);
|
||||
|
||||
v9ses->flags = V9FS_EXTENDED | V9FS_ACCESS_USER;
|
||||
v9ses->flags = V9FS_PROTO_2000U | V9FS_ACCESS_USER;
|
||||
strcpy(v9ses->uname, V9FS_DEFUSER);
|
||||
strcpy(v9ses->aname, V9FS_DEFANAME);
|
||||
v9ses->uid = ~0;
|
||||
@ -263,12 +263,12 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
|
||||
}
|
||||
|
||||
if (!v9ses->clnt->dotu)
|
||||
v9ses->flags &= ~V9FS_EXTENDED;
|
||||
v9ses->flags &= ~V9FS_PROTO_2000U;
|
||||
|
||||
v9ses->maxdata = v9ses->clnt->msize - P9_IOHDRSZ;
|
||||
|
||||
/* for legacy mode, fall back to V9FS_ACCESS_ANY */
|
||||
if (!v9fs_extended(v9ses) &&
|
||||
if (!v9fs_proto_dotu(v9ses) &&
|
||||
((v9ses->flags&V9FS_ACCESS_MASK) == V9FS_ACCESS_USER)) {
|
||||
|
||||
v9ses->flags &= ~V9FS_ACCESS_MASK;
|
||||
|
23
fs/9p/v9fs.h
23
fs/9p/v9fs.h
@ -23,7 +23,8 @@
|
||||
|
||||
/**
|
||||
* enum p9_session_flags - option flags for each 9P session
|
||||
* @V9FS_EXTENDED: whether or not to use 9P2000.u extensions
|
||||
* @V9FS_PROTO_2000U: whether or not to use 9P2000.u extensions
|
||||
* @V9FS_PROTO_2010L: whether or not to use 9P2010.l extensions
|
||||
* @V9FS_ACCESS_SINGLE: only the mounting user can access the hierarchy
|
||||
* @V9FS_ACCESS_USER: a new attach will be issued for every user (default)
|
||||
* @V9FS_ACCESS_ANY: use a single attach for all users
|
||||
@ -32,11 +33,12 @@
|
||||
* Session flags reflect options selected by users at mount time
|
||||
*/
|
||||
enum p9_session_flags {
|
||||
V9FS_EXTENDED = 0x01,
|
||||
V9FS_ACCESS_SINGLE = 0x02,
|
||||
V9FS_ACCESS_USER = 0x04,
|
||||
V9FS_ACCESS_ANY = 0x06,
|
||||
V9FS_ACCESS_MASK = 0x06,
|
||||
V9FS_PROTO_2000U = 0x01,
|
||||
V9FS_PROTO_2010L = 0x02,
|
||||
V9FS_ACCESS_SINGLE = 0x04,
|
||||
V9FS_ACCESS_USER = 0x08,
|
||||
V9FS_ACCESS_ANY = 0x0C,
|
||||
V9FS_ACCESS_MASK = 0x0C,
|
||||
};
|
||||
|
||||
/* possible values of ->cache */
|
||||
@ -121,7 +123,12 @@ static inline struct v9fs_session_info *v9fs_inode2v9ses(struct inode *inode)
|
||||
return (inode->i_sb->s_fs_info);
|
||||
}
|
||||
|
||||
static inline int v9fs_extended(struct v9fs_session_info *v9ses)
|
||||
static inline int v9fs_proto_dotu(struct v9fs_session_info *v9ses)
|
||||
{
|
||||
return v9ses->flags & V9FS_EXTENDED;
|
||||
return v9ses->flags & V9FS_PROTO_2000U;
|
||||
}
|
||||
|
||||
static inline int v9fs_proto_dotl(struct v9fs_session_info *v9ses)
|
||||
{
|
||||
return v9ses->flags & V9FS_PROTO_2010L;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ int v9fs_file_open(struct inode *inode, struct file *file)
|
||||
|
||||
P9_DPRINTK(P9_DEBUG_VFS, "inode: %p file: %p \n", inode, file);
|
||||
v9ses = v9fs_inode2v9ses(inode);
|
||||
omode = v9fs_uflags2omode(file->f_flags, v9fs_extended(v9ses));
|
||||
omode = v9fs_uflags2omode(file->f_flags, v9fs_proto_dotu(v9ses));
|
||||
fid = file->private_data;
|
||||
if (!fid) {
|
||||
fid = v9fs_fid_clone(file->f_path.dentry);
|
||||
@ -77,7 +77,7 @@ int v9fs_file_open(struct inode *inode, struct file *file)
|
||||
i_size_write(inode, 0);
|
||||
inode->i_blocks = 0;
|
||||
}
|
||||
if ((file->f_flags & O_APPEND) && (!v9fs_extended(v9ses)))
|
||||
if ((file->f_flags & O_APPEND) && (!v9fs_proto_dotu(v9ses)))
|
||||
generic_file_llseek(file, 0, SEEK_END);
|
||||
}
|
||||
|
||||
|
@ -60,7 +60,7 @@ static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
|
||||
res = mode & 0777;
|
||||
if (S_ISDIR(mode))
|
||||
res |= P9_DMDIR;
|
||||
if (v9fs_extended(v9ses)) {
|
||||
if (v9fs_proto_dotu(v9ses)) {
|
||||
if (S_ISLNK(mode))
|
||||
res |= P9_DMSYMLINK;
|
||||
if (v9ses->nodev == 0) {
|
||||
@ -102,21 +102,21 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses, int mode)
|
||||
|
||||
if ((mode & P9_DMDIR) == P9_DMDIR)
|
||||
res |= S_IFDIR;
|
||||
else if ((mode & P9_DMSYMLINK) && (v9fs_extended(v9ses)))
|
||||
else if ((mode & P9_DMSYMLINK) && (v9fs_proto_dotu(v9ses)))
|
||||
res |= S_IFLNK;
|
||||
else if ((mode & P9_DMSOCKET) && (v9fs_extended(v9ses))
|
||||
else if ((mode & P9_DMSOCKET) && (v9fs_proto_dotu(v9ses))
|
||||
&& (v9ses->nodev == 0))
|
||||
res |= S_IFSOCK;
|
||||
else if ((mode & P9_DMNAMEDPIPE) && (v9fs_extended(v9ses))
|
||||
else if ((mode & P9_DMNAMEDPIPE) && (v9fs_proto_dotu(v9ses))
|
||||
&& (v9ses->nodev == 0))
|
||||
res |= S_IFIFO;
|
||||
else if ((mode & P9_DMDEVICE) && (v9fs_extended(v9ses))
|
||||
else if ((mode & P9_DMDEVICE) && (v9fs_proto_dotu(v9ses))
|
||||
&& (v9ses->nodev == 0))
|
||||
res |= S_IFBLK;
|
||||
else
|
||||
res |= S_IFREG;
|
||||
|
||||
if (v9fs_extended(v9ses)) {
|
||||
if (v9fs_proto_dotu(v9ses)) {
|
||||
if ((mode & P9_DMSETUID) == P9_DMSETUID)
|
||||
res |= S_ISUID;
|
||||
|
||||
@ -265,7 +265,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
|
||||
case S_IFBLK:
|
||||
case S_IFCHR:
|
||||
case S_IFSOCK:
|
||||
if (!v9fs_extended(v9ses)) {
|
||||
if (!v9fs_proto_dotu(v9ses)) {
|
||||
P9_DPRINTK(P9_DEBUG_ERROR,
|
||||
"special files without extended mode\n");
|
||||
err = -EINVAL;
|
||||
@ -278,7 +278,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
|
||||
inode->i_fop = &v9fs_file_operations;
|
||||
break;
|
||||
case S_IFLNK:
|
||||
if (!v9fs_extended(v9ses)) {
|
||||
if (!v9fs_proto_dotu(v9ses)) {
|
||||
P9_DPRINTK(P9_DEBUG_ERROR,
|
||||
"extended modes used w/o 9P2000.u\n");
|
||||
err = -EINVAL;
|
||||
@ -288,7 +288,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
|
||||
break;
|
||||
case S_IFDIR:
|
||||
inc_nlink(inode);
|
||||
if (v9fs_extended(v9ses))
|
||||
if (v9fs_proto_dotu(v9ses))
|
||||
inode->i_op = &v9fs_dir_inode_operations_ext;
|
||||
else
|
||||
inode->i_op = &v9fs_dir_inode_operations;
|
||||
@ -575,7 +575,8 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,
|
||||
flags = O_RDWR;
|
||||
|
||||
fid = v9fs_create(v9ses, dir, dentry, NULL, perm,
|
||||
v9fs_uflags2omode(flags, v9fs_extended(v9ses)));
|
||||
v9fs_uflags2omode(flags,
|
||||
v9fs_proto_dotu(v9ses)));
|
||||
if (IS_ERR(fid)) {
|
||||
err = PTR_ERR(fid);
|
||||
fid = NULL;
|
||||
@ -858,7 +859,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr)
|
||||
if (iattr->ia_valid & ATTR_SIZE)
|
||||
wstat.length = iattr->ia_size;
|
||||
|
||||
if (v9fs_extended(v9ses)) {
|
||||
if (v9fs_proto_dotu(v9ses)) {
|
||||
if (iattr->ia_valid & ATTR_UID)
|
||||
wstat.n_uid = iattr->ia_uid;
|
||||
|
||||
@ -897,7 +898,7 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
|
||||
inode->i_uid = v9ses->dfltuid;
|
||||
inode->i_gid = v9ses->dfltgid;
|
||||
|
||||
if (v9fs_extended(v9ses)) {
|
||||
if (v9fs_proto_dotu(v9ses)) {
|
||||
inode->i_uid = stat->n_uid;
|
||||
inode->i_gid = stat->n_gid;
|
||||
}
|
||||
@ -976,7 +977,7 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
|
||||
if (IS_ERR(fid))
|
||||
return PTR_ERR(fid);
|
||||
|
||||
if (!v9fs_extended(v9ses))
|
||||
if (!v9fs_proto_dotu(v9ses))
|
||||
return -EBADF;
|
||||
|
||||
st = p9_client_stat(fid);
|
||||
@ -1066,7 +1067,7 @@ static int v9fs_vfs_mkspecial(struct inode *dir, struct dentry *dentry,
|
||||
struct p9_fid *fid;
|
||||
|
||||
v9ses = v9fs_inode2v9ses(dir);
|
||||
if (!v9fs_extended(v9ses)) {
|
||||
if (!v9fs_proto_dotu(v9ses)) {
|
||||
P9_DPRINTK(P9_DEBUG_ERROR, "not extended\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user