]> git.baikalelectronics.ru Git - kernel.git/commitdiff
lockd: Update the NLMv1 TEST results encoder to use struct xdr_stream
authorChuck Lever <chuck.lever@oracle.com>
Thu, 3 Jun 2021 20:51:58 +0000 (16:51 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 7 Jul 2021 00:14:43 +0000 (20:14 -0400)
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/lockd/xdr.c

index 840fa8ff84269af631f5d042d72880b751c6567a..daf3524040d66a180f0ecc3c6df209c73ca2f1aa 100644 (file)
@@ -80,15 +80,6 @@ svcxdr_decode_fhandle(struct xdr_stream *xdr, struct nfs_fh *fh)
        return true;
 }
 
-/*
- * Encode and decode owner handle
- */
-static inline __be32 *
-nlm_encode_oh(__be32 *p, struct xdr_netobj *oh)
-{
-       return xdr_encode_netobj(p, oh);
-}
-
 static bool
 svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
 {
@@ -121,39 +112,44 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
        return true;
 }
 
-/*
- * Encode result of a TEST/TEST_MSG call
- */
-static __be32 *
-nlm_encode_testres(__be32 *p, struct nlm_res *resp)
+static bool
+svcxdr_encode_holder(struct xdr_stream *xdr, const struct nlm_lock *lock)
 {
-       s32             start, len;
-
-       if (!(p = nlm_encode_cookie(p, &resp->cookie)))
-               return NULL;
-       *p++ = resp->status;
+       const struct file_lock *fl = &lock->fl;
+       s32 start, len;
 
-       if (resp->status == nlm_lck_denied) {
-               struct file_lock        *fl = &resp->lock.fl;
-
-               *p++ = (fl->fl_type == F_RDLCK)? xdr_zero : xdr_one;
-               *p++ = htonl(resp->lock.svid);
-
-               /* Encode owner handle. */
-               if (!(p = xdr_encode_netobj(p, &resp->lock.oh)))
-                       return NULL;
+       /* exclusive */
+       if (xdr_stream_encode_bool(xdr, fl->fl_type != F_RDLCK) < 0)
+               return false;
+       if (xdr_stream_encode_u32(xdr, lock->svid) < 0)
+               return false;
+       if (!svcxdr_encode_owner(xdr, &lock->oh))
+               return false;
+       start = loff_t_to_s32(fl->fl_start);
+       if (fl->fl_end == OFFSET_MAX)
+               len = 0;
+       else
+               len = loff_t_to_s32(fl->fl_end - fl->fl_start + 1);
+       if (xdr_stream_encode_u32(xdr, start) < 0)
+               return false;
+       if (xdr_stream_encode_u32(xdr, len) < 0)
+               return false;
 
-               start = loff_t_to_s32(fl->fl_start);
-               if (fl->fl_end == OFFSET_MAX)
-                       len = 0;
-               else
-                       len = loff_t_to_s32(fl->fl_end - fl->fl_start + 1);
+       return true;
+}
 
-               *p++ = htonl(start);
-               *p++ = htonl(len);
+static bool
+svcxdr_encode_testrply(struct xdr_stream *xdr, const struct nlm_res *resp)
+{
+       if (!svcxdr_encode_stats(xdr, resp->status))
+               return false;
+       switch (resp->status) {
+       case nlm_lck_denied:
+               if (!svcxdr_encode_holder(xdr, &resp->lock))
+                       return false;
        }
 
-       return p;
+       return true;
 }
 
 
@@ -345,11 +341,11 @@ nlmsvc_encode_void(struct svc_rqst *rqstp, __be32 *p)
 int
 nlmsvc_encode_testres(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct xdr_stream *xdr = &rqstp->rq_res_stream;
        struct nlm_res *resp = rqstp->rq_resp;
 
-       if (!(p = nlm_encode_testres(p, resp)))
-               return 0;
-       return xdr_ressize_check(rqstp, p);
+       return svcxdr_encode_cookie(xdr, &resp->cookie) &&
+               svcxdr_encode_testrply(xdr, resp);
 }
 
 int