nfsd4: adjust buflen for encoded attrs bitmap based on actual bitmap length
authorBenny Halevy <bhalevy@panasas.com>
Thu, 30 Sep 2010 18:47:46 +0000 (20:47 +0200)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 1 Oct 2010 20:52:24 +0000 (16:52 -0400)
The existing code adjusted it based on the worst case scenario for the returned
bitmap and the best case scenario for the supported attrs attribute.

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[bfields@redhat.com: removed likely/unlikely's]
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4xdr.c

index 1a468bb..f35a94a 100644 (file)
@@ -1805,19 +1805,23 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
                                goto out_nfserr;
                }
        }
-       if ((buflen -= 16) < 0)
-               goto out_resource;
 
-       if (unlikely(bmval2)) {
+       if (bmval2) {
+               if ((buflen -= 16) < 0)
+                       goto out_resource;
                WRITE32(3);
                WRITE32(bmval0);
                WRITE32(bmval1);
                WRITE32(bmval2);
-       } else if (likely(bmval1)) {
+       } else if (bmval1) {
+               if ((buflen -= 12) < 0)
+                       goto out_resource;
                WRITE32(2);
                WRITE32(bmval0);
                WRITE32(bmval1);
        } else {
+               if ((buflen -= 8) < 0)
+                       goto out_resource;
                WRITE32(1);
                WRITE32(bmval0);
        }
@@ -1828,15 +1832,17 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
                u32 word1 = nfsd_suppattrs1(minorversion);
                u32 word2 = nfsd_suppattrs2(minorversion);
 
-               if ((buflen -= 12) < 0)
-                       goto out_resource;
                if (!aclsupport)
                        word0 &= ~FATTR4_WORD0_ACL;
                if (!word2) {
+                       if ((buflen -= 12) < 0)
+                               goto out_resource;
                        WRITE32(2);
                        WRITE32(word0);
                        WRITE32(word1);
                } else {
+                       if ((buflen -= 16) < 0)
+                               goto out_resource;
                        WRITE32(3);
                        WRITE32(word0);
                        WRITE32(word1);