]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
lockd: Update the NLMv4 TEST results encoder to use struct xdr_stream
authorChuck Lever <chuck.lever@oracle.com>
Thu, 3 Jun 2021 20:53:17 +0000 (16:53 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 7 Jul 2021 00:14:44 +0000 (20:14 -0400)
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/lockd/xdr4.c

index 0db142e203d2b22ba79666980fb1639e68361fd2..9b8a7afb935ca8efd821d3926389a110299e42b9 100644 (file)
@@ -20,8 +20,6 @@
 
 #include "svcxdr.h"
 
-#define NLMDBG_FACILITY                NLMDBG_XDR
-
 static inline loff_t
 s64_to_loff_t(__s64 offset)
 {
@@ -110,44 +108,44 @@ svcxdr_decode_lock(struct xdr_stream *xdr, struct nlm_lock *lock)
        return true;
 }
 
-/*
- * Encode result of a TEST/TEST_MSG call
- */
-static __be32 *
-nlm4_encode_testres(__be32 *p, struct nlm_res *resp)
+static bool
+svcxdr_encode_holder(struct xdr_stream *xdr, const struct nlm_lock *lock)
 {
-       s64             start, len;
+       const struct file_lock *fl = &lock->fl;
+       s64 start, len;
 
-       dprintk("xdr: before encode_testres (p %p resp %p)\n", p, resp);
-       if (!(p = nlm4_encode_cookie(p, &resp->cookie)))
-               return NULL;
-       *p++ = resp->status;
+       /* 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_s64(fl->fl_start);
+       if (fl->fl_end == OFFSET_MAX)
+               len = 0;
+       else
+               len = loff_t_to_s64(fl->fl_end - fl->fl_start + 1);
+       if (xdr_stream_encode_u64(xdr, start) < 0)
+               return false;
+       if (xdr_stream_encode_u64(xdr, len) < 0)
+               return false;
+
+       return true;
+}
 
-       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;
-
-               start = loff_t_to_s64(fl->fl_start);
-               if (fl->fl_end == OFFSET_MAX)
-                       len = 0;
-               else
-                       len = loff_t_to_s64(fl->fl_end - fl->fl_start + 1);
-               
-               p = xdr_encode_hyper(p, start);
-               p = xdr_encode_hyper(p, len);
-               dprintk("xdr: encode_testres (status %u pid %d type %d start %Ld end %Ld)\n",
-                       resp->status, (int)resp->lock.svid, fl->fl_type,
-                       (long long)fl->fl_start,  (long long)fl->fl_end);
+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;
        }
 
-       dprintk("xdr: after encode_testres (p %p resp %p)\n", p, resp);
-       return p;
+       return true;
 }
 
 
@@ -338,11 +336,11 @@ nlm4svc_encode_void(struct svc_rqst *rqstp, __be32 *p)
 int
 nlm4svc_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 = nlm4_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