.. | .. |
---|
3405 | 3405 | case nfserr_noent: |
---|
3406 | 3406 | xdr_truncate_encode(xdr, start_offset); |
---|
3407 | 3407 | goto skip_entry; |
---|
| 3408 | + case nfserr_jukebox: |
---|
| 3409 | + /* |
---|
| 3410 | + * The pseudoroot should only display dentries that lead to |
---|
| 3411 | + * exports. If we get EJUKEBOX here, then we can't tell whether |
---|
| 3412 | + * this entry should be included. Just fail the whole READDIR |
---|
| 3413 | + * with NFS4ERR_DELAY in that case, and hope that the situation |
---|
| 3414 | + * will resolve itself by the client's next attempt. |
---|
| 3415 | + */ |
---|
| 3416 | + if (cd->rd_fhp->fh_export->ex_flags & NFSEXP_V4ROOT) |
---|
| 3417 | + goto fail; |
---|
| 3418 | + fallthrough; |
---|
3408 | 3419 | default: |
---|
3409 | 3420 | /* |
---|
3410 | 3421 | * If the client requested the RDATTR_ERROR attribute, |
---|
.. | .. |
---|
3694 | 3705 | p = xdr_reserve_space(xdr, 32); |
---|
3695 | 3706 | if (!p) |
---|
3696 | 3707 | return nfserr_resource; |
---|
3697 | | - *p++ = cpu_to_be32(0); |
---|
| 3708 | + *p++ = cpu_to_be32(open->op_recall); |
---|
3698 | 3709 | |
---|
3699 | 3710 | /* |
---|
3700 | 3711 | * TODO: space_limit's in delegations |
---|
.. | .. |
---|
4396 | 4407 | |
---|
4397 | 4408 | *p++ = cpu_to_be32(gdev->gd_layout_type); |
---|
4398 | 4409 | |
---|
4399 | | - /* If maxcount is 0 then just update notifications */ |
---|
4400 | | - if (gdev->gd_maxcount != 0) { |
---|
4401 | | - ops = nfsd4_layout_ops[gdev->gd_layout_type]; |
---|
4402 | | - nfserr = ops->encode_getdeviceinfo(xdr, gdev); |
---|
4403 | | - if (nfserr) { |
---|
4404 | | - /* |
---|
4405 | | - * We don't bother to burden the layout drivers with |
---|
4406 | | - * enforcing gd_maxcount, just tell the client to |
---|
4407 | | - * come back with a bigger buffer if it's not enough. |
---|
4408 | | - */ |
---|
4409 | | - if (xdr->buf->len + 4 > gdev->gd_maxcount) |
---|
4410 | | - goto toosmall; |
---|
4411 | | - return nfserr; |
---|
4412 | | - } |
---|
| 4410 | + ops = nfsd4_layout_ops[gdev->gd_layout_type]; |
---|
| 4411 | + nfserr = ops->encode_getdeviceinfo(xdr, gdev); |
---|
| 4412 | + if (nfserr) { |
---|
| 4413 | + /* |
---|
| 4414 | + * We don't bother to burden the layout drivers with |
---|
| 4415 | + * enforcing gd_maxcount, just tell the client to |
---|
| 4416 | + * come back with a bigger buffer if it's not enough. |
---|
| 4417 | + */ |
---|
| 4418 | + if (xdr->buf->len + 4 > gdev->gd_maxcount) |
---|
| 4419 | + goto toosmall; |
---|
| 4420 | + return nfserr; |
---|
4413 | 4421 | } |
---|
4414 | 4422 | |
---|
4415 | 4423 | if (gdev->gd_notify_types) { |
---|