| .. | .. |
|---|
| 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) { |
|---|