* Note that reiserfs quotas are disabled on SLES 10 in this kernel.
Severity : normal
+Bugzilla : 13888
+Description: interrupt oig_wait produce painc on resend.
+Details : brw_redo_request can be used for resend requests from ptlrpcd and
+ private set, and this produce situation when rq_ptlrpcd_data not
+ copyed to new allocated request and triggered LBUG on assert
+ req->rq_ptlrpcd_data != NULL. But this member used only for wakeup
+ ptlrpcd set if request is changed and can be safety changed to use
+ rq_set directly.
+
+Severity : normal
Bugzilla : 13497
Description: LASSERT_{REQ,REP}SWAB macros are buggy
Details : If SWAB_PARANOIA is disabled, the LASSERT_REQSWAB and
mds_internal.h mds_lib.c mds_open.c mds_reint.c mds_xattr.c
in mds subsystem.
+
--------------------------------------------------------------------------------
2007-08-10 Cluster File Systems, Inc. <info@clusterfs.com>
oap->oap_request = ptlrpc_request_addref(new_req);
}
}
- client_obd_list_unlock(&aa->aa_cli->cl_loi_list_lock);
-
- DEBUG_REQ(D_INFO, new_req, "new request");
+ /* use ptlrpc_set_add_req is safe because interpret functions work
+ * in check_set context. only one way exist with access to request
+ * from different thread got -EINTR - this way protected with
+ * cl_loi_list_lock */
ptlrpc_set_add_req(set, new_req);
+ client_obd_list_unlock(&aa->aa_cli->cl_loi_list_lock);
+
+ DEBUG_REQ(D_INFO, new_req, "new request");
RETURN(0);
}
spinlock_t pc_lock;
struct completion pc_starting;
struct completion pc_finishing;
- struct list_head pc_req_list;
- cfs_waitq_t pc_waitq;
struct ptlrpc_request_set *pc_set;
char pc_name[16];
#ifndef __KERNEL__
void ptlrpcd_wake(struct ptlrpc_request *req)
{
- struct ptlrpcd_ctl *pc = req->rq_ptlrpcd_data;
+ struct ptlrpc_request_set *rq_set = req->rq_set;
- LASSERT(pc != NULL);
+ LASSERT(rq_set != NULL);
- cfs_waitq_signal(&pc->pc_waitq);
+ cfs_waitq_signal(&rq_set->set_waitq);
}
/* requests that are added to the ptlrpcd queue are sent via
else
pc = &ptlrpcd_recovery_pc;
- req->rq_ptlrpcd_data = pc;
ptlrpc_set_add_new_req(pc->pc_set, req);
- wake_up(&pc->pc_waitq);
+ cfs_waitq_signal(&pc->pc_set->set_waitq);
}
static int ptlrpcd_check(struct ptlrpcd_ctl *pc)
* on the set's new_req_list and ptlrpcd_check moves them into
* the set. */
while (1) {
- cfs_waitlink_t set_wait;
struct l_wait_info lwi;
cfs_duration_t timeout;
timeout = cfs_time_seconds(ptlrpc_set_next_timeout(pc->pc_set));
lwi = LWI_TIMEOUT(timeout, ptlrpc_expired_set, pc->pc_set);
- /* ala the pinger, wait on pc's waitqueue and the set's */
- cfs_waitlink_init(&set_wait);
- cfs_waitq_add(&pc->pc_set->set_waitq, &set_wait);
- cfs_waitq_forward(&set_wait, &pc->pc_waitq);
- l_wait_event(pc->pc_waitq, ptlrpcd_check(pc), &lwi);
- cfs_waitq_del(&pc->pc_set->set_waitq, &set_wait);
+ l_wait_event(pc->pc_set->set_waitq, ptlrpcd_check(pc), &lwi);
if (test_bit(LIOD_STOP, &pc->pc_flags))
break;
static void ptlrpcd_zombie_impexp_notify(void)
{
- cfs_waitq_signal(&ptlrpcd_pc.pc_waitq);
+ LASSERT(ptlrpcd_pc.pc_set != NULL); // call before ptlrpcd inited ?
+
+ cfs_waitq_signal(&ptlrpcd_pc.pc_set->set_waitq);
}
+
#else
int ptlrpcd_check_async_rpcs(void *arg)
memset(pc, 0, sizeof(*pc));
init_completion(&pc->pc_starting);
init_completion(&pc->pc_finishing);
- cfs_waitq_init(&pc->pc_waitq);
pc->pc_flags = 0;
spin_lock_init(&pc->pc_lock);
- CFS_INIT_LIST_HEAD(&pc->pc_req_list);
snprintf (pc->pc_name, sizeof (pc->pc_name), name);
pc->pc_set = ptlrpc_prep_set();
static void ptlrpcd_stop(struct ptlrpcd_ctl *pc)
{
set_bit(LIOD_STOP, &pc->pc_flags);
- cfs_waitq_signal(&pc->pc_waitq);
+ cfs_waitq_signal(&pc->pc_set->set_waitq);
#ifdef __KERNEL__
obd_zombie_impexp_notify = NULL;
wait_for_completion(&pc->pc_finishing);