X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fost%2Fost_handler.c;h=e039671ec47f539fbb132bf1021035a2ae275382;hb=8ea6a840e00e40220ab769ec329e10f0ad190c09;hp=e139194169691cea3f238b741f2d1c889b264b99;hpb=6d0e8e167f32d7fd023c8555ddc9e0901631121d;p=fs%2Flustre-release.git diff --git a/lustre/ost/ost_handler.c b/lustre/ost/ost_handler.c index e139194..e039671 100644 --- a/lustre/ost/ost_handler.c +++ b/lustre/ost/ost_handler.c @@ -72,7 +72,7 @@ CFS_MODULE_PARM(oss_num_create_threads, "i", int, 0444, /** * Do not return server-side uid/gid to remote client */ -static void ost_drop_id(struct obd_export *exp, struct obdo *oa) +static void ost_drop_id(struct obd_export *exp, struct obdo *oa) { if (exp_connect_rmtclient(exp)) { oa->o_uid = -1; @@ -249,8 +249,9 @@ static void ost_lock_put(struct obd_export *exp, static int ost_getattr(struct obd_export *exp, struct ptlrpc_request *req) { struct ost_body *body, *repbody; - struct obd_info oinfo = { { { 0 } } }; + struct obd_info *oinfo; struct lustre_handle lh = { 0 }; + struct lustre_capa *capa = NULL; int rc; ENTRY; @@ -266,24 +267,31 @@ static int ost_getattr(struct obd_export *exp, struct ptlrpc_request *req) if (rc) RETURN(rc); - repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); - repbody->oa = body->oa; - rc = ost_lock_get(exp, &body->oa, 0, OBD_OBJECT_EOF, &lh, LCK_PR, 0); if (rc) RETURN(rc); - oinfo.oi_oa = &repbody->oa; - if (oinfo.oi_oa->o_valid & OBD_MD_FLOSSCAPA) { - oinfo.oi_capa = req_capsule_client_get(&req->rq_pill, - &RMF_CAPA1); - if (oinfo.oi_capa == NULL) { + if (body->oa.o_valid & OBD_MD_FLOSSCAPA) { + capa = req_capsule_client_get(&req->rq_pill, &RMF_CAPA1); + if (capa == NULL) { CERROR("Missing capability for OST GETATTR"); RETURN (-EFAULT); } } - req->rq_status = obd_getattr(exp, &oinfo); + OBD_ALLOC_PTR(oinfo); + if (!oinfo) + RETURN(-ENOMEM); + oinfo->oi_oa = &body->oa; + oinfo->oi_capa = capa; + + req->rq_status = obd_getattr(exp, oinfo); + + OBD_FREE_PTR(oinfo); + + repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); + repbody->oa = body->oa; + ost_lock_put(exp, &lh, LCK_PR); ost_drop_id(exp, &repbody->oa); @@ -331,8 +339,8 @@ static int ost_create(struct obd_export *exp, struct ptlrpc_request *req, RETURN(rc); repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); - memcpy(&repbody->oa, &body->oa, sizeof(body->oa)); - oti->oti_logcookies = &repbody->oa.o_lcookie; + repbody->oa = body->oa; + oti->oti_logcookies = &body->oa.o_lcookie; req->rq_status = obd_create(exp, &repbody->oa, NULL, oti); //obd_log_cancel(conn, NULL, 1, oti->oti_logcookies, 0); @@ -342,7 +350,6 @@ static int ost_create(struct obd_export *exp, struct ptlrpc_request *req, static int ost_punch(struct obd_export *exp, struct ptlrpc_request *req, struct obd_trans_info *oti) { - struct obd_info oinfo = { { { 0 } } }; struct ost_body *body, *repbody; int rc, flags = 0; struct lustre_handle lh = {0,}; @@ -359,11 +366,7 @@ static int ost_punch(struct obd_export *exp, struct ptlrpc_request *req, if (rc) RETURN(rc); - oinfo.oi_oa = &body->oa; - oinfo.oi_policy.l_extent.start = oinfo.oi_oa->o_size; - oinfo.oi_policy.l_extent.end = oinfo.oi_oa->o_blocks; - - if ((oinfo.oi_oa->o_valid & (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) != + if ((body->oa.o_valid & (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) != (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS)) RETURN(-EPROTO); @@ -373,34 +376,48 @@ static int ost_punch(struct obd_export *exp, struct ptlrpc_request *req, /* standard truncate optimization: if file body is completely * destroyed, don't send data back to the server. */ - if (oinfo.oi_oa->o_size == 0) + if (body->oa.o_size == 0) flags |= LDLM_AST_DISCARD_DATA; - repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); - rc = ost_lock_get(exp, oinfo.oi_oa, oinfo.oi_oa->o_size, - oinfo.oi_oa->o_blocks, &lh, LCK_PW, flags); + rc = ost_lock_get(exp, &body->oa, body->oa.o_size, body->oa.o_blocks, + &lh, LCK_PW, flags); if (rc == 0) { - if (oinfo.oi_oa->o_valid & OBD_MD_FLFLAGS && - oinfo.oi_oa->o_flags == OBD_FL_SRVLOCK) + struct obd_info *oinfo; + struct lustre_capa *capa = NULL; + + if (body->oa.o_valid & OBD_MD_FLFLAGS && + body->oa.o_flags == OBD_FL_SRVLOCK) /* * If OBD_FL_SRVLOCK is the only bit set in * ->o_flags, clear OBD_MD_FLFLAGS to avoid falling * through filter_setattr() to filter_iocontrol(). */ - oinfo.oi_oa->o_valid &= ~OBD_MD_FLFLAGS; + body->oa.o_valid &= ~OBD_MD_FLFLAGS; - if (oinfo.oi_oa->o_valid & OBD_MD_FLOSSCAPA) { - oinfo.oi_capa = req_capsule_client_get(&req->rq_pill, - &RMF_CAPA1); - if (oinfo.oi_capa == NULL) { + if (body->oa.o_valid & OBD_MD_FLOSSCAPA) { + capa = req_capsule_client_get(&req->rq_pill, + &RMF_CAPA1); + if (capa == NULL) { CERROR("Missing capability for OST PUNCH"); RETURN (-EFAULT); } } - req->rq_status = obd_punch(exp, &oinfo, oti, NULL); + + OBD_ALLOC_PTR(oinfo); + if (!oinfo) + RETURN(-ENOMEM); + oinfo->oi_oa = &body->oa; + oinfo->oi_policy.l_extent.start = oinfo->oi_oa->o_size; + oinfo->oi_policy.l_extent.end = oinfo->oi_oa->o_blocks; + oinfo->oi_capa = capa; + + req->rq_status = obd_punch(exp, oinfo, oti, NULL); + OBD_FREE_PTR(oinfo); ost_lock_put(exp, &lh, LCK_PW); } - repbody->oa = *oinfo.oi_oa; + + repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); + repbody->oa = body->oa; ost_drop_id(exp, &repbody->oa); RETURN(rc); } @@ -408,6 +425,7 @@ static int ost_punch(struct obd_export *exp, struct ptlrpc_request *req, static int ost_sync(struct obd_export *exp, struct ptlrpc_request *req) { struct ost_body *body, *repbody; + struct obd_info *oinfo; struct lustre_capa *capa = NULL; int rc; ENTRY; @@ -432,10 +450,18 @@ static int ost_sync(struct obd_export *exp, struct ptlrpc_request *req) if (rc) RETURN(rc); + OBD_ALLOC_PTR(oinfo); + if (!oinfo) + RETURN(-ENOMEM); + + oinfo->oi_oa = &body->oa; + oinfo->oi_capa = capa; + req->rq_status = obd_sync(exp, oinfo, body->oa.o_size, + body->oa.o_blocks, NULL); + OBD_FREE_PTR(oinfo); + repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); - memcpy(&repbody->oa, &body->oa, sizeof(body->oa)); - req->rq_status = obd_sync(exp, &repbody->oa, NULL, repbody->oa.o_size, - repbody->oa.o_blocks, capa); + repbody->oa = body->oa; ost_drop_id(exp, &repbody->oa); RETURN(0); } @@ -444,8 +470,9 @@ static int ost_setattr(struct obd_export *exp, struct ptlrpc_request *req, struct obd_trans_info *oti) { struct ost_body *body, *repbody; + struct obd_info *oinfo; + struct lustre_capa *capa = NULL; int rc; - struct obd_info oinfo = { { { 0 } } }; ENTRY; body = req_capsule_client_get(&req->rq_pill, &RMF_OST_BODY); @@ -460,19 +487,26 @@ static int ost_setattr(struct obd_export *exp, struct ptlrpc_request *req, if (rc) RETURN(rc); - repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); - repbody->oa = body->oa; - - oinfo.oi_oa = &repbody->oa; - if (oinfo.oi_oa->o_valid & OBD_MD_FLOSSCAPA) { - oinfo.oi_capa = req_capsule_client_get(&req->rq_pill, - &RMF_CAPA1); - if (oinfo.oi_capa == NULL) { + if (body->oa.o_valid & OBD_MD_FLOSSCAPA) { + capa = req_capsule_client_get(&req->rq_pill, &RMF_CAPA1); + if (capa == NULL) { CERROR("Missing capability for OST SETATTR"); RETURN (-EFAULT); } } - req->rq_status = obd_setattr(exp, &oinfo, oti); + + OBD_ALLOC_PTR(oinfo); + if (!oinfo) + RETURN(-ENOMEM); + oinfo->oi_oa = &body->oa; + oinfo->oi_capa = capa; + + req->rq_status = obd_setattr(exp, oinfo, oti); + + OBD_FREE_PTR(oinfo); + + repbody = req_capsule_server_get(&req->rq_pill, &RMF_OST_BODY); + repbody->oa = body->oa; ost_drop_id(exp, &repbody->oa); RETURN(0); } @@ -1744,24 +1778,35 @@ int ost_blocking_ast(struct ldlm_lock *lock, (sync_lock_cancel == ALWAYS_SYNC_ON_CANCEL || (sync_lock_cancel == BLOCKING_SYNC_ON_CANCEL && lock->l_flags & LDLM_FL_CBPENDING))) { + struct obd_info *oinfo; struct obdo *oa; int rc; + OBD_ALLOC_PTR(oinfo); + if (!oinfo) + RETURN(-ENOMEM); OBDO_ALLOC(oa); + if (!oa) { + OBD_FREE_PTR(oa); + RETURN(-ENOMEM); + } oa->o_id = lock->l_resource->lr_name.name[0]; oa->o_seq = lock->l_resource->lr_name.name[1]; oa->o_valid = OBD_MD_FLID|OBD_MD_FLGROUP; + oinfo->oi_oa = oa; - rc = obd_sync(lock->l_export, oa, NULL, + rc = obd_sync(lock->l_export, oinfo, lock->l_policy_data.l_extent.start, lock->l_policy_data.l_extent.end, NULL); if (rc) CERROR("Error %d syncing data on lock cancel\n", rc); OBDO_FREE(oa); + OBD_FREE_PTR(oinfo); } - return ldlm_server_blocking_ast(lock, desc, data, flag); + rc = ldlm_server_blocking_ast(lock, desc, data, flag); + RETURN(rc); } static int ost_filter_recovery_request(struct ptlrpc_request *req, @@ -2545,7 +2590,7 @@ static int ost_setup(struct obd_device *obd, struct lustre_cfg* lcfg) GOTO(out_lprocfs, rc = -ENOMEM); } - rc = ptlrpc_start_threads(obd, ost->ost_service); + rc = ptlrpc_start_threads(ost->ost_service); if (rc) GOTO(out_service, rc = -EINVAL); @@ -2574,7 +2619,7 @@ static int ost_setup(struct obd_device *obd, struct lustre_cfg* lcfg) GOTO(out_service, rc = -ENOMEM); } - rc = ptlrpc_start_threads(obd, ost->ost_create_service); + rc = ptlrpc_start_threads(ost->ost_create_service); if (rc) GOTO(out_create, rc = -EINVAL); @@ -2594,7 +2639,7 @@ static int ost_setup(struct obd_device *obd, struct lustre_cfg* lcfg) ost->ost_io_service->srv_init = ost_thread_init; ost->ost_io_service->srv_done = ost_thread_done; ost->ost_io_service->srv_cpu_affinity = 1; - rc = ptlrpc_start_threads(obd, ost->ost_io_service); + rc = ptlrpc_start_threads(ost->ost_io_service); if (rc) GOTO(out_io, rc = -EINVAL);