Whamcloud - gitweb
LU-12635 build: Support for gcc -Wimplicit-fallthrough
[fs/lustre-release.git] / lustre / mdc / mdc_locks.c
index 13e63ba..5b11d5d 100644 (file)
@@ -256,6 +256,7 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it,
        struct ldlm_intent      *lit;
        const void              *lmm = op_data->op_data;
        __u32                    lmmsize = op_data->op_data_size;
+       __u32                    mdt_md_capsule_size;
        struct list_head         cancels = LIST_HEAD_INIT(cancels);
        int                      count = 0;
        enum ldlm_mode           mode;
@@ -264,6 +265,8 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it,
 
        ENTRY;
 
+       mdt_md_capsule_size = obddev->u.cli.cl_default_mds_easize;
+
        it->it_create_mode = (it->it_create_mode & ~S_IFMT) | S_IFREG;
 
        /* XXX: openlock is not cancelled for cross-refs. */
@@ -352,7 +355,7 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it,
                       lmmsize);
 
        req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER,
-                            obddev->u.cli.cl_max_mds_easize);
+                            mdt_md_capsule_size);
        req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER, acl_bufsize);
 
        if (!(it->it_op & IT_CREAT) && it->it_op & IT_OPEN &&
@@ -391,7 +394,7 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it,
                                      lustre_msg_early_size());
        /* Estimate free space for DoM files in repbuf */
        repsize_estimate = repsize - (req->rq_replen -
-                          obddev->u.cli.cl_max_mds_easize +
+                          mdt_md_capsule_size +
                           sizeof(struct lov_comp_md_v1) +
                           sizeof(struct lov_comp_md_entry_v1) +
                           lov_mds_md_size(0, LOV_MAGIC_V3));
@@ -505,15 +508,16 @@ static struct ptlrpc_request *
 mdc_intent_getattr_pack(struct obd_export *exp, struct lookup_intent *it,
                        struct md_op_data *op_data, __u32 acl_bufsize)
 {
-       struct ptlrpc_request   *req;
-       struct obd_device       *obddev = class_exp2obd(exp);
-       u64                      valid = OBD_MD_FLGETATTR | OBD_MD_FLEASIZE |
-                                        OBD_MD_FLMODEASIZE | OBD_MD_FLDIREA |
-                                        OBD_MD_MEA | OBD_MD_FLACL;
-       struct ldlm_intent      *lit;
-       int                      rc;
-       __u32                    easize;
-       bool                     have_secctx = false;
+       struct ptlrpc_request *req;
+       struct obd_device *obddev = class_exp2obd(exp);
+       u64 valid = OBD_MD_FLGETATTR | OBD_MD_FLEASIZE | OBD_MD_FLMODEASIZE |
+                   OBD_MD_FLDIREA | OBD_MD_MEA | OBD_MD_FLACL |
+                   OBD_MD_DEFAULT_MEA;
+       struct ldlm_intent *lit;
+       __u32 easize;
+       bool have_secctx = false;
+       int rc;
+
        ENTRY;
 
        req = ptlrpc_request_alloc(class_exp2cliimp(exp),
@@ -546,16 +550,15 @@ mdc_intent_getattr_pack(struct obd_export *exp, struct lookup_intent *it,
        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;
+       easize = obddev->u.cli.cl_default_mds_easize;
 
        /* pack the intended request */
        mdc_getattr_pack(req, valid, it->it_flags, op_data, easize);
 
        req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER, easize);
        req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER, acl_bufsize);
+       req_capsule_set_size(&req->rq_pill, &RMF_DEFAULT_MDT_MD, RCL_SERVER,
+                            sizeof(struct lmv_user_md));
 
        if (have_secctx) {
                char *secctx_name;
@@ -585,10 +588,11 @@ static struct ptlrpc_request *mdc_intent_layout_pack(struct obd_export *exp,
                                                     struct md_op_data *op_data)
 {
        struct obd_device     *obd = class_exp2obd(exp);
+       struct list_head cancels = LIST_HEAD_INIT(cancels);
        struct ptlrpc_request *req;
        struct ldlm_intent    *lit;
        struct layout_intent  *layout;
-       int rc;
+       int count = 0, rc;
        ENTRY;
 
        req = ptlrpc_request_alloc(class_exp2cliimp(exp),
@@ -596,8 +600,15 @@ static struct ptlrpc_request *mdc_intent_layout_pack(struct obd_export *exp,
        if (req == NULL)
                RETURN(ERR_PTR(-ENOMEM));
 
+       if (fid_is_sane(&op_data->op_fid2) && (it->it_op & IT_LAYOUT) &&
+           (it->it_flags & FMODE_WRITE)) {
+               count = mdc_resource_get_unused(exp, &op_data->op_fid2,
+                                               &cancels, LCK_EX,
+                                               MDS_INODELOCK_LAYOUT);
+       }
+
        req_capsule_set_size(&req->rq_pill, &RMF_EADATA, RCL_CLIENT, 0);
-       rc = ldlm_prep_enqueue_req(exp, req, NULL, 0);
+       rc = ldlm_prep_enqueue_req(exp, req, &cancels, count);
        if (rc) {
                ptlrpc_request_free(req);
                RETURN(ERR_PTR(rc));
@@ -1414,8 +1425,7 @@ int mdc_intent_getattr_async(struct obd_export *exp,
                RETURN(rc);
        }
 
-       CLASSERT(sizeof(*ga) <= sizeof(req->rq_async_args));
-       ga = ptlrpc_req_async_args(req);
+       ga = ptlrpc_req_async_args(ga, req);
        ga->ga_exp = exp;
        ga->ga_minfo = minfo;