@@ -1142,7 +1142,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
{
struct nfsd4_setattr *setattr = &u->setattr;
__be32 status = nfs_ok;
- int err;
+ int err, retries;
if (setattr->sa_iattr.ia_valid & ATTR_SIZE) {
status = nfs4_preprocess_stateid_op(rqstp, cstate,
@@ -1173,8 +1173,21 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
&setattr->sa_label);
if (status)
goto out;
- status = nfsd_setattr(rqstp, &cstate->current_fh, &setattr->sa_iattr,
- 0, (time64_t)0);
+
+ retries = 1;
+ do {
+ status = nfsd_setattr(rqstp, &cstate->current_fh,
+ &setattr->sa_iattr, 0, (time64_t)0);
+ if (status != nfserr_jukebox)
+ break;
+ if (!retries--)
+ break;
+ if (!nfsd4_wait_for_delegreturn(rqstp, &cstate->current_fh))
+ break;
+
+ fh_clear_pre_post_attrs(&cstate->current_fh);
+ } while (1);
+
out:
fh_drop_write(&cstate->current_fh);
return status;