X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fofd%2Fofd_dev.c;h=bb7ec05a838b4b1e7d7c5f45bc2e3db2c8e7d606;hb=b4d4a448b2ed93a8bc73db81bbf9c8ba08250e3a;hp=80c60875d4fe213fb1ff919499a4ad7a5b875ae4;hpb=1738e70fe6aaf1e07b78a6b89eb11ea115135e69;p=fs%2Flustre-release.git diff --git a/lustre/ofd/ofd_dev.c b/lustre/ofd/ofd_dev.c index 80c6087..bb7ec05 100644 --- a/lustre/ofd/ofd_dev.c +++ b/lustre/ofd/ofd_dev.c @@ -23,7 +23,7 @@ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2014 Intel Corporation. + * Copyright (c) 2012, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -167,6 +167,7 @@ static int ofd_stack_init(const struct lu_env *env, struct lu_device *d; struct ofd_thread_info *info = ofd_info(env); struct lustre_mount_info *lmi; + struct lustre_mount_data *lmd; int rc; char *osdname; @@ -178,6 +179,10 @@ static int ofd_stack_init(const struct lu_env *env, RETURN(-ENODEV); } + lmd = s2lsi(lmi->lmi_sb)->lsi_lmd; + if (lmd != NULL && lmd->lmd_flags & LMD_FLG_SKIP_LFSCK) + m->ofd_skip_lfsck = 1; + /* find bottom osd */ OBD_ALLOC(osdname, MTI_NAME_MAXLEN); if (osdname == NULL) @@ -969,7 +974,7 @@ static int ofd_set_info_hdl(struct tgt_session_info *tsi) * \retval negative value on error */ int ofd_fiemap_get(const struct lu_env *env, struct ofd_device *ofd, - struct lu_fid *fid, struct ll_user_fiemap *fiemap) + struct lu_fid *fid, struct fiemap *fiemap) { struct ofd_object *fo; int rc; @@ -1057,13 +1062,13 @@ static int lock_region(struct ldlm_namespace *ns, struct ldlm_res_id *res_id, */ static int lock_zero_regions(struct ldlm_namespace *ns, struct ldlm_res_id *res_id, - struct ll_user_fiemap *fiemap, + struct fiemap *fiemap, struct list_head *locked) { __u64 begin = fiemap->fm_start; unsigned int i; int rc = 0; - struct ll_fiemap_extent *fiemap_start = fiemap->fm_extents; + struct fiemap_extent *fiemap_start = fiemap->fm_extents; ENTRY; @@ -1171,21 +1176,22 @@ static int ofd_get_info_hdl(struct tgt_session_info *tsi) ofd_seq_put(tsi->tsi_env, oseq); } else if (KEY_IS(KEY_FIEMAP)) { struct ll_fiemap_info_key *fm_key; - struct ll_user_fiemap *fiemap; + struct fiemap *fiemap; struct lu_fid *fid; req_capsule_extend(tsi->tsi_pill, &RQF_OST_GET_INFO_FIEMAP); fm_key = req_capsule_client_get(tsi->tsi_pill, &RMF_FIEMAP_KEY); - rc = tgt_validate_obdo(tsi, &fm_key->oa); + rc = tgt_validate_obdo(tsi, &fm_key->lfik_oa); if (rc) RETURN(err_serious(rc)); - fid = &fm_key->oa.o_oi.oi_fid; + fid = &fm_key->lfik_oa.o_oi.oi_fid; CDEBUG(D_INODE, "get FIEMAP of object "DFID"\n", PFID(fid)); - replylen = fiemap_count_to_size(fm_key->fiemap.fm_extent_count); + replylen = fiemap_count_to_size( + fm_key->lfik_fiemap.fm_extent_count); req_capsule_set_size(tsi->tsi_pill, &RMF_FIEMAP_VAL, RCL_SERVER, replylen); @@ -1197,13 +1203,13 @@ static int ofd_get_info_hdl(struct tgt_session_info *tsi) if (fiemap == NULL) RETURN(-ENOMEM); - *fiemap = fm_key->fiemap; + *fiemap = fm_key->lfik_fiemap; rc = ofd_fiemap_get(tsi->tsi_env, ofd, fid, fiemap); /* LU-3219: Lock the sparse areas to make sure dirty * flushed back from client, then call fiemap again. */ - if (fm_key->oa.o_valid & OBD_MD_FLFLAGS && - fm_key->oa.o_flags & OBD_FL_SRVLOCK) { + if (fm_key->lfik_oa.o_valid & OBD_MD_FLFLAGS && + fm_key->lfik_oa.o_flags & OBD_FL_SRVLOCK) { struct list_head locked; INIT_LIST_HEAD(&locked); @@ -1283,7 +1289,7 @@ static int ofd_getattr_hdl(struct tgt_session_info *tsi) struct lustre_handle lh = { 0 }; struct ofd_object *fo; __u64 flags = 0; - ldlm_mode_t lock_mode = LCK_PR; + enum ldlm_mode lock_mode = LCK_PR; bool srvlock; int rc; ENTRY; @@ -1560,6 +1566,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi) struct ofd_seq *oseq; int rc = 0, diff; int sync_trans = 0; + long granted = 0; ENTRY; @@ -1697,10 +1704,12 @@ static int ofd_create_hdl(struct tgt_session_info *tsi) if (!(oa->o_valid & OBD_MD_FLFLAGS) || !(oa->o_flags & OBD_FL_DELORPHAN)) { /* don't enforce grant during orphan recovery */ - rc = ofd_grant_create(tsi->tsi_env, - ofd_obd(ofd)->obd_self_export, - &diff); - if (rc) { + granted = ofd_grant_create(tsi->tsi_env, + ofd_obd(ofd)->obd_self_export, + &diff); + if (granted < 0) { + rc = granted; + granted = 0; CDEBUG(D_HA, "%s: failed to acquire grant " "space for precreate (%d): rc = %d\n", ofd_name(ofd), diff, rc); @@ -1715,12 +1724,17 @@ static int ofd_create_hdl(struct tgt_session_info *tsi) * LFSCK will eventually clean up any orphans. LU-14 */ if (diff > 5 * OST_MAX_PRECREATE) { diff = OST_MAX_PRECREATE / 2; - LCONSOLE_WARN("%s: precreate FID "DOSTID" is over %u " - "larger than the LAST_ID "DOSTID", only " - "precreating the last %u objects.\n", - ofd_name(ofd), POSTID(&oa->o_oi), - 5 * OST_MAX_PRECREATE, - POSTID(&oseq->os_oi), diff); + LCONSOLE_WARN("%s: Too many FIDs to precreate " + "OST replaced or reformatted: " + "LFSCK will clean up", + ofd_name(ofd)); + + CDEBUG(D_HA, "%s: precreate FID "DOSTID" is over " + "%u larger than the LAST_ID "DOSTID", only " + "precreating the last %u objects.\n", + ofd_name(ofd), POSTID(&oa->o_oi), + 5 * OST_MAX_PRECREATE, + POSTID(&oseq->os_oi), diff); ofd_seq_last_oid_set(oseq, ostid_id(&oa->o_oi) - diff); } @@ -1767,9 +1781,11 @@ static int ofd_create_hdl(struct tgt_session_info *tsi) ofd_name(ofd), rc); if (!(oa->o_valid & OBD_MD_FLFLAGS) || - !(oa->o_flags & OBD_FL_DELORPHAN)) - ofd_grant_commit(tsi->tsi_env, - ofd_obd(ofd)->obd_self_export, rc); + !(oa->o_flags & OBD_FL_DELORPHAN)) { + ofd_grant_commit(ofd_obd(ofd)->obd_self_export, granted, + rc); + granted = 0; + } ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq)); } @@ -2268,6 +2284,7 @@ static int ofd_prolong_extent_locks(struct tgt_session_info *tsi, LDLM_LOCK_PUT(lock); RETURN(lock_count); } + lock->l_last_used = cfs_time_current(); LDLM_LOCK_PUT(lock); } } @@ -2277,6 +2294,10 @@ static int ofd_prolong_extent_locks(struct tgt_session_info *tsi, LASSERT(lock->l_flags & LDLM_FL_AST_SENT); LASSERT(lock->l_resource->lr_type == LDLM_EXTENT); + /* ignore waiting locks, no more granted locks in the list */ + if (lock->l_granted_mode != lock->l_req_mode) + break; + if (!ldlm_res_eq(&tsi->tsi_resid, &lock->l_resource->lr_name)) continue; @@ -2313,11 +2334,11 @@ static int ofd_prolong_extent_locks(struct tgt_session_info *tsi, static int ofd_rw_hpreq_lock_match(struct ptlrpc_request *req, struct ldlm_lock *lock) { - struct niobuf_remote *rnb; - struct obd_ioobj *ioo; - ldlm_mode_t mode; - struct ldlm_extent ext; - __u32 opc = lustre_msg_get_opc(req->rq_reqmsg); + struct niobuf_remote *rnb; + struct obd_ioobj *ioo; + enum ldlm_mode mode; + struct ldlm_extent ext; + __u32 opc = lustre_msg_get_opc(req->rq_reqmsg); ENTRY; @@ -2640,6 +2661,11 @@ static struct tgt_opc_slice ofd_common_slice[] = { .tos_hs = tgt_lfsck_handlers }, { + .tos_opc_start = SEC_FIRST_OPC, + .tos_opc_end = SEC_LAST_OPC, + .tos_hs = tgt_sec_ctx_handlers + }, + { .tos_hs = NULL } }; @@ -2776,7 +2802,7 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m, info = ofd_info_init(env, NULL); if (info == NULL) - RETURN(-EFAULT); + GOTO(err_fini_proc, rc = -EFAULT); rc = ofd_stack_init(env, m, cfg); if (rc) { @@ -2845,6 +2871,8 @@ static int ofd_init0(const struct lu_env *env, struct ofd_device *m, if (rc != 0) GOTO(err_fini_fs, rc); + tgt_adapt_sptlrpc_conf(&m->ofd_lut, 1); + RETURN(0); err_fini_fs: @@ -2880,6 +2908,10 @@ static void ofd_fini(const struct lu_env *env, struct ofd_device *m) stop.ls_flags = 0; lfsck_stop(env, m->ofd_osd, &stop); target_recovery_fini(obd); + if (m->ofd_namespace != NULL) + ldlm_namespace_free_prior(m->ofd_namespace, NULL, + d->ld_obd->obd_force); + obd_exports_barrier(obd); obd_zombie_barrier(); @@ -2889,8 +2921,7 @@ static void ofd_fini(const struct lu_env *env, struct ofd_device *m) ofd_fs_cleanup(env, m); if (m->ofd_namespace != NULL) { - ldlm_namespace_free(m->ofd_namespace, NULL, - d->ld_obd->obd_force); + ldlm_namespace_free_post(m->ofd_namespace); d->ld_obd->obd_namespace = m->ofd_namespace = NULL; } @@ -3039,8 +3070,9 @@ static void __exit ofd_exit(void) class_unregister_type(LUSTRE_OST_NAME); } -MODULE_AUTHOR("Whamcloud, Inc. "); +MODULE_AUTHOR("OpenSFS, Inc. "); MODULE_DESCRIPTION("Lustre Object Filtering Device"); +MODULE_VERSION(LUSTRE_VERSION_STRING); MODULE_LICENSE("GPL"); module_init(ofd_init);