-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
* Author: Pravin Shelar <pravin.shelar@sun.com>
*/
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
#define DEBUG_SUBSYSTEM S_FLD
#ifdef __KERNEL__
cfs_proc_dir_entry_t *fld_type_proc_dir = NULL;
-static struct lu_local_obj_desc llod_fld_index = {
- .llod_name = fld_index_name,
- .llod_oid = FLD_INDEX_OID,
- .llod_is_index = 1,
- .llod_feat = &fld_index_features,
-};
-
static int __init fld_mod_init(void)
{
fld_type_proc_dir = lprocfs_register(LUSTRE_FLD_NAME,
if (IS_ERR(fld_type_proc_dir))
return PTR_ERR(fld_type_proc_dir);
- llo_local_obj_register(&llod_fld_index);
-
LU_CONTEXT_KEY_INIT(&fld_thread_key);
lu_context_key_register(&fld_thread_key);
return 0;
static void __exit fld_mod_exit(void)
{
- llo_local_obj_unregister(&llod_fld_index);
lu_context_key_degister(&fld_thread_key);
if (fld_type_proc_dir != NULL && !IS_ERR(fld_type_proc_dir)) {
lprocfs_remove(&fld_type_proc_dir);
}
}
+int fld_declare_server_create(struct lu_server_fld *fld,
+ const struct lu_env *env,
+ struct thandle *th)
+{
+ struct dt_object *dt_obj = fld->lsf_obj;
+ int rc;
+
+ ENTRY;
+
+ if (fld->lsf_no_range_lookup) {
+ /* Stub for underlying FS which can't lookup ranges */
+ return 0;
+ }
+
+ /* for ldiskfs OSD it's enough to declare operation with any ops
+ * with DMU we'll probably need to specify exact key/value */
+ rc = dt_obj->do_index_ops->dio_declare_delete(env, dt_obj, NULL, th);
+ if (rc)
+ GOTO(out, rc);
+ rc = dt_obj->do_index_ops->dio_declare_delete(env, dt_obj, NULL, th);
+ if (rc)
+ GOTO(out, rc);
+ rc = dt_obj->do_index_ops->dio_declare_insert(env, dt_obj,
+ NULL, NULL, th);
+out:
+ RETURN(rc);
+}
+EXPORT_SYMBOL(fld_declare_server_create);
+
/**
* Insert FLD index entry and update FLD cache.
*
*/
LASSERTF(erange->lsr_start > new->lsr_start ||
erange->lsr_end < new->lsr_start ||
- (erange->lsr_end == new->lsr_end &&
+ (erange->lsr_end == new->lsr_start &&
range_compare_loc(new, erange) != 0),
"left "DRANGE", new "DRANGE"\n",
PRANGE(erange), PRANGE(new));
RETURN(rc);
}
-
EXPORT_SYMBOL(fld_server_create);
/**
static int fld_req_handle(struct ptlrpc_request *req,
struct fld_thread_info *info)
{
- struct lu_site *site;
+ struct obd_export *exp = req->rq_export;
+ struct lu_site *site = exp->exp_obd->obd_lu_dev->ld_site;
struct lu_seq_range *in;
struct lu_seq_range *out;
int rc;
__u32 *opc;
ENTRY;
- site = req->rq_export->exp_obd->obd_lu_dev->ld_site;
-
rc = req_capsule_server_pack(info->fti_pill);
if (rc)
RETURN(err_serious(rc));
RETURN(err_serious(-EPROTO));
*out = *in;
+ /* For old 2.0 client, the 'lsr_flags' is uninitialized.
+ * Set it as 'LU_SEQ_RANGE_MDT' by default.
+ * Old 2.0 liblustre client cannot talk with new 2.1 server. */
+ if (!(exp->exp_connect_flags & OBD_CONNECT_64BITHASH) &&
+ !exp->exp_libclient)
+ out->lsr_flags = LU_SEQ_RANGE_MDT;
+
rc = fld_server_handle(lu_site2md(site)->ms_server_fld,
req->rq_svc_thread->t_env,
*opc, out, info);
RETURN(rc);
}
- RETURN(rc);
+ rc = lprocfs_seq_create(fld->lsf_proc_dir, "fldb", 0444,
+ &fld_proc_seq_fops, fld);
+ if (rc) {
+ lprocfs_remove(&fld->lsf_proc_dir);
+ fld->lsf_proc_dir = NULL;
+ }
+
+ RETURN(rc);
}
static void fld_server_proc_fini(struct lu_server_fld *fld)