#include <obd_class.h>
#include <obd_cksum.h>
#include <md_object.h>
+#include <lustre_lfsck.h>
#include "tgt_internal.h"
tsi->tsi_mdt_body = body;
- if (!(body->valid & OBD_MD_FLID))
+ if (!(body->mbo_valid & OBD_MD_FLID))
RETURN(0);
/* mdc_pack_body() doesn't check if fid is zero and set OBD_ML_FID
* in any case in pre-2.5 clients. Fix that here if needed */
- if (unlikely(fid_is_zero(&body->fid1)))
+ if (unlikely(fid_is_zero(&body->mbo_fid1)))
RETURN(0);
- if (!fid_is_sane(&body->fid1)) {
+ if (!fid_is_sane(&body->mbo_fid1)) {
CERROR("%s: invalid FID: "DFID"\n", tgt_name(tsi->tsi_tgt),
- PFID(&body->fid1));
+ PFID(&body->mbo_fid1));
RETURN(-EINVAL);
}
obj = lu_object_find(tsi->tsi_env,
&tsi->tsi_tgt->lut_bottom->dd_lu_dev,
- &body->fid1, NULL);
+ &body->mbo_fid1, NULL);
if (!IS_ERR(obj)) {
if ((flags & HABEO_CORPUS) && !lu_object_exists(obj)) {
lu_object_put(tsi->tsi_env, obj);
/* for capability renew ENOENT will be handled in
* mdt_renew_capa */
- if (body->valid & OBD_MD_FLOSSCAPA)
+ if (body->mbo_valid & OBD_MD_FLOSSCAPA)
rc = 0;
else
rc = -ENOENT;
rc = PTR_ERR(obj);
}
- tsi->tsi_fid = body->fid1;
+ tsi->tsi_fid = body->mbo_fid1;
RETURN(rc);
}
oi->oi_fid.f_oid = id ?: 1;
oi->oi_fid.f_ver = 0;
} else {
- struct lu_fid *fid = &tsi->tsi_fid2;
+ struct tgt_thread_info *tti = tgt_th_info(tsi->tsi_env);
if (unlikely((oa->o_valid & OBD_MD_FLID) && id == 0))
GOTO(out, rc = -EPROTO);
fid_seq_is_norm(seq) || fid_seq_is_echo(seq))))
GOTO(out, rc = -EPROTO);
- rc = ostid_to_fid(fid, oi, tsi->tsi_tgt->lut_lsd.lsd_osd_index);
+ rc = ostid_to_fid(&tti->tti_fid1, oi,
+ tsi->tsi_tgt->lut_lsd.lsd_osd_index);
if (unlikely(rc != 0))
GOTO(out, rc);
- oi->oi_fid = *fid;
+ oi->oi_fid = tti->tti_fid1;
}
RETURN(0);
RCL_SERVER))
req_capsule_set_size(tsi->tsi_pill, &RMF_MDT_MD,
RCL_SERVER,
- tsi->tsi_mdt_body->eadatasize);
+ tsi->tsi_mdt_body->mbo_eadatasize);
if (req_capsule_has_field(tsi->tsi_pill, &RMF_LOGCOOKIES,
RCL_SERVER))
req_capsule_set_size(tsi->tsi_pill, &RMF_LOGCOOKIES,
case MDS_SYNC: /* used in unmounting */
case OBD_PING:
case MDS_REINT:
- case UPDATE_OBJ:
+ case OUT_UPDATE:
case SEQ_QUERY:
case FLD_QUERY:
case LDLM_ENQUEUE:
RETURN(-EACCES);
}
} else {
- if (req->rq_auth_uid == INVALID_UID) {
+ if (!uid_valid(make_kuid(&init_user_ns, req->rq_auth_uid))) {
CDEBUG(D_SEC, "client %s -> target %s: user is not "
"authenticated!\n", client, tgt_name(tgt));
RETURN(-EACCES);
EXPORT_SYMBOL(tgt_obd_handlers);
int tgt_sync(const struct lu_env *env, struct lu_target *tgt,
- struct dt_object *obj)
+ struct dt_object *obj, __u64 start, __u64 end)
{
int rc = 0;
rc = dt_sync(env, tgt->lut_bottom);
} else if (dt_version_get(env, obj) >
tgt->lut_obd->obd_last_committed) {
- rc = dt_object_sync(env, obj);
+ rc = dt_object_sync(env, obj, start, end);
}
RETURN(rc);
(tgt->lut_sync_lock_cancel == ALWAYS_SYNC_ON_CANCEL ||
(tgt->lut_sync_lock_cancel == BLOCKING_SYNC_ON_CANCEL &&
lock->l_flags & LDLM_FL_CBPENDING))) {
+ __u64 start = 0;
+ __u64 end = OBD_OBJECT_EOF;
+
rc = lu_env_init(&env, LCT_DT_THREAD);
if (unlikely(rc != 0))
RETURN(rc);
if (!dt_object_exists(obj))
GOTO(err_put, rc = -ENOENT);
- rc = tgt_sync(&env, tgt, obj);
+ if (lock->l_resource->lr_type == LDLM_EXTENT) {
+ start = lock->l_policy_data.l_extent.start;
+ end = lock->l_policy_data.l_extent.end;
+ }
+
+ rc = tgt_sync(&env, tgt, obj, start, end);
if (rc < 0) {
- CERROR("%s: sync failed on lock cancel: rc = %d\n",
- tgt_name(tgt), rc);
+ CERROR("%s: syncing "DFID" ("LPU64"-"LPU64") on lock "
+ "cancel: rc = %d\n",
+ tgt_name(tgt), PFID(&fid),
+ lock->l_policy_data.l_extent.start,
+ lock->l_policy_data.l_extent.end, rc);
}
err_put:
lu_object_put(&env, &obj->do_lu);
};
EXPORT_SYMBOL(tgt_sec_ctx_handlers);
+int (*tgt_lfsck_in_notify)(const struct lu_env *env,
+ struct dt_device *key,
+ struct lfsck_request *lr) = NULL;
+
+void tgt_register_lfsck_in_notify(int (*notify)(const struct lu_env *,
+ struct dt_device *,
+ struct lfsck_request *))
+{
+ tgt_lfsck_in_notify = notify;
+}
+EXPORT_SYMBOL(tgt_register_lfsck_in_notify);
+
+static int (*tgt_lfsck_query)(const struct lu_env *env,
+ struct dt_device *key,
+ struct lfsck_request *lr) = NULL;
+
+void tgt_register_lfsck_query(int (*query)(const struct lu_env *,
+ struct dt_device *,
+ struct lfsck_request *))
+{
+ tgt_lfsck_query = query;
+}
+EXPORT_SYMBOL(tgt_register_lfsck_query);
+
+/* LFSCK request handlers */
+static int tgt_handle_lfsck_notify(struct tgt_session_info *tsi)
+{
+ const struct lu_env *env = tsi->tsi_env;
+ struct dt_device *key = tsi->tsi_tgt->lut_bottom;
+ struct lfsck_request *lr;
+ int rc;
+ ENTRY;
+
+ lr = req_capsule_client_get(tsi->tsi_pill, &RMF_LFSCK_REQUEST);
+ if (lr == NULL)
+ RETURN(-EPROTO);
+
+ rc = tgt_lfsck_in_notify(env, key, lr);
+
+ RETURN(rc);
+}
+
+static int tgt_handle_lfsck_query(struct tgt_session_info *tsi)
+{
+ struct lfsck_request *request;
+ struct lfsck_reply *reply;
+ int rc = 0;
+ ENTRY;
+
+ request = req_capsule_client_get(tsi->tsi_pill, &RMF_LFSCK_REQUEST);
+ if (request == NULL)
+ RETURN(-EPROTO);
+
+ reply = req_capsule_server_get(tsi->tsi_pill, &RMF_LFSCK_REPLY);
+ if (reply == NULL)
+ RETURN(-ENOMEM);
+
+ reply->lr_status = tgt_lfsck_query(tsi->tsi_env,
+ tsi->tsi_tgt->lut_bottom, request);
+ if (reply->lr_status < 0)
+ rc = reply->lr_status;
+
+ RETURN(rc);
+}
+
+struct tgt_handler tgt_lfsck_handlers[] = {
+TGT_LFSCK_HDL(HABEO_REFERO, LFSCK_NOTIFY, tgt_handle_lfsck_notify),
+TGT_LFSCK_HDL(HABEO_REFERO, LFSCK_QUERY, tgt_handle_lfsck_query),
+};
+EXPORT_SYMBOL(tgt_lfsck_handlers);
+
/*
* initialize per-thread page pool (bug 5137).
*/
}
}
- bufsize = 4;
+ bufsize = sizeof(cksum);
err = cfs_crypto_hash_final(hdesc, (unsigned char *)&cksum, &bufsize);
- if (err)
- cfs_crypto_hash_final(hdesc, NULL, NULL);
return cksum;
}
nob = 0;
for (i = 0; i < npages; i++) {
- int page_rc = local_nb[i].rc;
+ int page_rc = local_nb[i].lnb_rc;
if (page_rc < 0) {
rc = page_rc;
nob += page_rc;
if (page_rc != 0) { /* some data! */
- LASSERT(local_nb[i].page != NULL);
- ptlrpc_prep_bulk_page_nopin(desc, local_nb[i].page,
+ LASSERT(local_nb[i].lnb_page != NULL);
+ ptlrpc_prep_bulk_page_nopin(desc, local_nb[i].lnb_page,
local_nb[i].lnb_page_offset,
page_rc);
}
- if (page_rc != local_nb[i].len) { /* short read */
+ if (page_rc != local_nb[i].lnb_len) { /* short read */
/* All subsequent pages should be 0 */
while (++i < npages)
- LASSERT(local_nb[i].rc == 0);
+ LASSERT(local_nb[i].lnb_rc == 0);
break;
}
}
POSTID(&body->oa.o_oi),
local_nb[0].lnb_file_offset,
local_nb[npages-1].lnb_file_offset +
- local_nb[npages-1].len - 1,
+ local_nb[npages - 1].lnb_len - 1,
client_cksum, server_cksum);
}
/* NB Having prepped, we must commit... */
for (i = 0; i < npages; i++)
- ptlrpc_prep_bulk_page_nopin(desc, local_nb[i].page,
+ ptlrpc_prep_bulk_page_nopin(desc, local_nb[i].lnb_page,
local_nb[i].lnb_page_offset,
- local_nb[i].len);
+ local_nb[i].lnb_len);
rc = sptlrpc_svc_prep_bulk(req, desc);
if (rc != 0)
rcs[i] = 0;
do {
LASSERT(j < npages);
- if (local_nb[j].rc < 0)
- rcs[i] = local_nb[j].rc;
- len -= local_nb[j].len;
+ if (local_nb[j].lnb_rc < 0)
+ rcs[i] = local_nb[j].lnb_rc;
+ len -= local_nb[j].lnb_len;
j++;
} while (len > 0);
LASSERT(len == 0);