Whamcloud - gitweb
LU-14430 mdt: fix maximum ACL handling
[fs/lustre-release.git] / lustre / mdt / mdt_handler.c
index 6f404db..fa160bc 100644 (file)
@@ -657,6 +657,7 @@ int mdt_pack_acl2body(struct mdt_thread_info *info, struct mdt_body *repbody,
        if (buf->lb_len == 0)
                RETURN(0);
 
+       LASSERT(!info->mti_big_acl_used);
 again:
        rc = mo_xattr_get(env, next, buf, XATTR_NAME_ACL_ACCESS);
        if (rc < 0) {
@@ -666,10 +667,9 @@ again:
                        rc = 0;
                } else if (rc == -EOPNOTSUPP) {
                        rc = 0;
-               } else {
-                       if (rc == -ERANGE &&
-                           exp_connect_large_acl(info->mti_exp) &&
-                           buf->lb_buf != info->mti_big_acl) {
+               } else if (rc == -ERANGE) {
+                       if (exp_connect_large_acl(info->mti_exp) &&
+                           !info->mti_big_acl_used) {
                                if (info->mti_big_acl == NULL) {
                                        info->mti_big_aclsize =
                                                        min_t(unsigned int,
@@ -695,47 +695,19 @@ again:
 
                                buf->lb_buf = info->mti_big_acl;
                                buf->lb_len = info->mti_big_aclsize;
-
+                               info->mti_big_acl_used = 1;
                                goto again;
                        }
-
+                       /* FS has ACL bigger that our limits */
+                       CDEBUG(D_INODE, "%s: "DFID" ACL can't fit into %d\n",
+                              mdt_obd_name(mdt), PFID(mdt_object_fid(o)),
+                              info->mti_big_aclsize);
+                       rc = -E2BIG;
+               } else {
                        CERROR("%s: unable to read "DFID" ACL: rc = %d\n",
                               mdt_obd_name(mdt), PFID(mdt_object_fid(o)), rc);
                }
        } else {
-               int client;
-               int server;
-               int acl_buflen;
-               int lmm_buflen = 0;
-               int lmmsize = 0;
-
-               acl_buflen = req_capsule_get_size(pill, &RMF_ACL, RCL_SERVER);
-               if (acl_buflen >= rc)
-                       goto map;
-
-               /* If LOV/LMA EA is small, we can reuse part of their buffer */
-               client = ptlrpc_req_get_repsize(pill->rc_req);
-               server = lustre_packed_msg_size(pill->rc_req->rq_repmsg);
-               if (req_capsule_has_field(pill, &RMF_MDT_MD, RCL_SERVER)) {
-                       lmm_buflen = req_capsule_get_size(pill, &RMF_MDT_MD,
-                                                         RCL_SERVER);
-                       lmmsize = repbody->mbo_eadatasize;
-               }
-
-               if (client < server - acl_buflen - lmm_buflen + rc + lmmsize) {
-                       CDEBUG(D_INODE, "%s: client prepared buffer size %d "
-                              "is not big enough with the ACL size %d (%d)\n",
-                              mdt_obd_name(mdt), client, rc,
-                              server - acl_buflen - lmm_buflen + rc + lmmsize);
-                       repbody->mbo_aclsize = 0;
-                       repbody->mbo_valid &= ~OBD_MD_FLACL;
-                       RETURN(-ERANGE);
-               }
-
-map:
-               if (buf->lb_buf == info->mti_big_acl)
-                       info->mti_big_acl_used = 1;
-
                rc = nodemap_map_acl(nodemap, buf->lb_buf,
                                     rc, NODEMAP_FS_TO_CLIENT);
                /* if all ACLs mapped out, rc is still >= 0 */