mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 04:53:36 +01:00
nfsd-6.9 fixes:
- Fix a potential tracepoint crash - Fix NFSv4 GETATTR on big-endian platforms -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEKLLlsBKG3yQ88j7+M2qzM29mf5cFAmYdlTMACgkQM2qzM29m f5esDBAAnXOgnizrGTMkpmqWL11UmpIjWDyTxQ7dWrk7dqQGXT3qAAya3dijaJiM a1eLdFiaaKFxtkFrR9QPCtqfpR/gNxkkHf05SK/LQ1SL2OMbAMa1/UIaf0teWM78 CafmMT1YLMyiEDFpB0rAnoJ5VvTU2BVowjfzAW/0PkmwLlO5+XMMhPx/qd1061Ll gwl2pqwZPankZRWsUBZtDE5bCTuKQDePrG7e7J7FKVPR+1EqAcudsDMh1tmSTvar 0NTeLH0LTJ2imZi21b+j9+VKtwXTtmuY2GxhADNb8goUuQI2+lqNakDk4AflQvuy Kg3Z0dnNkTWGKPIbV/020vhN/6Fev5RVF9SdPF5WcEfeaWDV5rjEY1s4svphUuS+ Nh8VCPeQEAamAcShA584G8onWdXGP9sYgBiWXZvh8R38Akq6AC6LPEkbqT6dR5mU ftMDGb3BBvkOs7ahjaiUUaPqoRXxeS+Qh06Sa3JrZhbMFdccZRq/AgodtC7ZYGZZ 4u7yG+y8MIytHbIljE2aCo8U8jV8f4nl6VV3xda3H9zZG0RRfpZfFetHiAWqRjoq BEB75eLFDjf1qAXENWzzdeS0wLRRr5PHIkBfDeFq71zyJO37RH15sfVnavinj2KY 7a0ASn2xlqzDHY7MTZ2ULRCLYsS7XwN88KBF7tNghfQBKJYs59A= =wAk4 -----END PGP SIGNATURE----- Merge tag 'nfsd-6.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux Pull nfsd fixes from Chuck Lever: - Fix a potential tracepoint crash - Fix NFSv4 GETATTR on big-endian platforms * tag 'nfsd-6.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: NFSD: fix endianness issue in nfsd4_encode_fattr4 SUNRPC: Fix rpcgss_context trace event acceptor field
This commit is contained in:
commit
96fca68c4f
2 changed files with 25 additions and 26 deletions
|
@ -3490,11 +3490,13 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
struct dentry *dentry, const u32 *bmval,
|
||||
int ignore_crossmnt)
|
||||
{
|
||||
DECLARE_BITMAP(attr_bitmap, ARRAY_SIZE(nfsd4_enc_fattr4_encode_ops));
|
||||
struct nfsd4_fattr_args args;
|
||||
struct svc_fh *tempfh = NULL;
|
||||
int starting_len = xdr->buf->len;
|
||||
__be32 *attrlen_p, status;
|
||||
int attrlen_offset;
|
||||
u32 attrmask[3];
|
||||
int err;
|
||||
struct nfsd4_compoundres *resp = rqstp->rq_resp;
|
||||
u32 minorversion = resp->cstate.minorversion;
|
||||
|
@ -3502,10 +3504,6 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
.mnt = exp->ex_path.mnt,
|
||||
.dentry = dentry,
|
||||
};
|
||||
union {
|
||||
u32 attrmask[3];
|
||||
unsigned long mask[2];
|
||||
} u;
|
||||
unsigned long bit;
|
||||
bool file_modified = false;
|
||||
u64 size = 0;
|
||||
|
@ -3521,20 +3519,19 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
/*
|
||||
* Make a local copy of the attribute bitmap that can be modified.
|
||||
*/
|
||||
memset(&u, 0, sizeof(u));
|
||||
u.attrmask[0] = bmval[0];
|
||||
u.attrmask[1] = bmval[1];
|
||||
u.attrmask[2] = bmval[2];
|
||||
attrmask[0] = bmval[0];
|
||||
attrmask[1] = bmval[1];
|
||||
attrmask[2] = bmval[2];
|
||||
|
||||
args.rdattr_err = 0;
|
||||
if (exp->ex_fslocs.migrated) {
|
||||
status = fattr_handle_absent_fs(&u.attrmask[0], &u.attrmask[1],
|
||||
&u.attrmask[2], &args.rdattr_err);
|
||||
status = fattr_handle_absent_fs(&attrmask[0], &attrmask[1],
|
||||
&attrmask[2], &args.rdattr_err);
|
||||
if (status)
|
||||
goto out;
|
||||
}
|
||||
args.size = 0;
|
||||
if (u.attrmask[0] & (FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE)) {
|
||||
if (attrmask[0] & (FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE)) {
|
||||
status = nfsd4_deleg_getattr_conflict(rqstp, d_inode(dentry),
|
||||
&file_modified, &size);
|
||||
if (status)
|
||||
|
@ -3553,16 +3550,16 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
|
||||
if (!(args.stat.result_mask & STATX_BTIME))
|
||||
/* underlying FS does not offer btime so we can't share it */
|
||||
u.attrmask[1] &= ~FATTR4_WORD1_TIME_CREATE;
|
||||
if ((u.attrmask[0] & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
|
||||
attrmask[1] &= ~FATTR4_WORD1_TIME_CREATE;
|
||||
if ((attrmask[0] & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
|
||||
FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) ||
|
||||
(u.attrmask[1] & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
||||
(attrmask[1] & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
||||
FATTR4_WORD1_SPACE_TOTAL))) {
|
||||
err = vfs_statfs(&path, &args.statfs);
|
||||
if (err)
|
||||
goto out_nfserr;
|
||||
}
|
||||
if ((u.attrmask[0] & (FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FSID)) &&
|
||||
if ((attrmask[0] & (FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FSID)) &&
|
||||
!fhp) {
|
||||
tempfh = kmalloc(sizeof(struct svc_fh), GFP_KERNEL);
|
||||
status = nfserr_jukebox;
|
||||
|
@ -3577,10 +3574,10 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
args.fhp = fhp;
|
||||
|
||||
args.acl = NULL;
|
||||
if (u.attrmask[0] & FATTR4_WORD0_ACL) {
|
||||
if (attrmask[0] & FATTR4_WORD0_ACL) {
|
||||
err = nfsd4_get_nfs4_acl(rqstp, dentry, &args.acl);
|
||||
if (err == -EOPNOTSUPP)
|
||||
u.attrmask[0] &= ~FATTR4_WORD0_ACL;
|
||||
attrmask[0] &= ~FATTR4_WORD0_ACL;
|
||||
else if (err == -EINVAL) {
|
||||
status = nfserr_attrnotsupp;
|
||||
goto out;
|
||||
|
@ -3592,17 +3589,17 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
|
||||
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
|
||||
args.context = NULL;
|
||||
if ((u.attrmask[2] & FATTR4_WORD2_SECURITY_LABEL) ||
|
||||
u.attrmask[0] & FATTR4_WORD0_SUPPORTED_ATTRS) {
|
||||
if ((attrmask[2] & FATTR4_WORD2_SECURITY_LABEL) ||
|
||||
attrmask[0] & FATTR4_WORD0_SUPPORTED_ATTRS) {
|
||||
if (exp->ex_flags & NFSEXP_SECURITY_LABEL)
|
||||
err = security_inode_getsecctx(d_inode(dentry),
|
||||
&args.context, &args.contextlen);
|
||||
else
|
||||
err = -EOPNOTSUPP;
|
||||
args.contextsupport = (err == 0);
|
||||
if (u.attrmask[2] & FATTR4_WORD2_SECURITY_LABEL) {
|
||||
if (attrmask[2] & FATTR4_WORD2_SECURITY_LABEL) {
|
||||
if (err == -EOPNOTSUPP)
|
||||
u.attrmask[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
|
||||
attrmask[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
|
||||
else if (err)
|
||||
goto out_nfserr;
|
||||
}
|
||||
|
@ -3610,8 +3607,8 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
#endif /* CONFIG_NFSD_V4_SECURITY_LABEL */
|
||||
|
||||
/* attrmask */
|
||||
status = nfsd4_encode_bitmap4(xdr, u.attrmask[0],
|
||||
u.attrmask[1], u.attrmask[2]);
|
||||
status = nfsd4_encode_bitmap4(xdr, attrmask[0], attrmask[1],
|
||||
attrmask[2]);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
|
@ -3620,7 +3617,9 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
|||
attrlen_p = xdr_reserve_space(xdr, XDR_UNIT);
|
||||
if (!attrlen_p)
|
||||
goto out_resource;
|
||||
for_each_set_bit(bit, (const unsigned long *)&u.mask,
|
||||
bitmap_from_arr32(attr_bitmap, attrmask,
|
||||
ARRAY_SIZE(nfsd4_enc_fattr4_encode_ops));
|
||||
for_each_set_bit(bit, attr_bitmap,
|
||||
ARRAY_SIZE(nfsd4_enc_fattr4_encode_ops)) {
|
||||
status = nfsd4_enc_fattr4_encode_ops[bit](xdr, &args);
|
||||
if (status != nfs_ok)
|
||||
|
|
|
@ -609,7 +609,7 @@ TRACE_EVENT(rpcgss_context,
|
|||
__field(unsigned int, timeout)
|
||||
__field(u32, window_size)
|
||||
__field(int, len)
|
||||
__string(acceptor, data)
|
||||
__string_len(acceptor, data, len)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
@ -618,7 +618,7 @@ TRACE_EVENT(rpcgss_context,
|
|||
__entry->timeout = timeout;
|
||||
__entry->window_size = window_size;
|
||||
__entry->len = len;
|
||||
strncpy(__get_str(acceptor), data, len);
|
||||
__assign_str(acceptor, data);
|
||||
),
|
||||
|
||||
TP_printk("win_size=%u expiry=%lu now=%lu timeout=%u acceptor=%.*s",
|
||||
|
|
Loading…
Reference in a new issue