diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 3cc75445a68d..fee2d14b158b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -943,6 +943,22 @@ static struct nfs4_state *nfs4_open_delegated(struct inode *inode, int flags, st | |||
943 | } | 943 | } |
944 | 944 | ||
945 | /* | 945 | /* |
946 | * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-* | ||
947 | * fields corresponding to attributes that were used to store the verifier. | ||
948 | * Make sure we clobber those fields in the later setattr call | ||
949 | */ | ||
950 | static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr) | ||
951 | { | ||
952 | if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) && | ||
953 | !(sattr->ia_valid & ATTR_ATIME_SET)) | ||
954 | sattr->ia_valid |= ATTR_ATIME; | ||
955 | |||
956 | if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) && | ||
957 | !(sattr->ia_valid & ATTR_MTIME_SET)) | ||
958 | sattr->ia_valid |= ATTR_MTIME; | ||
959 | } | ||
960 | |||
961 | /* | ||
946 | * Returns a referenced nfs4_state | 962 | * Returns a referenced nfs4_state |
947 | */ | 963 | */ |
948 | static int _nfs4_do_open(struct inode *dir, struct path *path, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res) | 964 | static int _nfs4_do_open(struct inode *dir, struct path *path, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res) |
@@ -973,6 +989,9 @@ static int _nfs4_do_open(struct inode *dir, struct path *path, int flags, struct | |||
973 | if (status != 0) | 989 | if (status != 0) |
974 | goto err_opendata_free; | 990 | goto err_opendata_free; |
975 | 991 | ||
992 | if (opendata->o_arg.open_flags & O_EXCL) | ||
993 | nfs4_exclusive_attrset(opendata, sattr); | ||
994 | |||
976 | status = -ENOMEM; | 995 | status = -ENOMEM; |
977 | state = nfs4_opendata_to_nfs4_state(opendata); | 996 | state = nfs4_opendata_to_nfs4_state(opendata); |
978 | if (state == NULL) | 997 | if (state == NULL) |
@@ -1784,6 +1803,7 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
1784 | status = nfs4_do_setattr(state->inode, &fattr, sattr, state); | 1803 | status = nfs4_do_setattr(state->inode, &fattr, sattr, state); |
1785 | if (status == 0) | 1804 | if (status == 0) |
1786 | nfs_setattr_update_inode(state->inode, sattr); | 1805 | nfs_setattr_update_inode(state->inode, sattr); |
1806 | nfs_post_op_update_inode(state->inode, &fattr); | ||
1787 | } | 1807 | } |
1788 | if (status == 0 && (nd->flags & LOOKUP_OPEN) != 0) | 1808 | if (status == 0 && (nd->flags & LOOKUP_OPEN) != 0) |
1789 | status = nfs4_intent_set_file(nd, &path, state); | 1809 | status = nfs4_intent_set_file(nd, &path, state); |