Whamcloud - gitweb
LU-4847 mdc: use cl_max_mds_md to pack getattr RPC 62/9862/5
authorwang di <di.wang@intel.com>
Tue, 1 Apr 2014 10:19:31 +0000 (03:19 -0700)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 17 Apr 2014 18:10:21 +0000 (18:10 +0000)
In some cases, cl_default_mds_easize might be zero, especially for
MDC connected to non-MDT0, then mdc might pack getattr RPC with
zero eadatasize.

If client is trying to access remote striped directory with
zero eadatasize, MDT will not return layout information of the
striped direcotry, which will be mis-regarded as non-striped
directory.

So we should use cl_max_mds_easize if cl_default_mds_easize is zero.

Signed-off-by: wang di <di.wang@intel.com>
Change-Id: Ia2939a6c8a724c37303eeeda46a4e3d94360353c
Reviewed-on: http://review.whamcloud.com/9862
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdc/mdc_locks.c

index 4fe9b0f..fa40867 100644 (file)
@@ -452,16 +452,17 @@ static struct ptlrpc_request *mdc_intent_getattr_pack(struct obd_export *exp,
                                                       struct lookup_intent *it,
                                                       struct md_op_data *op_data)
 {
-        struct ptlrpc_request *req;
-        struct obd_device     *obddev = class_exp2obd(exp);
-        obd_valid              valid = OBD_MD_FLGETATTR | OBD_MD_FLEASIZE |
-                                       OBD_MD_FLMODEASIZE | OBD_MD_FLDIREA |
-                                       OBD_MD_FLMDSCAPA | OBD_MD_MEA |
-                                       (client_is_remote(exp) ?
-                                               OBD_MD_FLRMTPERM : OBD_MD_FLACL);
-        struct ldlm_intent    *lit;
-        int                    rc;
-        ENTRY;
+       struct ptlrpc_request *req;
+       struct obd_device     *obddev = class_exp2obd(exp);
+       obd_valid              valid = OBD_MD_FLGETATTR | OBD_MD_FLEASIZE |
+                                      OBD_MD_FLMODEASIZE | OBD_MD_FLDIREA |
+                                      OBD_MD_FLMDSCAPA | OBD_MD_MEA |
+                                      (client_is_remote(exp) ?
+                                              OBD_MD_FLRMTPERM : OBD_MD_FLACL);
+       struct ldlm_intent    *lit;
+       int                    rc;
+       int                     easize;
+       ENTRY;
 
         req = ptlrpc_request_alloc(class_exp2cliimp(exp),
                                    &RQF_LDLM_INTENT_GETATTR);
@@ -482,12 +483,15 @@ static struct ptlrpc_request *mdc_intent_getattr_pack(struct obd_export *exp,
         lit = req_capsule_client_get(&req->rq_pill, &RMF_LDLM_INTENT);
         lit->opc = (__u64)it->it_op;
 
+       if (obddev->u.cli.cl_default_mds_easize > 0)
+               easize = obddev->u.cli.cl_default_mds_easize;
+       else
+               easize = obddev->u.cli.cl_max_mds_easize;
+
        /* pack the intended request */
-       mdc_getattr_pack(req, valid, it->it_flags, op_data,
-                        obddev->u.cli.cl_default_mds_easize);
+       mdc_getattr_pack(req, valid, it->it_flags, op_data, easize);
 
-       req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER,
-                            obddev->u.cli.cl_default_mds_easize);
+       req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER, easize);
        if (client_is_remote(exp))
                req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
                                     sizeof(struct mdt_remote_perm));