* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2013, Intel Corporation.
+ * Copyright (c) 2012, 2014, Intel Corporation.
* Use is subject to license terms.
*
* Author: Johann Lombardi <johann.lombardi@intel.com>
}
LPROC_SEQ_FOPS(qsd_timeout);
-static struct lprocfs_seq_vars lprocfs_quota_qsd_vars[] = {
- { "info", &qsd_state_fops },
- { "enabled", &qsd_enabled_fops },
- { "force_reint", &qsd_force_reint_fops },
- { "timeout", &qsd_timeout_fops },
+static struct lprocfs_vars lprocfs_quota_qsd_vars[] = {
+ { .name = "info",
+ .fops = &qsd_state_fops },
+ { .name = "enabled",
+ .fops = &qsd_enabled_fops },
+ { .name = "force_reint",
+ .fops = &qsd_force_reint_fops },
+ { .name = "timeout",
+ .fops = &qsd_timeout_fops },
{ NULL }
};
int qtype)
{
struct qsd_qtype_info *qqi;
+ int repeat = 0;
ENTRY;
if (qsd->qsd_type_array[qtype] == NULL)
qsd->qsd_type_array[qtype] = NULL;
/* all deferred work lists should be empty */
- LASSERT(cfs_list_empty(&qqi->qqi_deferred_glb));
- LASSERT(cfs_list_empty(&qqi->qqi_deferred_slv));
+ LASSERT(list_empty(&qqi->qqi_deferred_glb));
+ LASSERT(list_empty(&qqi->qqi_deferred_slv));
/* shutdown lquota site */
if (qqi->qqi_site != NULL && !IS_ERR(qqi->qqi_site)) {
qqi->qqi_site = NULL;
}
+ /* The qqi may still be holding by global locks which are being
+ * canceled asynchronously (LU-4365), see the following steps:
+ *
+ * - On server umount, we try to clear all quota locks first by
+ * disconnecting LWP (which will invalidate import and cleanup
+ * all locks on it), however, if quota reint process is holding
+ * the global lock for reintegration at that time, global lock
+ * will fail to be cleared on LWP disconnection.
+ *
+ * - Umount process goes on and stops reint process, the global
+ * lock will be dropped on reint process exit, however, the lock
+ * cancel in done in asynchronous way, so the
+ * qsd_glb_blocking_ast() might haven't been called yet when we
+ * get here.
+ */
+ while (atomic_read(&qqi->qqi_ref) > 1) {
+ CDEBUG(D_QUOTA, "qqi reference count %u, repeat: %d\n",
+ atomic_read(&qqi->qqi_ref), repeat);
+ repeat++;
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(cfs_time_seconds(1));
+ }
+
/* by now, all qqi users should have gone away */
- LASSERT(cfs_atomic_read(&qqi->qqi_ref) == 1);
+ LASSERT(atomic_read(&qqi->qqi_ref) == 1);
lu_ref_fini(&qqi->qqi_reference);
/* release accounting object */
if (qqi == NULL)
RETURN(-ENOMEM);
qsd->qsd_type_array[qtype] = qqi;
- cfs_atomic_set(&qqi->qqi_ref, 1); /* referenced from qsd */
+ atomic_set(&qqi->qqi_ref, 1); /* referenced from qsd */
/* set backpointer and other parameters */
qqi->qqi_qsd = qsd;
qqi->qqi_reint = false;
init_waitqueue_head(&qqi->qqi_reint_thread.t_ctl_waitq);
thread_set_flags(&qqi->qqi_reint_thread, SVC_STOPPED);
- CFS_INIT_LIST_HEAD(&qqi->qqi_deferred_glb);
- CFS_INIT_LIST_HEAD(&qqi->qqi_deferred_slv);
+ INIT_LIST_HEAD(&qqi->qqi_deferred_glb);
+ INIT_LIST_HEAD(&qqi->qqi_deferred_slv);
/* open accounting object */
LASSERT(qqi->qqi_acct_obj == NULL);
/* release per-filesystem information */
if (qsd->qsd_fsinfo != NULL) {
- down(&qsd->qsd_fsinfo->qfs_sem);
+ mutex_lock(&qsd->qsd_fsinfo->qfs_mutex);
/* remove from the list of fsinfo */
- cfs_list_del_init(&qsd->qsd_link);
- up(&qsd->qsd_fsinfo->qfs_sem);
+ list_del_init(&qsd->qsd_link);
+ mutex_unlock(&qsd->qsd_fsinfo->qfs_mutex);
qsd_put_fsinfo(qsd->qsd_fsinfo);
qsd->qsd_fsinfo = NULL;
}
*/
struct qsd_instance *qsd_init(const struct lu_env *env, char *svname,
struct dt_device *dev,
- cfs_proc_dir_entry_t *osd_proc)
+ struct proc_dir_entry *osd_proc)
{
struct qsd_thread_info *qti = qsd_info(env);
struct qsd_instance *qsd;
/* generic initializations */
rwlock_init(&qsd->qsd_lock);
- CFS_INIT_LIST_HEAD(&qsd->qsd_link);
+ INIT_LIST_HEAD(&qsd->qsd_link);
thread_set_flags(&qsd->qsd_upd_thread, SVC_STOPPED);
init_waitqueue_head(&qsd->qsd_upd_thread.t_ctl_waitq);
- CFS_INIT_LIST_HEAD(&qsd->qsd_upd_list);
+ INIT_LIST_HEAD(&qsd->qsd_upd_list);
spin_lock_init(&qsd->qsd_adjust_lock);
- CFS_INIT_LIST_HEAD(&qsd->qsd_adjust_list);
+ INIT_LIST_HEAD(&qsd->qsd_adjust_list);
qsd->qsd_prepared = false;
qsd->qsd_started = false;
}
/* add in the list of lquota_fsinfo */
- down(&qsd->qsd_fsinfo->qfs_sem);
+ mutex_lock(&qsd->qsd_fsinfo->qfs_mutex);
list_add_tail(&qsd->qsd_link, &qsd->qsd_fsinfo->qfs_qsd_list);
- up(&qsd->qsd_fsinfo->qfs_sem);
+ mutex_unlock(&qsd->qsd_fsinfo->qfs_mutex);
/* register procfs directory */
- qsd->qsd_proc = lprocfs_seq_register(QSD_DIR, osd_proc,
- lprocfs_quota_qsd_vars, qsd);
+ qsd->qsd_proc = lprocfs_register(QSD_DIR, osd_proc,
+ lprocfs_quota_qsd_vars, qsd);
if (IS_ERR(qsd->qsd_proc)) {
rc = PTR_ERR(qsd->qsd_proc);
qsd->qsd_proc = NULL;
}
/* generate osp name */
- rc = tgt_name2lwpname((char *)qsd->qsd_svname, qti->qti_buf);
+ rc = tgt_name2lwp_name(qsd->qsd_svname, qti->qti_buf,
+ MTI_NAME_MAXLEN, 0);
if (rc) {
CERROR("%s: failed to generate ospname (%d)\n",
qsd->qsd_svname, rc);