.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ],
.rpc_argp = &rdata->args,
.rpc_resp = &rdata->res,
- .rpc_cred = rdata->cred,
};
unsigned long timestamp = jiffies;
int status;
struct nfs4_state *state;
state = (struct nfs4_state *)filp->private_data;
memcpy(&rdata->args.stateid, &state->stateid, sizeof(rdata->args.stateid));
- } else
+ msg.rpc_cred = state->owner->so_cred;
+ } else {
memcpy(&rdata->args.stateid, &zero_stateid, sizeof(rdata->args.stateid));
+ msg.rpc_cred = NFS_I(inode)->mm_cred;
+ }
fattr->valid = 0;
status = rpc_call_sync(server->client, &msg, flags);
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE],
.rpc_argp = &wdata->args,
.rpc_resp = &wdata->res,
- .rpc_cred = wdata->cred,
};
int status;
struct nfs4_state *state;
state = (struct nfs4_state *)filp->private_data;
memcpy(&wdata->args.stateid, &state->stateid, sizeof(wdata->args.stateid));
- } else
+ msg.rpc_cred = state->owner->so_cred;
+ } else {
memcpy(&wdata->args.stateid, &zero_stateid, sizeof(wdata->args.stateid));
+ msg.rpc_cred = NFS_I(inode)->mm_cred;
+ }
fattr->valid = 0;
status = rpc_call_sync(server->client, &msg, rpcflags);
+ NFS_CACHEINV(inode);
dprintk("NFS reply write: %d\n", status);
return status;
}
struct xdr_buf *buf = xdr->buf;
struct iovec *iov;
ssize_t shift;
+ int padding;
/* Realign pages to current pointer position */
iov = buf->head;
xdr_shrink_bufhead(buf, shift);
/* Truncate page data and move it into the tail */
- len = XDR_QUADLEN(len) << 2;
if (buf->page_len > len)
xdr_shrink_pagelen(buf, buf->page_len - len);
+ padding = (XDR_QUADLEN(len) << 2) - len;
xdr->iov = iov = buf->tail;
- xdr->p = (uint32_t *)iov->iov_base;
+ xdr->p = (uint32_t *)((char *)iov->iov_base + padding);
xdr->end = (uint32_t *)((char *)iov->iov_base + iov->iov_len);
}