Lines Matching refs:disc

18  * The disc mutex is can be locked when acquiring rport locks, but may not
49 * @disc: The discovery job to stop remote ports on
51 static void fc_disc_stop_rports(struct fc_disc *disc)
55 lockdep_assert_held(&disc->disc_mutex);
57 list_for_each_entry(rdata, &disc->rports, peers) {
67 * @disc: The discovery object to which the RSCN applies
70 static void fc_disc_recv_rscn_req(struct fc_disc *disc, struct fc_frame *fp)
82 lockdep_assert_held(&disc->disc_mutex);
84 lport = fc_disc_lport(disc);
86 FC_DISC_DBG(disc, "Received an RSCN event\n");
117 FC_DISC_DBG(disc, "Port address format for port "
132 FC_DISC_DBG(disc, "Address format is (%d)\n", fmt);
152 FC_DISC_DBG(disc, "RSCN received: rediscovering\n");
153 fc_disc_restart(disc);
155 FC_DISC_DBG(disc, "RSCN received: not rediscovering. "
157 redisc, lport->state, disc->pending);
162 FC_DISC_DBG(disc, "Received a bad RSCN frame\n");
181 struct fc_disc *disc = &lport->disc;
186 mutex_lock(&disc->disc_mutex);
187 fc_disc_recv_rscn_req(disc, fp);
188 mutex_unlock(&disc->disc_mutex);
191 FC_DISC_DBG(disc, "Received an unsupported request, "
200 * @disc: The discovery object to be restarted
202 static void fc_disc_restart(struct fc_disc *disc)
204 lockdep_assert_held(&disc->disc_mutex);
206 if (!disc->disc_callback)
209 FC_DISC_DBG(disc, "Restarting discovery\n");
211 disc->requested = 1;
212 if (disc->pending)
220 disc->disc_id = (disc->disc_id + 2) | 1;
221 disc->retry_count = 0;
222 fc_disc_gpn_ft_req(disc);
234 struct fc_disc *disc = &lport->disc;
237 * At this point we may have a new disc job or an existing
241 mutex_lock(&disc->disc_mutex);
242 disc->disc_callback = disc_callback;
243 fc_disc_restart(disc);
244 mutex_unlock(&disc->disc_mutex);
249 * @disc: The discovery context
252 static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event)
254 struct fc_lport *lport = fc_disc_lport(disc);
257 lockdep_assert_held(&disc->disc_mutex);
258 FC_DISC_DBG(disc, "Discovery complete\n");
260 disc->pending = 0;
261 if (disc->requested) {
262 fc_disc_restart(disc);
273 * is protected by the disc mutex which is already held on entry.
275 list_for_each_entry(rdata, &disc->rports, peers) {
279 if (rdata->disc_id == disc->disc_id)
286 mutex_unlock(&disc->disc_mutex);
287 disc->disc_callback(lport, event);
288 mutex_lock(&disc->disc_mutex);
293 * @disc: The discovery context
296 static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
298 struct fc_lport *lport = fc_disc_lport(disc);
301 FC_DISC_DBG(disc, "Error %d, retries %d/%d\n",
302 PTR_ERR_OR_ZERO(fp), disc->retry_count,
310 if (disc->retry_count < FC_DISC_RETRY_LIMIT) {
318 if (!disc->retry_count)
321 disc->retry_count++;
322 schedule_delayed_work(&disc->disc_work, delay);
324 fc_disc_done(disc, DISC_EV_FAILED);
331 disc->pending = 0;
337 * @disc: The discovery context
339 static void fc_disc_gpn_ft_req(struct fc_disc *disc)
342 struct fc_lport *lport = fc_disc_lport(disc);
344 lockdep_assert_held(&disc->disc_mutex);
348 disc->pending = 1;
349 disc->requested = 0;
351 disc->buf_len = 0;
352 disc->seq_count = 0;
362 disc, 3 * lport->r_a_tov))
365 fc_disc_error(disc, NULL);
370 * @disc: The discovery context
376 static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
387 lport = fc_disc_lport(disc);
388 disc->seq_count++;
396 tlen = disc->buf_len;
397 disc->buf_len = 0;
405 np = &disc->partial_buf;
415 disc->buf_len = (unsigned char) plen;
417 disc->buf_len = 0;
436 rdata->disc_id = disc->disc_id;
446 fc_disc_done(disc, DISC_EV_SUCCESS);
460 if (np != &disc->partial_buf) {
461 FC_DISC_DBG(disc, "Partial buffer remains "
463 memcpy(&disc->partial_buf, np, len);
465 disc->buf_len = (unsigned char) len;
476 struct fc_disc *disc = container_of(work,
479 mutex_lock(&disc->disc_mutex);
480 fc_disc_gpn_ft_req(disc);
481 mutex_unlock(&disc->disc_mutex);
490 * Locking Note: This function is called without disc mutex held, and
496 struct fc_disc *disc = disc_arg;
504 mutex_lock(&disc->disc_mutex);
505 FC_DISC_DBG(disc, "Received a GPN_FT response\n");
508 fc_disc_error(disc, fp);
509 mutex_unlock(&disc->disc_mutex);
517 if (fr_sof(fp) == FC_SOF_I3 && seq_cnt == 0 && disc->seq_count == 0) {
520 FC_DISC_DBG(disc, "GPN_FT response too short, len %d\n",
527 error = fc_disc_gpn_ft_parse(disc, cp + 1, len);
529 FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x "
537 FC_DISC_DBG(disc, "GPN_FT unexpected response code "
541 } else if (fr_sof(fp) == FC_SOF_N3 && seq_cnt == disc->seq_count) {
542 error = fc_disc_gpn_ft_parse(disc, fh + 1, len);
544 FC_DISC_DBG(disc, "GPN_FT unexpected frame - out of sequence? "
546 seq_cnt, disc->seq_count, fr_sof(fp), fr_eof(fp));
550 fc_disc_error(disc, ERR_PTR(error));
552 fc_disc_done(disc, event);
554 mutex_unlock(&disc->disc_mutex);
563 * Locking Note: This function is called without disc mutex held.
571 struct fc_disc *disc;
577 disc = &lport->disc;
582 mutex_lock(&disc->disc_mutex);
583 fc_disc_restart(disc);
584 mutex_unlock(&disc->disc_mutex);
601 FC_DISC_DBG(disc, "GPN_ID accepted. WWPN changed. "
606 mutex_lock(&lport->disc.disc_mutex);
608 mutex_unlock(&lport->disc.disc_mutex);
610 new_rdata->disc_id = disc->disc_id;
615 rdata->disc_id = disc->disc_id;
619 FC_DISC_DBG(disc, "GPN_ID rejected reason %x exp %x\n",
623 FC_DISC_DBG(disc, "GPN_ID unexpected response code %x\n",
626 mutex_lock(&disc->disc_mutex);
627 fc_disc_restart(disc);
628 mutex_unlock(&disc->disc_mutex);
648 lockdep_assert_held(&lport->disc.disc_mutex);
670 lockdep_assert_held(&lport->disc.disc_mutex);
685 struct fc_disc *disc = &lport->disc;
687 if (disc->pending)
688 cancel_delayed_work_sync(&disc->disc_work);
689 mutex_lock(&disc->disc_mutex);
690 fc_disc_stop_rports(disc);
691 mutex_unlock(&disc->disc_mutex);
714 struct fc_disc *disc;
728 disc = &lport->disc;
730 disc->priv = priv;
740 struct fc_disc *disc = &lport->disc;
742 INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout);
743 mutex_init(&disc->disc_mutex);
744 INIT_LIST_HEAD(&disc->rports);