mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	NFSD: Return word2 bitmask if setting security label in OPEN/CREATE
Security label can be set in OPEN/CREATE request, nfsd should set the bitmask in word2 if setting success. Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
		
							parent
							
								
									ead8fb8c24
								
							
						
					
					
						commit
						75976de655
					
				
					 1 changed files with 56 additions and 39 deletions
				
			
		| 
						 | 
					@ -2226,6 +2226,39 @@ static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static __be32
 | 
				
			||||||
 | 
					nfsd4_encode_bitmap(struct xdr_stream *xdr, u32 bmval0, u32 bmval1, u32 bmval2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__be32 *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (bmval2) {
 | 
				
			||||||
 | 
							p = xdr_reserve_space(xdr, 16);
 | 
				
			||||||
 | 
							if (!p)
 | 
				
			||||||
 | 
								goto out_resource;
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(3);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(bmval0);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(bmval1);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(bmval2);
 | 
				
			||||||
 | 
						} else if (bmval1) {
 | 
				
			||||||
 | 
							p = xdr_reserve_space(xdr, 12);
 | 
				
			||||||
 | 
							if (!p)
 | 
				
			||||||
 | 
								goto out_resource;
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(2);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(bmval0);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(bmval1);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							p = xdr_reserve_space(xdr, 8);
 | 
				
			||||||
 | 
							if (!p)
 | 
				
			||||||
 | 
								goto out_resource;
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(1);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(bmval0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					out_resource:
 | 
				
			||||||
 | 
						return nfserr_resource;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Note: @fhp can be NULL; in this case, we might have to compose the filehandle
 | 
					 * Note: @fhp can be NULL; in this case, we might have to compose the filehandle
 | 
				
			||||||
 * ourselves.
 | 
					 * ourselves.
 | 
				
			||||||
| 
						 | 
					@ -2322,28 +2355,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
 | 
					#endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (bmval2) {
 | 
						status = nfsd4_encode_bitmap(xdr, bmval0, bmval1, bmval2);
 | 
				
			||||||
		p = xdr_reserve_space(xdr, 16);
 | 
						if (status)
 | 
				
			||||||
		if (!p)
 | 
							goto out;
 | 
				
			||||||
			goto out_resource;
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(3);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(bmval0);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(bmval1);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(bmval2);
 | 
					 | 
				
			||||||
	} else if (bmval1) {
 | 
					 | 
				
			||||||
		p = xdr_reserve_space(xdr, 12);
 | 
					 | 
				
			||||||
		if (!p)
 | 
					 | 
				
			||||||
			goto out_resource;
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(2);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(bmval0);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(bmval1);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		p = xdr_reserve_space(xdr, 8);
 | 
					 | 
				
			||||||
		if (!p)
 | 
					 | 
				
			||||||
			goto out_resource;
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(1);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(bmval0);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	attrlen_offset = xdr->buf->len;
 | 
						attrlen_offset = xdr->buf->len;
 | 
				
			||||||
	p = xdr_reserve_space(xdr, 4);
 | 
						p = xdr_reserve_space(xdr, 4);
 | 
				
			||||||
| 
						 | 
					@ -2736,13 +2750,11 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif /* CONFIG_NFSD_PNFS */
 | 
					#endif /* CONFIG_NFSD_PNFS */
 | 
				
			||||||
	if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
 | 
						if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) {
 | 
				
			||||||
		p = xdr_reserve_space(xdr, 16);
 | 
							status = nfsd4_encode_bitmap(xdr, NFSD_SUPPATTR_EXCLCREAT_WORD0,
 | 
				
			||||||
		if (!p)
 | 
											  NFSD_SUPPATTR_EXCLCREAT_WORD1,
 | 
				
			||||||
			goto out_resource;
 | 
											  NFSD_SUPPATTR_EXCLCREAT_WORD2);
 | 
				
			||||||
		*p++ = cpu_to_be32(3);
 | 
							if (status)
 | 
				
			||||||
		*p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD0);
 | 
								goto out;
 | 
				
			||||||
		*p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD1);
 | 
					 | 
				
			||||||
		*p++ = cpu_to_be32(NFSD_SUPPATTR_EXCLCREAT_WORD2);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
 | 
						if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
 | 
				
			||||||
| 
						 | 
					@ -3069,13 +3081,12 @@ nfsd4_encode_create(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_
 | 
				
			||||||
	__be32 *p;
 | 
						__be32 *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!nfserr) {
 | 
						if (!nfserr) {
 | 
				
			||||||
		p = xdr_reserve_space(xdr, 32);
 | 
							p = xdr_reserve_space(xdr, 20);
 | 
				
			||||||
		if (!p)
 | 
							if (!p)
 | 
				
			||||||
			return nfserr_resource;
 | 
								return nfserr_resource;
 | 
				
			||||||
		p = encode_cinfo(p, &create->cr_cinfo);
 | 
							encode_cinfo(p, &create->cr_cinfo);
 | 
				
			||||||
		*p++ = cpu_to_be32(2);
 | 
							nfserr = nfsd4_encode_bitmap(xdr, create->cr_bmval[0],
 | 
				
			||||||
		*p++ = cpu_to_be32(create->cr_bmval[0]);
 | 
									create->cr_bmval[1], create->cr_bmval[2]);
 | 
				
			||||||
		*p++ = cpu_to_be32(create->cr_bmval[1]);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nfserr;
 | 
						return nfserr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3215,16 +3226,22 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_op
 | 
				
			||||||
	nfserr = nfsd4_encode_stateid(xdr, &open->op_stateid);
 | 
						nfserr = nfsd4_encode_stateid(xdr, &open->op_stateid);
 | 
				
			||||||
	if (nfserr)
 | 
						if (nfserr)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
	p = xdr_reserve_space(xdr, 40);
 | 
						p = xdr_reserve_space(xdr, 24);
 | 
				
			||||||
	if (!p)
 | 
						if (!p)
 | 
				
			||||||
		return nfserr_resource;
 | 
							return nfserr_resource;
 | 
				
			||||||
	p = encode_cinfo(p, &open->op_cinfo);
 | 
						p = encode_cinfo(p, &open->op_cinfo);
 | 
				
			||||||
	*p++ = cpu_to_be32(open->op_rflags);
 | 
						*p++ = cpu_to_be32(open->op_rflags);
 | 
				
			||||||
	*p++ = cpu_to_be32(2);
 | 
					 | 
				
			||||||
	*p++ = cpu_to_be32(open->op_bmval[0]);
 | 
					 | 
				
			||||||
	*p++ = cpu_to_be32(open->op_bmval[1]);
 | 
					 | 
				
			||||||
	*p++ = cpu_to_be32(open->op_delegate_type);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nfserr = nfsd4_encode_bitmap(xdr, open->op_bmval[0], open->op_bmval[1],
 | 
				
			||||||
 | 
										open->op_bmval[2]);
 | 
				
			||||||
 | 
						if (nfserr)
 | 
				
			||||||
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p = xdr_reserve_space(xdr, 4);
 | 
				
			||||||
 | 
						if (!p)
 | 
				
			||||||
 | 
							return nfserr_resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*p++ = cpu_to_be32(open->op_delegate_type);
 | 
				
			||||||
	switch (open->op_delegate_type) {
 | 
						switch (open->op_delegate_type) {
 | 
				
			||||||
	case NFS4_OPEN_DELEGATE_NONE:
 | 
						case NFS4_OPEN_DELEGATE_NONE:
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue