@@ -1351,24 +1351,12 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, struc
13511351 encode_string (xdr , name -> len , name -> name );
13521352}
13531353
1354- static void encode_share_access (struct xdr_stream * xdr , fmode_t fmode )
1354+ static void encode_share_access (struct xdr_stream * xdr , u32 share_access )
13551355{
13561356 __be32 * p ;
13571357
13581358 p = reserve_space (xdr , 8 );
1359- switch (fmode & (FMODE_READ |FMODE_WRITE )) {
1360- case FMODE_READ :
1361- * p ++ = cpu_to_be32 (NFS4_SHARE_ACCESS_READ );
1362- break ;
1363- case FMODE_WRITE :
1364- * p ++ = cpu_to_be32 (NFS4_SHARE_ACCESS_WRITE );
1365- break ;
1366- case FMODE_READ |FMODE_WRITE :
1367- * p ++ = cpu_to_be32 (NFS4_SHARE_ACCESS_BOTH );
1368- break ;
1369- default :
1370- * p ++ = cpu_to_be32 (0 );
1371- }
1359+ * p ++ = cpu_to_be32 (share_access );
13721360 * p = cpu_to_be32 (0 ); /* for linux, share_deny = 0 always */
13731361}
13741362
@@ -1380,7 +1368,7 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena
13801368 * owner 4 = 32
13811369 */
13821370 encode_nfs4_seqid (xdr , arg -> seqid );
1383- encode_share_access (xdr , arg -> fmode );
1371+ encode_share_access (xdr , arg -> share_access );
13841372 p = reserve_space (xdr , 36 );
13851373 p = xdr_encode_hyper (p , arg -> clientid );
13861374 * p ++ = cpu_to_be32 (24 );
@@ -1535,7 +1523,7 @@ static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_close
15351523 encode_op_hdr (xdr , OP_OPEN_DOWNGRADE , decode_open_downgrade_maxsz , hdr );
15361524 encode_nfs4_stateid (xdr , & arg -> stateid );
15371525 encode_nfs4_seqid (xdr , arg -> seqid );
1538- encode_share_access (xdr , arg -> fmode );
1526+ encode_share_access (xdr , arg -> share_access );
15391527}
15401528
15411529static void
@@ -4935,20 +4923,13 @@ static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize)
49354923 return - EIO ;
49364924}
49374925
4938- static int decode_delegation (struct xdr_stream * xdr , struct nfs_openres * res )
4926+ static int decode_rw_delegation (struct xdr_stream * xdr ,
4927+ uint32_t delegation_type ,
4928+ struct nfs_openres * res )
49394929{
49404930 __be32 * p ;
4941- uint32_t delegation_type ;
49424931 int status ;
49434932
4944- p = xdr_inline_decode (xdr , 4 );
4945- if (unlikely (!p ))
4946- goto out_overflow ;
4947- delegation_type = be32_to_cpup (p );
4948- if (delegation_type == NFS4_OPEN_DELEGATE_NONE ) {
4949- res -> delegation_type = 0 ;
4950- return 0 ;
4951- }
49524933 status = decode_stateid (xdr , & res -> delegation );
49534934 if (unlikely (status ))
49544935 return status ;
@@ -4972,6 +4953,52 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)
49724953 return - EIO ;
49734954}
49744955
4956+ static int decode_no_delegation (struct xdr_stream * xdr , struct nfs_openres * res )
4957+ {
4958+ __be32 * p ;
4959+ uint32_t why_no_delegation ;
4960+
4961+ p = xdr_inline_decode (xdr , 4 );
4962+ if (unlikely (!p ))
4963+ goto out_overflow ;
4964+ why_no_delegation = be32_to_cpup (p );
4965+ switch (why_no_delegation ) {
4966+ case WND4_CONTENTION :
4967+ case WND4_RESOURCE :
4968+ xdr_inline_decode (xdr , 4 );
4969+ /* Ignore for now */
4970+ }
4971+ return 0 ;
4972+ out_overflow :
4973+ print_overflow_msg (__func__ , xdr );
4974+ return - EIO ;
4975+ }
4976+
4977+ static int decode_delegation (struct xdr_stream * xdr , struct nfs_openres * res )
4978+ {
4979+ __be32 * p ;
4980+ uint32_t delegation_type ;
4981+
4982+ p = xdr_inline_decode (xdr , 4 );
4983+ if (unlikely (!p ))
4984+ goto out_overflow ;
4985+ delegation_type = be32_to_cpup (p );
4986+ res -> delegation_type = 0 ;
4987+ switch (delegation_type ) {
4988+ case NFS4_OPEN_DELEGATE_NONE :
4989+ return 0 ;
4990+ case NFS4_OPEN_DELEGATE_READ :
4991+ case NFS4_OPEN_DELEGATE_WRITE :
4992+ return decode_rw_delegation (xdr , delegation_type , res );
4993+ case NFS4_OPEN_DELEGATE_NONE_EXT :
4994+ return decode_no_delegation (xdr , res );
4995+ }
4996+ return - EIO ;
4997+ out_overflow :
4998+ print_overflow_msg (__func__ , xdr );
4999+ return - EIO ;
5000+ }
5001+
49755002static int decode_open (struct xdr_stream * xdr , struct nfs_openres * res )
49765003{
49775004 __be32 * p ;
0 commit comments