|
@@ -395,7 +395,10 @@ static int nfs4_stat_to_errno(int);
|
|
|
2 /* last byte written */ + \
|
|
|
1 /* nt_timechanged (false) */ + \
|
|
|
1 /* layoutupdate4 layout type */ + \
|
|
|
- 1 /* NULL filelayout layoutupdate4 payload */)
|
|
|
+ 1 /* layoutupdate4 opaqueue len */)
|
|
|
+ /* the actual content of layoutupdate4 should
|
|
|
+ be allocated by drivers and spliced in
|
|
|
+ using xdr_write_pages */
|
|
|
#define decode_layoutcommit_maxsz (op_decode_hdr_maxsz + 3)
|
|
|
#define encode_layoutreturn_maxsz (8 + op_encode_hdr_maxsz + \
|
|
|
encode_stateid_maxsz + \
|
|
@@ -1990,7 +1993,7 @@ encode_layoutget(struct xdr_stream *xdr,
|
|
|
static int
|
|
|
encode_layoutcommit(struct xdr_stream *xdr,
|
|
|
struct inode *inode,
|
|
|
- const struct nfs4_layoutcommit_args *args,
|
|
|
+ struct nfs4_layoutcommit_args *args,
|
|
|
struct compound_hdr *hdr)
|
|
|
{
|
|
|
__be32 *p;
|
|
@@ -2011,11 +2014,16 @@ encode_layoutcommit(struct xdr_stream *xdr,
|
|
|
*p++ = cpu_to_be32(0); /* Never send time_modify_changed */
|
|
|
*p++ = cpu_to_be32(NFS_SERVER(args->inode)->pnfs_curr_ld->id);/* type */
|
|
|
|
|
|
- if (NFS_SERVER(inode)->pnfs_curr_ld->encode_layoutcommit)
|
|
|
+ if (NFS_SERVER(inode)->pnfs_curr_ld->encode_layoutcommit) {
|
|
|
NFS_SERVER(inode)->pnfs_curr_ld->encode_layoutcommit(
|
|
|
NFS_I(inode)->layout, xdr, args);
|
|
|
- else
|
|
|
- encode_uint32(xdr, 0); /* no layout-type payload */
|
|
|
+ } else {
|
|
|
+ encode_uint32(xdr, args->layoutupdate_len);
|
|
|
+ if (args->layoutupdate_pages) {
|
|
|
+ xdr_write_pages(xdr, args->layoutupdate_pages, 0,
|
|
|
+ args->layoutupdate_len);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|