Whamcloud - gitweb
LU-12635 build: Support for gcc -Wimplicit-fallthrough
[fs/lustre-release.git] / lustre / mdc / mdc_locks.c
index 5a5496e..5b11d5d 100644 (file)
@@ -220,7 +220,7 @@ int mdc_save_lovea(struct ptlrpc_request *req,
                   void *data, u32 size)
 {
        struct req_capsule *pill = &req->rq_pill;
-       void *lmm;
+       struct lov_user_md *lmm;
        int rc = 0;
 
        if (req_capsule_get_size(pill, field, RCL_CLIENT) < size) {
@@ -237,8 +237,12 @@ int mdc_save_lovea(struct ptlrpc_request *req,
 
        req_capsule_set_size(pill, field, RCL_CLIENT, size);
        lmm = req_capsule_client_get(pill, field);
-       if (lmm)
+       if (lmm) {
                memcpy(lmm, data, size);
+               /* overwrite layout generation returned from the MDS */
+               lmm->lmm_stripe_offset =
+                 (typeof(lmm->lmm_stripe_offset))LOV_OFFSET_DEFAULT;
+       }
 
        return rc;
 }
@@ -252,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;
@@ -260,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. */
@@ -319,6 +326,16 @@ mdc_intent_open_pack(struct obd_export *exp, struct lookup_intent *it,
        req_capsule_set_size(&req->rq_pill, &RMF_FILE_SECCTX, RCL_CLIENT,
                             op_data->op_file_secctx_size);
 
+       /* get SELinux policy info if any */
+       rc = sptlrpc_get_sepol(req);
+       if (rc < 0) {
+               ptlrpc_request_free(req);
+               RETURN(ERR_PTR(rc));
+       }
+       req_capsule_set_size(&req->rq_pill, &RMF_SELINUX_POL, RCL_CLIENT,
+                            strlen(req->rq_sepol) ?
+                            strlen(req->rq_sepol) + 1 : 0);
+
        rc = ldlm_prep_enqueue_req(exp, req, &cancels, count);
        if (rc < 0) {
                ptlrpc_request_free(req);
@@ -338,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 &&
@@ -377,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));
@@ -428,6 +445,16 @@ mdc_intent_getxattr_pack(struct obd_export *exp,
        if (req == NULL)
                RETURN(ERR_PTR(-ENOMEM));
 
+       /* get SELinux policy info if any */
+       rc = sptlrpc_get_sepol(req);
+       if (rc < 0) {
+               ptlrpc_request_free(req);
+               RETURN(ERR_PTR(rc));
+       }
+       req_capsule_set_size(&req->rq_pill, &RMF_SELINUX_POL, RCL_CLIENT,
+                            strlen(req->rq_sepol) ?
+                            strlen(req->rq_sepol) + 1 : 0);
+
        rc = ldlm_prep_enqueue_req(exp, req, &cancels, count);
        if (rc) {
                ptlrpc_request_free(req);
@@ -458,6 +485,9 @@ mdc_intent_getxattr_pack(struct obd_export *exp,
        mdc_pack_body(req, &op_data->op_fid1, op_data->op_valid,
                      ea_vals_buf_size, -1, 0);
 
+       /* get SELinux policy info if any */
+       mdc_file_sepol_pack(req);
+
        req_capsule_set_size(&req->rq_pill, &RMF_EADATA, RCL_SERVER,
                             GA_DEFAULT_EA_NAME_LEN * GA_DEFAULT_EA_NUM);
 
@@ -478,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),
@@ -519,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;
@@ -558,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),
@@ -569,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));
@@ -1387,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;