Răsfoiți Sursa

nfsd: SUPPATTR_EXCLCREAT must be encoded before SECURITY_LABEL.

The encode order should be as the bitmask defined order.

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Kinglong Mee 10 ani în urmă
părinte
comite
7d580722c9
1 a modificat fișierele cu 7 adăugiri și 6 ștergeri
  1. 7 6
      fs/nfsd/nfs4xdr.c

+ 7 - 6
fs/nfsd/nfs4xdr.c

@@ -2735,12 +2735,6 @@ out_acl:
 		*p++ = cpu_to_be32(stat.blksize);
 		*p++ = cpu_to_be32(stat.blksize);
 	}
 	}
 #endif /* CONFIG_NFSD_PNFS */
 #endif /* CONFIG_NFSD_PNFS */
-	if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
-		status = nfsd4_encode_security_label(xdr, rqstp, context,
-								contextlen);
-		if (status)
-			goto out;
-	}
 	if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
 	if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
 		p = xdr_reserve_space(xdr, 16);
 		p = xdr_reserve_space(xdr, 16);
 		if (!p)
 		if (!p)
@@ -2751,6 +2745,13 @@ out_acl:
 		*p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD2);
 		*p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD2);
 	}
 	}
 
 
+	if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
+		status = nfsd4_encode_security_label(xdr, rqstp, context,
+								contextlen);
+		if (status)
+			goto out;
+	}
+
 	attrlen = htonl(xdr->buf->len - attrlen_offset - 4);
 	attrlen = htonl(xdr->buf->len - attrlen_offset - 4);
 	write_bytes_to_xdr_buf(xdr->buf, attrlen_offset, &attrlen, 4);
 	write_bytes_to_xdr_buf(xdr->buf, attrlen_offset, &attrlen, 4);
 	status = nfs_ok;
 	status = nfs_ok;