fs/9p: v9fs_stat2inode should update suid/sgid bits.
Create a new helper that update the permission bits and use that, instead of opencoding the logic. Reported and bisected by: M. Mohan Kumar <mohan@in.ibm.com> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
parent
5d3851530d
commit
df345c674b
|
@ -94,6 +94,32 @@ static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* p9mode2perm- convert plan9 mode bits to unix permission bits
|
||||||
|
* @v9ses: v9fs session information
|
||||||
|
* @stat: p9_wstat from which mode need to be derived
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int p9mode2perm(struct v9fs_session_info *v9ses,
|
||||||
|
struct p9_wstat *stat)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
int mode = stat->mode;
|
||||||
|
|
||||||
|
res = mode & S_IALLUGO;
|
||||||
|
if (v9fs_proto_dotu(v9ses)) {
|
||||||
|
if ((mode & P9_DMSETUID) == P9_DMSETUID)
|
||||||
|
res |= S_ISUID;
|
||||||
|
|
||||||
|
if ((mode & P9_DMSETGID) == P9_DMSETGID)
|
||||||
|
res |= S_ISGID;
|
||||||
|
|
||||||
|
if ((mode & P9_DMSETVTX) == P9_DMSETVTX)
|
||||||
|
res |= S_ISVTX;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* p9mode2unixmode- convert plan9 mode bits to unix mode bits
|
* p9mode2unixmode- convert plan9 mode bits to unix mode bits
|
||||||
* @v9ses: v9fs session information
|
* @v9ses: v9fs session information
|
||||||
|
@ -107,8 +133,8 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses,
|
||||||
int res;
|
int res;
|
||||||
int mode = stat->mode;
|
int mode = stat->mode;
|
||||||
|
|
||||||
res = mode & S_IALLUGO;
|
|
||||||
*rdev = 0;
|
*rdev = 0;
|
||||||
|
res = p9mode2perm(v9ses, stat);
|
||||||
|
|
||||||
if ((mode & P9_DMDIR) == P9_DMDIR)
|
if ((mode & P9_DMDIR) == P9_DMDIR)
|
||||||
res |= S_IFDIR;
|
res |= S_IFDIR;
|
||||||
|
@ -142,16 +168,6 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses,
|
||||||
} else
|
} else
|
||||||
res |= S_IFREG;
|
res |= S_IFREG;
|
||||||
|
|
||||||
if (v9fs_proto_dotu(v9ses)) {
|
|
||||||
if ((mode & P9_DMSETUID) == P9_DMSETUID)
|
|
||||||
res |= S_ISUID;
|
|
||||||
|
|
||||||
if ((mode & P9_DMSETGID) == P9_DMSETGID)
|
|
||||||
res |= S_ISGID;
|
|
||||||
|
|
||||||
if ((mode & P9_DMSETVTX) == P9_DMSETVTX)
|
|
||||||
res |= S_ISVTX;
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1168,7 +1184,7 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
|
||||||
set_nlink(inode, i_nlink);
|
set_nlink(inode, i_nlink);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mode = stat->mode & S_IALLUGO;
|
mode = p9mode2perm(v9ses, stat);
|
||||||
mode |= inode->i_mode & ~S_IALLUGO;
|
mode |= inode->i_mode & ~S_IALLUGO;
|
||||||
inode->i_mode = mode;
|
inode->i_mode = mode;
|
||||||
i_size_write(inode, stat->length);
|
i_size_write(inode, stat->length);
|
||||||
|
|
Loading…
Reference in New Issue