mirror of
https://github.com/torvalds/linux
synced 2024-09-20 02:57:25 +00:00
fs/9p: Make the writeback_fid owned by root
Changes to make sure writeback fid is owned by root Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
parent
3dc5436aa5
commit
7c9e592e1f
92
fs/9p/fid.c
92
fs/9p/fid.c
|
@ -125,46 +125,17 @@ static int build_path_from_dentry(struct v9fs_session_info *v9ses,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static struct p9_fid *v9fs_fid_lookup_with_uid(struct dentry *dentry,
|
||||||
* v9fs_fid_lookup - lookup for a fid, try to walk if not found
|
uid_t uid, int any)
|
||||||
* @dentry: dentry to look for fid in
|
|
||||||
*
|
|
||||||
* Look for a fid in the specified dentry for the current user.
|
|
||||||
* If no fid is found, try to create one walking from a fid from the parent
|
|
||||||
* dentry (if it has one), or the root dentry. If the user haven't accessed
|
|
||||||
* the fs yet, attach now and walk from the root.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
|
|
||||||
{
|
{
|
||||||
int i, n, l, clone, any, access;
|
|
||||||
u32 uid;
|
|
||||||
struct p9_fid *fid, *old_fid = NULL;
|
|
||||||
struct dentry *ds;
|
struct dentry *ds;
|
||||||
struct v9fs_session_info *v9ses;
|
|
||||||
char **wnames, *uname;
|
char **wnames, *uname;
|
||||||
|
int i, n, l, clone, access;
|
||||||
|
struct v9fs_session_info *v9ses;
|
||||||
|
struct p9_fid *fid, *old_fid = NULL;
|
||||||
|
|
||||||
v9ses = v9fs_inode2v9ses(dentry->d_inode);
|
v9ses = v9fs_inode2v9ses(dentry->d_inode);
|
||||||
access = v9ses->flags & V9FS_ACCESS_MASK;
|
access = v9ses->flags & V9FS_ACCESS_MASK;
|
||||||
switch (access) {
|
|
||||||
case V9FS_ACCESS_SINGLE:
|
|
||||||
case V9FS_ACCESS_USER:
|
|
||||||
case V9FS_ACCESS_CLIENT:
|
|
||||||
uid = current_fsuid();
|
|
||||||
any = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case V9FS_ACCESS_ANY:
|
|
||||||
uid = v9ses->uid;
|
|
||||||
any = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
uid = ~0;
|
|
||||||
any = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fid = v9fs_fid_find(dentry, uid, any);
|
fid = v9fs_fid_find(dentry, uid, any);
|
||||||
if (fid)
|
if (fid)
|
||||||
return fid;
|
return fid;
|
||||||
|
@ -250,6 +221,45 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
|
||||||
return fid;
|
return fid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* v9fs_fid_lookup - lookup for a fid, try to walk if not found
|
||||||
|
* @dentry: dentry to look for fid in
|
||||||
|
*
|
||||||
|
* Look for a fid in the specified dentry for the current user.
|
||||||
|
* If no fid is found, try to create one walking from a fid from the parent
|
||||||
|
* dentry (if it has one), or the root dentry. If the user haven't accessed
|
||||||
|
* the fs yet, attach now and walk from the root.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
|
||||||
|
{
|
||||||
|
uid_t uid;
|
||||||
|
int any, access;
|
||||||
|
struct v9fs_session_info *v9ses;
|
||||||
|
|
||||||
|
v9ses = v9fs_inode2v9ses(dentry->d_inode);
|
||||||
|
access = v9ses->flags & V9FS_ACCESS_MASK;
|
||||||
|
switch (access) {
|
||||||
|
case V9FS_ACCESS_SINGLE:
|
||||||
|
case V9FS_ACCESS_USER:
|
||||||
|
case V9FS_ACCESS_CLIENT:
|
||||||
|
uid = current_fsuid();
|
||||||
|
any = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case V9FS_ACCESS_ANY:
|
||||||
|
uid = v9ses->uid;
|
||||||
|
any = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
uid = ~0;
|
||||||
|
any = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return v9fs_fid_lookup_with_uid(dentry, uid, any);
|
||||||
|
}
|
||||||
|
|
||||||
struct p9_fid *v9fs_fid_clone(struct dentry *dentry)
|
struct p9_fid *v9fs_fid_clone(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
struct p9_fid *fid, *ret;
|
struct p9_fid *fid, *ret;
|
||||||
|
@ -262,13 +272,24 @@ struct p9_fid *v9fs_fid_clone(struct dentry *dentry)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct p9_fid *v9fs_fid_clone_with_uid(struct dentry *dentry, uid_t uid)
|
||||||
|
{
|
||||||
|
struct p9_fid *fid, *ret;
|
||||||
|
|
||||||
|
fid = v9fs_fid_lookup_with_uid(dentry, uid, 0);
|
||||||
|
if (IS_ERR(fid))
|
||||||
|
return fid;
|
||||||
|
|
||||||
|
ret = p9_client_walk(fid, 0, NULL, 1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
|
struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct p9_fid *fid;
|
struct p9_fid *fid;
|
||||||
|
|
||||||
fid = v9fs_fid_clone(dentry);
|
fid = v9fs_fid_clone_with_uid(dentry, 0);
|
||||||
if (IS_ERR(fid))
|
if (IS_ERR(fid))
|
||||||
goto error_out;
|
goto error_out;
|
||||||
/*
|
/*
|
||||||
|
@ -276,7 +297,6 @@ struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
|
||||||
* dirty pages. We always request for the open fid in read-write
|
* dirty pages. We always request for the open fid in read-write
|
||||||
* mode so that a partial page write which result in page
|
* mode so that a partial page write which result in page
|
||||||
* read can work.
|
* read can work.
|
||||||
* FIXME!!: we should make the fid owned by uid = 0
|
|
||||||
*/
|
*/
|
||||||
err = p9_client_open(fid, O_RDWR);
|
err = p9_client_open(fid, O_RDWR);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
|
|
Loading…
Reference in a new issue