/* define qsd thread key */
LU_KEY_INIT_FINI(qsd, struct qsd_thread_info);
-LU_CONTEXT_KEY_DEFINE(qsd, LCT_MD_THREAD | LCT_DT_THREAD | LCT_LOCAL);
+LU_CONTEXT_KEY_DEFINE(qsd, LCT_MD_THREAD | LCT_MG_THREAD | LCT_DT_THREAD | LCT_LOCAL);
LU_KEY_INIT_GENERIC(qsd);
/* some procfs helpers */
if (strlen(enabled) == 0)
strcat(enabled, "none");
+ /* TODO: further pool ID should be removed or
+ * replaced with pool Name */
seq_printf(m, "target name: %s\n"
"pool ID: %d\n"
"type: %s\n"
"quota enabled: %s\n"
"conn to master: %s\n",
- qsd->qsd_svname, qsd->qsd_pool_id,
+ qsd->qsd_svname, 0,
qsd->qsd_is_md ? "md" : "dt", enabled,
qsd->qsd_exp_valid ? "setup" : "not setup yet");
if (copy_from_user(valstr, buffer, count))
GOTO(out, count = -EFAULT);
+ valstr[sizeof(valstr) - 1] = 0;
if (strchr(valstr, 'u'))
enabled |= BIT(USRQUOTA);
if (strchr(valstr, 'g'))
lprocfs_force_reint_seq_write(struct file *file, const char __user *buffer,
size_t count, loff_t *off)
{
- struct qsd_instance *qsd = ((struct seq_file *)file->private_data)->private;
+ struct seq_file *m = file->private_data;
+ struct qsd_instance *qsd = m->private;
int rc = 0, qtype;
LASSERT(qsd != NULL);
qsd_timeout_seq_write(struct file *file, const char __user *buffer,
size_t count, loff_t *off)
{
- struct qsd_instance *qsd = ((struct seq_file *)file->private_data)->private;
+ struct seq_file *m = file->private_data;
+ struct qsd_instance *qsd = m->private;
time64_t timeout;
int rc;
* step 3) will have to wait for qsd_start() to be called */
for (type = USRQUOTA; type < LL_MAXQUOTAS; type++) {
struct qsd_qtype_info *qqi = qsd->qsd_type_array[type];
- wake_up(&qqi->qqi_reint_thread.t_ctl_waitq);
+ struct task_struct *t;
+
+ /* qqi_reint_task can be set to NULL at any time,
+ * so we need to be careful.
+ */
+ rcu_read_lock();
+ t = rcu_dereference(qqi->qqi_reint_task);
+ if (t)
+ wake_up_process(t);
+ rcu_read_unlock();
}
RETURN(0);
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));
+ schedule_timeout_interruptible(cfs_time_seconds(1));
}
/* by now, all qqi users should have gone away */
qqi->qqi_glb_uptodate = false;
qqi->qqi_slv_uptodate = false;
qqi->qqi_reint = false;
- init_waitqueue_head(&qqi->qqi_reint_thread.t_ctl_waitq);
- thread_set_flags(&qqi->qqi_reint_thread, SVC_STOPPED);
INIT_LIST_HEAD(&qqi->qqi_deferred_glb);
INIT_LIST_HEAD(&qqi->qqi_deferred_slv);
- lquota_generate_fid(&qqi->qqi_fid, qsd->qsd_pool_id,
- QSD_RES_TYPE(qsd), qtype);
+ lquota_generate_fid(&qqi->qqi_fid, QSD_RES_TYPE(qsd), qtype);
/* open accounting object */
LASSERT(qqi->qqi_acct_obj == NULL);
*/
struct qsd_instance *qsd_init(const struct lu_env *env, char *svname,
struct dt_device *dev,
- struct proc_dir_entry *osd_proc, bool is_md)
+ struct proc_dir_entry *osd_proc,
+ bool is_md, bool excl)
{
struct qsd_thread_info *qti = qsd_info(env);
struct qsd_instance *qsd;
/* generic initializations */
rwlock_init(&qsd->qsd_lock);
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);
INIT_LIST_HEAD(&qsd->qsd_upd_list);
spin_lock_init(&qsd->qsd_adjust_lock);
INIT_LIST_HEAD(&qsd->qsd_adjust_list);
qsd->qsd_prepared = false;
qsd->qsd_started = false;
qsd->qsd_is_md = is_md;
+ qsd->qsd_updating = false;
+ qsd->qsd_exclusive = excl;
/* copy service name */
if (strlcpy(qsd->qsd_svname, svname, sizeof(qsd->qsd_svname))
lu_ref_add(&dev->dd_lu_dev.ld_reference, "qsd", qsd);
qsd->qsd_dev = dev;
- /* we only support pool ID 0 (default data or metadata pool) for the
- * time being. A different pool ID could be assigned to this target via
- * the configuration log in the future */
- qsd->qsd_pool_id = 0;
-
/* get fsname from svname */
rc = server_name2fsname(svname, qti->qti_buf, NULL);
if (rc) {
* up to usage; If usage < granted, release down to usage. */
for (type = USRQUOTA; type < LL_MAXQUOTAS; type++) {
struct qsd_qtype_info *qqi = qsd->qsd_type_array[type];
- wake_up(&qqi->qqi_reint_thread.t_ctl_waitq);
+ struct task_struct *t;
+
+ /* qqi_reint_task can be set to NULL at any time,
+ * so we need to be careful.
+ */
+ rcu_read_lock();
+ t = rcu_dereference(qqi->qqi_reint_task);
+ if (t)
+ wake_up_process(t);
+ rcu_read_unlock();
}
RETURN(rc);