summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2014-07-13 00:19:39 +0000
committerrmacklem <rmacklem@FreeBSD.org>2014-07-13 00:19:39 +0000
commitf7a09fd7e78f54100fde4eab7dcd439162f0c05a (patch)
treeaf8110f46977e0a01ed7d5b03ee940194e2cead3 /sys/fs
parent0cff4b03ddab4866935fdab21800c42ee8c1c6b2 (diff)
downloadFreeBSD-src-f7a09fd7e78f54100fde4eab7dcd439162f0c05a.zip
FreeBSD-src-f7a09fd7e78f54100fde4eab7dcd439162f0c05a.tar.gz
MFC: r268008
There might be a potential race condition for the NFSv4 client when a newly created file has another open done on it that update the open mode. This patch moves the code that updates the open mode up into the block where the mutex is held to ensure this cannot happen. No bug caused by this potential race has been observed, but this fix is a safety belt to ensure it cannot happen.
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/nfsclient/nfs_clstate.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index 5fa302f..6f0692c 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -281,6 +281,23 @@ nfscl_open(vnode_t vp, u_int8_t *nfhp, int fhlen, u_int32_t amode, int usedeleg,
newonep);
/*
+ * Now, check the mode on the open and return the appropriate
+ * value.
+ */
+ if (retp != NULL) {
+ if (nfhp != NULL && dp != NULL && nop == NULL)
+ /* new local open on delegation */
+ *retp = NFSCLOPEN_SETCRED;
+ else
+ *retp = NFSCLOPEN_OK;
+ }
+ if (op != NULL && (amode & ~(op->nfso_mode))) {
+ op->nfso_mode |= amode;
+ if (retp != NULL && dp == NULL)
+ *retp = NFSCLOPEN_DOOPEN;
+ }
+
+ /*
* Serialize modifications to the open owner for multiple threads
* within the same process using a read/write sleep lock.
*/
@@ -295,23 +312,6 @@ nfscl_open(vnode_t vp, u_int8_t *nfhp, int fhlen, u_int32_t amode, int usedeleg,
*owpp = owp;
if (opp != NULL)
*opp = op;
- if (retp != NULL) {
- if (nfhp != NULL && dp != NULL && nop == NULL)
- /* new local open on delegation */
- *retp = NFSCLOPEN_SETCRED;
- else
- *retp = NFSCLOPEN_OK;
- }
-
- /*
- * Now, check the mode on the open and return the appropriate
- * value.
- */
- if (op != NULL && (amode & ~(op->nfso_mode))) {
- op->nfso_mode |= amode;
- if (retp != NULL && dp == NULL)
- *retp = NFSCLOPEN_DOOPEN;
- }
return (0);
}
OpenPOWER on IntegriCloud