[lustre-devel] [PATCH 203/622] lustre: mdc: Improve xattr buffer allocations

James Simmons jsimmons at infradead.org
Thu Feb 27 13:11:11 PST 2020


From: Patrick Farrell <pfarrell at whamcloud.com>

Many of the xattr related buffers in the mdc/mdt code are
allocated at max_easize, but they are used for normal POSIX
xattrs (primarily ACLs) and so they are guaranteed not to
exceed XATTR_SIZE_MAX.

HSM xattrs should also be less than XATTR_SIZE_MAX.

Reduce allocations to MIN(XATTR_SIZE_MAX, max_easize).

WC-bug-id: https://jira.whamcloud.com/browse/LU-11868
Lustre-commit: 4f78164f8748 ("LU-11868 mdc: Improve xattr buffer allocations")
Signed-off-by: Patrick Farrell <pfarrell at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/34059
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Reviewed-by: Li Dongyang <dongyangli at ddn.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
 fs/lustre/mdc/mdc_locks.c   |  9 ++++++---
 fs/lustre/mdc/mdc_reint.c   |  4 +++-
 fs/lustre/mdc/mdc_request.c | 14 ++++++++------
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/fs/lustre/mdc/mdc_locks.c b/fs/lustre/mdc/mdc_locks.c
index f9d66a4..9898b6a 100644
--- a/fs/lustre/mdc/mdc_locks.c
+++ b/fs/lustre/mdc/mdc_locks.c
@@ -810,7 +810,9 @@ int mdc_enqueue_base(struct obd_export *exp, struct ldlm_enqueue_info *einfo,
 
 	generation = obddev->u.cli.cl_import->imp_generation;
 	if (!it || (it->it_op & (IT_OPEN | IT_CREAT)))
-		acl_bufsize = imp->imp_connect_data.ocd_max_easize;
+		acl_bufsize = min_t(u32,
+				    imp->imp_connect_data.ocd_max_easize,
+				    XATTR_SIZE_MAX);
 	else
 		acl_bufsize = LUSTRE_POSIX_ACL_MAX_SIZE_OLD;
 
@@ -936,10 +938,11 @@ int mdc_enqueue_base(struct obd_export *exp, struct ldlm_enqueue_info *einfo,
 
 	if ((int)lockrep->lock_policy_res2 == -ERANGE &&
 	    it->it_op & (IT_OPEN | IT_GETATTR | IT_LOOKUP) &&
-	    acl_bufsize != imp->imp_connect_data.ocd_max_easize) {
+	    acl_bufsize == LUSTRE_POSIX_ACL_MAX_SIZE_OLD) {
 		mdc_clear_replay_flag(req, -ERANGE);
 		ptlrpc_req_finished(req);
-		acl_bufsize = imp->imp_connect_data.ocd_max_easize;
+		acl_bufsize = min_t(u32, imp->imp_connect_data.ocd_max_easize,
+				    XATTR_SIZE_MAX);
 		goto resend;
 	}
 
diff --git a/fs/lustre/mdc/mdc_reint.c b/fs/lustre/mdc/mdc_reint.c
index 062685c..2611fc4 100644
--- a/fs/lustre/mdc/mdc_reint.c
+++ b/fs/lustre/mdc/mdc_reint.c
@@ -135,7 +135,9 @@ int mdc_setattr(struct obd_export *exp, struct md_op_data *op_data,
 	mdc_setattr_pack(req, op_data, ea, ealen);
 
 	req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
-			     req->rq_import->imp_connect_data.ocd_max_easize);
+			     min_t(u32,
+				   req->rq_import->imp_connect_data.ocd_max_easize,
+				   XATTR_SIZE_MAX));
 	ptlrpc_request_set_replen(req);
 
 	rc = mdc_reint(req, LUSTRE_IMP_FULL);
diff --git a/fs/lustre/mdc/mdc_request.c b/fs/lustre/mdc/mdc_request.c
index d702fd1..4711288 100644
--- a/fs/lustre/mdc/mdc_request.c
+++ b/fs/lustre/mdc/mdc_request.c
@@ -234,9 +234,10 @@ static int mdc_getattr(struct obd_export *exp, struct md_op_data *op_data,
 
 	rc = mdc_getattr_common(exp, req);
 	if (rc) {
-		if (rc == -ERANGE &&
-		    acl_bufsize != imp->imp_connect_data.ocd_max_easize) {
-			acl_bufsize = imp->imp_connect_data.ocd_max_easize;
+		if (rc == -ERANGE) {
+			acl_bufsize = min_t(u32,
+					    imp->imp_connect_data.ocd_max_easize,
+					    XATTR_SIZE_MAX);
 			mdc_reset_acl_req(req);
 			goto again;
 		}
@@ -289,9 +290,10 @@ static int mdc_getattr_name(struct obd_export *exp, struct md_op_data *op_data,
 
 	rc = mdc_getattr_common(exp, req);
 	if (rc) {
-		if (rc == -ERANGE &&
-		    acl_bufsize != imp->imp_connect_data.ocd_max_easize) {
-			acl_bufsize = imp->imp_connect_data.ocd_max_easize;
+		if (rc == -ERANGE) {
+			acl_bufsize = min_t(u32,
+					    imp->imp_connect_data.ocd_max_easize,
+					    XATTR_SIZE_MAX);
 			mdc_reset_acl_req(req);
 			goto again;
 		}
-- 
1.8.3.1



More information about the lustre-devel mailing list