NFS: Send attributes in OPEN request for NFS4_CREATE_EXCLUSIVE4_1
Client sends a SETATTR request after OPEN for updating attributes. For create file with S_ISGID is set, the S_ISGID in SETATTR will be ignored at nfs server as chmod of no PERMISSION. v3, same as v2. Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:

committed by
Trond Myklebust

parent
8c61282ff6
commit
5334c5bdac
@@ -2307,15 +2307,25 @@ static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *st
|
||||
* fields corresponding to attributes that were used to store the verifier.
|
||||
* Make sure we clobber those fields in the later setattr call
|
||||
*/
|
||||
static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr)
|
||||
static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata,
|
||||
struct iattr *sattr, struct nfs4_label **label)
|
||||
{
|
||||
if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) &&
|
||||
const u32 *attrset = opendata->o_res.attrset;
|
||||
|
||||
if ((attrset[1] & FATTR4_WORD1_TIME_ACCESS) &&
|
||||
!(sattr->ia_valid & ATTR_ATIME_SET))
|
||||
sattr->ia_valid |= ATTR_ATIME;
|
||||
|
||||
if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) &&
|
||||
if ((attrset[1] & FATTR4_WORD1_TIME_MODIFY) &&
|
||||
!(sattr->ia_valid & ATTR_MTIME_SET))
|
||||
sattr->ia_valid |= ATTR_MTIME;
|
||||
|
||||
/* Except MODE, it seems harmless of setting twice. */
|
||||
if ((attrset[1] & FATTR4_WORD1_MODE))
|
||||
sattr->ia_valid &= ~ATTR_MODE;
|
||||
|
||||
if (attrset[2] & FATTR4_WORD2_SECURITY_LABEL)
|
||||
*label = NULL;
|
||||
}
|
||||
|
||||
static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
|
||||
@@ -2440,7 +2450,7 @@ static int _nfs4_do_open(struct inode *dir,
|
||||
|
||||
if ((opendata->o_arg.open_flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) &&
|
||||
(opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
|
||||
nfs4_exclusive_attrset(opendata, sattr);
|
||||
nfs4_exclusive_attrset(opendata, sattr, &label);
|
||||
|
||||
nfs_fattr_init(opendata->o_res.f_attr);
|
||||
status = nfs4_do_setattr(state->inode, cred,
|
||||
|
Reference in New Issue
Block a user