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);