/*
* Initialized in mdt_mod_init().
*/
-unsigned long mdt_num_threads;
+static unsigned long mdt_num_threads;
+static unsigned long mdt_min_threads;
+static unsigned long mdt_max_threads;
/* ptlrpc request handler for MDT. All handlers are
* grouped into several slices - struct mdt_opc_slice,
RETURN(rc);
}
-void mdt_pack_size2body(struct mdt_thread_info *info, struct mdt_object *o)
+/**
+ * Pack SOM attributes into the reply.
+ * Call under a DLM UPDATE lock.
+ */
+static void mdt_pack_size2body(struct mdt_thread_info *info,
+ struct mdt_object *mo)
{
struct mdt_body *b;
- struct lu_attr *attr = &info->mti_attr.ma_attr;
+ struct md_attr *ma = &info->mti_attr;
+ LASSERT(ma->ma_attr.la_valid & LA_MODE);
b = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
- /* Check if Size-on-MDS is enabled. */
- if ((mdt_conn_flags(info) & OBD_CONNECT_SOM) &&
- S_ISREG(attr->la_mode) && mdt_sizeonmds_enabled(o)) {
- b->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS);
- b->size = attr->la_size;
- b->blocks = attr->la_blocks;
- }
+ /* Check if Size-on-MDS is supported, if this is a regular file,
+ * if SOM is enabled on the object and if SOM cache exists and valid.
+ * Otherwise do not pack Size-on-MDS attributes to the reply. */
+ if (!(mdt_conn_flags(info) & OBD_CONNECT_SOM) ||
+ !S_ISREG(ma->ma_attr.la_mode) ||
+ !mdt_object_is_som_enabled(mo) ||
+ !(ma->ma_valid & MA_SOM))
+ return;
+
+ b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
+ b->size = ma->ma_som->msd_size;
+ b->blocks = ma->ma_som->msd_blocks;
}
void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b,
}
static int mdt_getattr_internal(struct mdt_thread_info *info,
- struct mdt_object *o)
+ struct mdt_object *o, int ma_need)
{
struct md_object *next = mdt_object_child(o);
const struct mdt_body *reqbody = info->mti_body;
/* get default stripe info for this dir. */
ma->ma_need |= MA_LOV_DEF;
}
+ ma->ma_need |= ma_need;
+ if (ma->ma_need & MA_SOM)
+ ma->ma_som = &info->mti_u.som.data;
+
rc = mo_attr_get(env, next, ma);
if (unlikely(rc)) {
CERROR("getattr error for "DFID": %d\n",
* remote obj, and at that time no capability is available.
*/
mdt_set_capainfo(info, 1, &reqbody->fid1, BYPASS_CAPA);
- rc = mdt_getattr_internal(info, obj);
+ rc = mdt_getattr_internal(info, obj, 0);
if (reqbody->valid & OBD_MD_FLRMTPERM)
mdt_exit_ucred(info);
EXIT;
struct ldlm_lock *lock;
struct ldlm_res_id *res_id;
int is_resent;
+ int ma_need = 0;
int rc;
ENTRY;
/* Finally, we can get attr for child. */
mdt_set_capainfo(info, 0, mdt_object_fid(child),
BYPASS_CAPA);
- rc = mdt_getattr_internal(info, child);
+ rc = mdt_getattr_internal(info, child, 0);
if (unlikely(rc != 0))
mdt_object_unlock(info, child, lhc, 1);
}
GOTO(out_child, rc);
}
+ lock = ldlm_handle2lock(&lhc->mlh_reg_lh);
+ /* Get MA_SOM attributes if update lock is given. */
+ if (lock &&
+ lock->l_policy_data.l_inodebits.bits & MDS_INODELOCK_UPDATE &&
+ S_ISREG(lu_object_attr(&mdt_object_child(child)->mo_lu)))
+ ma_need = MA_SOM;
+
/* finally, we can get attr for child. */
mdt_set_capainfo(info, 1, child_fid, BYPASS_CAPA);
- rc = mdt_getattr_internal(info, child);
+ rc = mdt_getattr_internal(info, child, ma_need);
if (unlikely(rc != 0)) {
mdt_object_unlock(info, child, lhc, 1);
- } else {
- lock = ldlm_handle2lock(&lhc->mlh_reg_lh);
- if (lock) {
- struct mdt_body *repbody;
+ } else if (lock) {
+ /* Debugging code. */
+ res_id = &lock->l_resource->lr_name;
+ LDLM_DEBUG(lock, "Returning lock to client");
+ LASSERTF(fid_res_name_eq(mdt_object_fid(child),
+ &lock->l_resource->lr_name),
+ "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n",
+ (unsigned long)res_id->name[0],
+ (unsigned long)res_id->name[1],
+ (unsigned long)res_id->name[2],
+ PFID(mdt_object_fid(child)));
+ mdt_pack_size2body(info, child);
+ }
+ if (lock)
+ LDLM_LOCK_PUT(lock);
- /* Debugging code. */
- res_id = &lock->l_resource->lr_name;
- LDLM_DEBUG(lock, "Returning lock to client");
- LASSERTF(fid_res_name_eq(mdt_object_fid(child),
- &lock->l_resource->lr_name),
- "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n",
- (unsigned long)res_id->name[0],
- (unsigned long)res_id->name[1],
- (unsigned long)res_id->name[2],
- PFID(mdt_object_fid(child)));
- /*
- * Pack Size-on-MDS inode attributes to the body if
- * update lock is given.
- */
- repbody = req_capsule_server_get(info->mti_pill,
- &RMF_MDT_BODY);
- if (lock->l_policy_data.l_inodebits.bits &
- MDS_INODELOCK_UPDATE)
- mdt_pack_size2body(info, child);
- LDLM_LOCK_PUT(lock);
- }
- }
EXIT;
out_child:
mdt_object_put(info->mti_env, child);
req->rq_status = 0;
lustre_msg_set_status(req->rq_repmsg, 0);
- spin_lock(&req->rq_export->exp_lock);
+ cfs_spin_lock(&req->rq_export->exp_lock);
if (*(__u32 *)val)
req->rq_export->exp_connect_flags |= OBD_CONNECT_RDONLY;
else
req->rq_export->exp_connect_flags &=~OBD_CONNECT_RDONLY;
- spin_unlock(&req->rq_export->exp_lock);
+ cfs_spin_unlock(&req->rq_export->exp_lock);
} else if (KEY_IS(KEY_CHANGELOG_CLEAR)) {
struct changelog_setinfo *cs =
else
rc = ptlrpc_start_bulk_transfer (desc);
if (rc == 0) {
- *lwi = LWI_TIMEOUT_INTERVAL(obd_timeout * HZ / 4, HZ,
+ *lwi = LWI_TIMEOUT_INTERVAL(obd_timeout * CFS_HZ / 4, CFS_HZ,
mdt_bulk_timeout, desc);
rc = l_wait_event(desc->bd_waitq, !ptlrpc_bulk_active(desc) ||
desc->bd_export->exp_failed, lwi);
static int mdt_recovery(struct mdt_thread_info *info)
{
struct ptlrpc_request *req = mdt_info_req(info);
- int recovering;
struct obd_device *obd;
ENTRY;
obd = req->rq_export->exp_obd;
/* Check for aborted recovery... */
- spin_lock_bh(&obd->obd_processing_task_lock);
- recovering = obd->obd_recovering;
- spin_unlock_bh(&obd->obd_processing_task_lock);
- if (unlikely(recovering)) {
+ if (unlikely(obd->obd_recovering)) {
int rc;
int should_process;
DEBUG_REQ(D_INFO, req, "Got new replay");
* We'd like to have a mechanism to set this on a per-device
* basis, but alas...
*/
- .psc_min_threads = min(max(mdt_num_threads, MDT_MIN_THREADS),
- MDT_MAX_THREADS),
- .psc_max_threads = MDT_MAX_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD
};
.psc_req_portal = MDS_READPAGE_PORTAL,
.psc_rep_portal = MDC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = min(max(mdt_num_threads, MDT_MIN_THREADS),
- MDT_MAX_THREADS),
- .psc_max_threads = MDT_MAX_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD
};
m->mdt_readpage_service =
.psc_req_portal = MDS_SETATTR_PORTAL,
.psc_rep_portal = MDC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = min(max(mdt_num_threads, MDT_MIN_THREADS),
- MDT_MAX_THREADS),
- .psc_max_threads = MDT_MAX_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD
};
.psc_req_portal = SEQ_CONTROLLER_PORTAL,
.psc_rep_portal = MDC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = SEQ_NUM_THREADS,
- .psc_max_threads = SEQ_NUM_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD|LCT_DT_THREAD
};
.psc_req_portal = SEQ_METADATA_PORTAL,
.psc_rep_portal = MDC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = SEQ_NUM_THREADS,
- .psc_max_threads = SEQ_NUM_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD|LCT_DT_THREAD
};
.psc_req_portal = SEQ_DATA_PORTAL,
.psc_rep_portal = OSC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = SEQ_NUM_THREADS,
- .psc_max_threads = SEQ_NUM_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD|LCT_DT_THREAD
};
.psc_req_portal = FLD_REQUEST_PORTAL,
.psc_rep_portal = MDC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = FLD_NUM_THREADS,
- .psc_max_threads = FLD_NUM_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_DT_THREAD|LCT_MD_THREAD
};
.psc_req_portal = MDS_MDS_PORTAL,
.psc_rep_portal = MDC_REPLY_PORTAL,
.psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR,
- .psc_min_threads = min(max(mdt_num_threads, MDT_MIN_THREADS),
- MDT_MAX_THREADS),
- .psc_max_threads = MDT_MAX_THREADS,
+ .psc_min_threads = mdt_min_threads,
+ .psc_max_threads = mdt_max_threads,
.psc_ctx_tags = LCT_MD_THREAD
};
m->mdt_xmds_service =
*/
mdt_stack_fini(env, m, md2lu_dev(m->mdt_child));
- mdt_procfs_fini(m);
lprocfs_free_per_client_stats(obd);
lprocfs_free_obd_stats(obd);
+ mdt_procfs_fini(m);
if (ls) {
struct md_site *mite;
OBD_FREE_PTR(mite);
d->ld_site = NULL;
}
- LASSERT(atomic_read(&d->ld_ref) == 0);
+ LASSERT(cfs_atomic_read(&d->ld_ref) == 0);
EXIT;
}
sptlrpc_target_update_exp_flavor(obd, &tmp_rset);
- write_lock(&m->mdt_sptlrpc_lock);
+ cfs_write_lock(&m->mdt_sptlrpc_lock);
sptlrpc_rule_set_free(&m->mdt_sptlrpc_rset);
m->mdt_sptlrpc_rset = tmp_rset;
- write_unlock(&m->mdt_sptlrpc_lock);
+ cfs_write_unlock(&m->mdt_sptlrpc_lock);
return 0;
}
obd = class_name2obd(dev);
LASSERT(obd != NULL);
- spin_lock_init(&m->mdt_transno_lock);
-
m->mdt_max_mdsize = MAX_MD_SIZE;
m->mdt_max_cookiesize = sizeof(struct llog_cookie);
m->mdt_som_conf = 0;
}
}
- rwlock_init(&m->mdt_sptlrpc_lock);
+ cfs_rwlock_init(&m->mdt_sptlrpc_lock);
sptlrpc_rule_set_init(&m->mdt_sptlrpc_rset);
- spin_lock_init(&m->mdt_ioepoch_lock);
+ cfs_spin_lock_init(&m->mdt_ioepoch_lock);
m->mdt_opts.mo_compat_resname = 0;
m->mdt_capa_timeout = CAPA_TIMEOUT;
m->mdt_capa_alg = CAPA_HMAC_ALG_SHA1;
CFS_INIT_LIST_HEAD(&m->mdt_nosquash_nids);
m->mdt_nosquash_str = NULL;
m->mdt_nosquash_strlen = 0;
- init_rwsem(&m->mdt_squash_sem);
-
- spin_lock_init(&m->mdt_client_bitmap_lock);
+ cfs_init_rwsem(&m->mdt_squash_sem);
OBD_ALLOC_PTR(mite);
if (mite == NULL)
lu_object_init(o, h, d);
lu_object_add_top(h, o);
o->lo_ops = &mdt_obj_ops;
+ cfs_sema_init(&mo->mot_ioepoch_sem, 1);
RETURN(o);
} else
RETURN(NULL);
return (*p)(env, cookie, LUSTRE_MDT_NAME"-object@%p(ioepoch=%llu "
"flags=%llx, epochcount=%d, writecount=%d)",
mdto, mdto->mot_ioepoch, mdto->mot_flags,
- mdto->mot_epochcount, mdto->mot_writecount);
+ mdto->mot_ioepoch_count, mdto->mot_writecount);
}
static const struct lu_device_operations mdt_lu_ops = {
if (!mdt->mdt_som_conf)
data->ocd_connect_flags &= ~OBD_CONNECT_SOM;
- spin_lock(&exp->exp_lock);
+ cfs_spin_lock(&exp->exp_lock);
exp->exp_connect_flags = data->ocd_connect_flags;
- spin_unlock(&exp->exp_lock);
+ cfs_spin_unlock(&exp->exp_lock);
data->ocd_version = LUSTRE_VERSION_CODE;
exp->exp_mdt_data.med_ibits_known = data->ocd_ibits_known;
}
return -EBADE;
}
- if (mdt->mdt_som_conf &&
- !(exp->exp_connect_flags & OBD_CONNECT_MDS_MDS) &&
- !(exp->exp_connect_flags & OBD_CONNECT_SOM)) {
+ if (mdt->mdt_som_conf && !exp_connect_som(exp) &&
+ !(exp->exp_connect_flags & OBD_CONNECT_MDS_MDS)) {
CWARN("%s: MDS has SOM enabled, but client does not support "
"it\n", mdt->mdt_md_dev.md_lu_dev.ld_obd->obd_name);
return -EBADE;
int rc = 0;
if (exp->exp_flvr.sf_rpc == SPTLRPC_FLVR_INVALID) {
- read_lock(&mdt->mdt_sptlrpc_lock);
+ cfs_read_lock(&mdt->mdt_sptlrpc_lock);
sptlrpc_target_choose_flavor(&mdt->mdt_sptlrpc_rset,
req->rq_sp_from,
req->rq_peer.nid,
&flvr);
- read_unlock(&mdt->mdt_sptlrpc_lock);
+ cfs_read_unlock(&mdt->mdt_sptlrpc_lock);
- spin_lock(&exp->exp_lock);
+ cfs_spin_lock(&exp->exp_lock);
exp->exp_sp_peer = req->rq_sp_from;
exp->exp_flvr = flvr;
rc = -EACCES;
}
- spin_unlock(&exp->exp_lock);
+ cfs_spin_unlock(&exp->exp_lock);
} else {
if (exp->exp_sp_peer != req->rq_sp_from) {
CERROR("RPC source %s doesn't match %s\n",
memcpy(lcd->lcd_uuid, cluuid, sizeof lcd->lcd_uuid);
lexp->exp_mdt_data.med_lcd = lcd;
rc = mdt_client_new(env, mdt);
- if (rc != 0) {
- OBD_FREE_PTR(lcd);
- lexp->exp_mdt_data.med_lcd = NULL;
- } else {
+ if (rc == 0)
mdt_export_stats_init(obd, lexp, localdata);
- }
- } else
+ } else {
rc = -ENOMEM;
+ }
}
out:
int rc = 0;
ENTRY;
- spin_lock(&med->med_open_lock);
- while (!list_empty(&med->med_open_head)) {
- struct list_head *tmp = med->med_open_head.next;
- mfd = list_entry(tmp, struct mdt_file_data, mfd_list);
+ cfs_spin_lock(&med->med_open_lock);
+ while (!cfs_list_empty(&med->med_open_head)) {
+ cfs_list_t *tmp = med->med_open_head.next;
+ mfd = cfs_list_entry(tmp, struct mdt_file_data, mfd_list);
/* Remove mfd handle so it can't be found again.
* We are consuming the mfd_list reference here. */
class_handle_unhash(&mfd->mfd_handle);
- list_move_tail(&mfd->mfd_list, &closing_list);
+ cfs_list_move_tail(&mfd->mfd_list, &closing_list);
}
- spin_unlock(&med->med_open_lock);
+ cfs_spin_unlock(&med->med_open_lock);
mdt = mdt_dev(obd->obd_lu_dev);
LASSERT(mdt != NULL);
info->mti_mdt = mdt;
info->mti_exp = exp;
- if (!list_empty(&closing_list)) {
+ if (!cfs_list_empty(&closing_list)) {
struct md_attr *ma = &info->mti_attr;
int lmm_size;
int cookie_size;
GOTO(out_cookie, rc = -ENOMEM);
/* Close any open files (which may also cause orphan unlinking). */
- list_for_each_entry_safe(mfd, n, &closing_list, mfd_list) {
- list_del_init(&mfd->mfd_list);
+ cfs_list_for_each_entry_safe(mfd, n, &closing_list, mfd_list) {
+ cfs_list_del_init(&mfd->mfd_list);
memset(&ma->ma_attr, 0, sizeof(ma->ma_attr));
ma->ma_lmm_size = lmm_size;
ma->ma_cookie_size = cookie_size;
ENTRY;
CFS_INIT_LIST_HEAD(&med->med_open_head);
- spin_lock_init(&med->med_open_lock);
- sema_init(&med->med_idmap_sem, 1);
+ cfs_spin_lock_init(&med->med_open_lock);
+ cfs_sema_init(&med->med_idmap_sem, 1);
med->med_idmap = NULL;
- spin_lock(&exp->exp_lock);
+ cfs_spin_lock(&exp->exp_lock);
exp->exp_connecting = 1;
- spin_unlock(&exp->exp_lock);
+ cfs_spin_unlock(&exp->exp_lock);
rc = ldlm_init_export(exp);
if (rc)
CERROR("Error %d while initializing export\n", rc);
target_destroy_export(exp);
ldlm_destroy_export(exp);
- LASSERT(list_empty(&exp->exp_outstanding_replies));
- LASSERT(list_empty(&exp->exp_mdt_data.med_open_head));
+ LASSERT(cfs_list_empty(&exp->exp_outstanding_replies));
+ LASSERT(cfs_list_empty(&exp->exp_mdt_data.med_open_head));
if (obd_uuid_equals(&exp->exp_client_uuid, &exp->exp_obd->obd_uuid))
RETURN(0);
+ lut_client_free(exp);
RETURN(rc);
}
static void mdt_allow_cli(struct mdt_device *m, unsigned int flag)
{
if (flag & CONFIG_LOG)
- m->mdt_fl_cfglog = 1;
+ cfs_set_bit(MDT_FL_CFGLOG, &m->mdt_state);
/* also notify active event */
if (flag & CONFIG_SYNC)
- m->mdt_fl_synced = 1;
+ cfs_set_bit(MDT_FL_SYNCED, &m->mdt_state);
- if (m->mdt_fl_cfglog && m->mdt_fl_synced)
+ if (cfs_test_bit(MDT_FL_CFGLOG, &m->mdt_state) &&
+ cfs_test_bit(MDT_FL_SYNCED, &m->mdt_state)) {
+ struct obd_device *obd = m->mdt_md_dev.md_lu_dev.ld_obd;
+
/* Open for clients */
- m->mdt_md_dev.md_lu_dev.ld_obd->obd_no_conn = 0;
+ if (obd->obd_no_conn) {
+ cfs_spin_lock_bh(&obd->obd_processing_task_lock);
+ obd->obd_no_conn = 0;
+ cfs_spin_unlock_bh(&obd->obd_processing_task_lock);
+ }
+ }
}
static int mdt_upcall(const struct lu_env *env, struct md_device *md,
break;
case MD_LOV_CONFIG:
/* Check that MDT is not yet configured */
- LASSERT(!m->mdt_fl_cfglog);
+ LASSERT(!cfs_test_bit(MDT_FL_CFGLOG, &m->mdt_state));
break;
#ifdef HAVE_QUOTA_SUPPORT
case MD_LOV_QUOTA:
struct getinfo_fid2path *fpout, *fpin;
int rc = 0;
- fpin = key + size_round(sizeof(KEY_FID2PATH));
+ fpin = key + cfs_size_round(sizeof(KEY_FID2PATH));
fpout = val;
if (ptlrpc_req_need_swab(info->mti_pill->rc_req))
*/
int mdt_hsm_copytool_send(struct obd_export *exp)
{
- struct lnl_hdr *lh;
+ struct kuc_hdr *lh;
struct hsm_action_list *hal;
struct hsm_action_item *hai;
int rc, len;
libcfs_nid2str(exp->exp_connection->c_peer.nid));
len = sizeof(*lh) + sizeof(*hal) + MTI_NAME_MAXLEN +
- /* for mockup below */ 2 * size_round(sizeof(*hai));
+ /* for mockup below */ 2 * cfs_size_round(sizeof(*hai));
OBD_ALLOC(lh, len);
if (lh == NULL)
RETURN(-ENOMEM);
- lh->lnl_magic = LNL_MAGIC;
- lh->lnl_transport = LNL_TRANSPORT_HSM;
- lh->lnl_msgtype = HMT_ACTION_LIST;
- lh->lnl_msglen = len;
+ lh->kuc_magic = KUC_MAGIC;
+ lh->kuc_transport = KUC_TRANSPORT_HSM;
+ lh->kuc_msgtype = HMT_ACTION_LIST;
+ lh->kuc_msglen = len;
hal = (struct hsm_action_list *)(lh + 1);
hal->hal_version = HAL_VERSION;
llo_local_obj_register(&mdt_last_recv);
- mdt_num_threads = MDT_NUM_THREADS;
+ if (mdt_num_threads > 0) {
+ if (mdt_num_threads > MDT_MAX_THREADS)
+ mdt_num_threads = MDT_MAX_THREADS;
+ if (mdt_num_threads < MDT_MIN_THREADS)
+ mdt_num_threads = MDT_MIN_THREADS;
+ mdt_max_threads = mdt_min_threads = mdt_num_threads;
+ } else {
+ mdt_max_threads = MDT_MAX_THREADS;
+ mdt_min_threads = MDT_MIN_THREADS;
+ if (mdt_min_threads < MDT_NUM_THREADS)
+ mdt_min_threads = MDT_NUM_THREADS;
+ }
+
lprocfs_mdt_init_vars(&lvars);
rc = class_register_type(&mdt_obd_device_ops, NULL,
lvars.module_vars, LUSTRE_MDT_NAME,