Commit ebd93a7daf40d61b994b9928dd7bf26e0dcca10d

Authored by Ying Xue
Committed by David S. Miller
1 parent 0917b9334b

eql: use __dev_get_by_name instead of dev_get_by_name to find interface

The following call chain indicates that eql_ioctl(), eql_enslave(),
eql_emancipate(), eql_g_slave_cfg() and eql_s_slave_cfg() are
protected under rtnl_lock. So if we use __dev_get_by_name() instead
of dev_get_by_name() to find interface handlers in them, this would
help us avoid to change interface reference counters.

dev_ioctl()
  rtnl_lock()
    dev_ifsioc()
      eql_ioctl()
        eql_enslave()
	eql_emancipate()
	eql_g_slave_cfg()
	eql_s_slave_cfg()
  rtnl_unlock()

Additionally we also change their return values from -EINVAL to
-ENODEV in case that interfaces are no found.

Signed-off-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 42 additions and 53 deletions Side-by-side Diff

... ... @@ -395,6 +395,7 @@
395 395 if (duplicate_slave)
396 396 eql_kill_one_slave(queue, duplicate_slave);
397 397  
  398 + dev_hold(slave->dev);
398 399 list_add(&slave->list, &queue->all_slaves);
399 400 queue->num_slaves++;
400 401 slave->dev->flags |= IFF_SLAVE;
401 402  
402 403  
403 404  
404 405  
405 406  
... ... @@ -413,39 +414,35 @@
413 414 if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
414 415 return -EFAULT;
415 416  
416   - slave_dev = dev_get_by_name(&init_net, srq.slave_name);
417   - if (slave_dev) {
418   - if ((master_dev->flags & IFF_UP) == IFF_UP) {
419   - /* slave is not a master & not already a slave: */
420   - if (!eql_is_master(slave_dev) &&
421   - !eql_is_slave(slave_dev)) {
422   - slave_t *s = kmalloc(sizeof(*s), GFP_KERNEL);
423   - equalizer_t *eql = netdev_priv(master_dev);
424   - int ret;
  417 + slave_dev = __dev_get_by_name(&init_net, srq.slave_name);
  418 + if (!slave_dev)
  419 + return -ENODEV;
425 420  
426   - if (!s) {
427   - dev_put(slave_dev);
428   - return -ENOMEM;
429   - }
  421 + if ((master_dev->flags & IFF_UP) == IFF_UP) {
  422 + /* slave is not a master & not already a slave: */
  423 + if (!eql_is_master(slave_dev) && !eql_is_slave(slave_dev)) {
  424 + slave_t *s = kmalloc(sizeof(*s), GFP_KERNEL);
  425 + equalizer_t *eql = netdev_priv(master_dev);
  426 + int ret;
430 427  
431   - memset(s, 0, sizeof(*s));
432   - s->dev = slave_dev;
433   - s->priority = srq.priority;
434   - s->priority_bps = srq.priority;
435   - s->priority_Bps = srq.priority / 8;
  428 + if (!s)
  429 + return -ENOMEM;
436 430  
437   - spin_lock_bh(&eql->queue.lock);
438   - ret = __eql_insert_slave(&eql->queue, s);
439   - if (ret) {
440   - dev_put(slave_dev);
441   - kfree(s);
442   - }
443   - spin_unlock_bh(&eql->queue.lock);
  431 + memset(s, 0, sizeof(*s));
  432 + s->dev = slave_dev;
  433 + s->priority = srq.priority;
  434 + s->priority_bps = srq.priority;
  435 + s->priority_Bps = srq.priority / 8;
444 436  
445   - return ret;
446   - }
  437 + spin_lock_bh(&eql->queue.lock);
  438 + ret = __eql_insert_slave(&eql->queue, s);
  439 + if (ret)
  440 + kfree(s);
  441 +
  442 + spin_unlock_bh(&eql->queue.lock);
  443 +
  444 + return ret;
447 445 }
448   - dev_put(slave_dev);
449 446 }
450 447  
451 448 return -EINVAL;
452 449  
453 450  
454 451  
... ... @@ -461,24 +458,20 @@
461 458 if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
462 459 return -EFAULT;
463 460  
464   - slave_dev = dev_get_by_name(&init_net, srq.slave_name);
465   - ret = -EINVAL;
466   - if (slave_dev) {
467   - spin_lock_bh(&eql->queue.lock);
  461 + slave_dev = __dev_get_by_name(&init_net, srq.slave_name);
  462 + if (!slave_dev)
  463 + return -ENODEV;
468 464  
469   - if (eql_is_slave(slave_dev)) {
470   - slave_t *slave = __eql_find_slave_dev(&eql->queue,
471   - slave_dev);
472   -
473   - if (slave) {
474   - eql_kill_one_slave(&eql->queue, slave);
475   - ret = 0;
476   - }
  465 + ret = -EINVAL;
  466 + spin_lock_bh(&eql->queue.lock);
  467 + if (eql_is_slave(slave_dev)) {
  468 + slave_t *slave = __eql_find_slave_dev(&eql->queue, slave_dev);
  469 + if (slave) {
  470 + eql_kill_one_slave(&eql->queue, slave);
  471 + ret = 0;
477 472 }
478   - dev_put(slave_dev);
479   -
480   - spin_unlock_bh(&eql->queue.lock);
481 473 }
  474 + spin_unlock_bh(&eql->queue.lock);
482 475  
483 476 return ret;
484 477 }
... ... @@ -494,7 +487,7 @@
494 487 if (copy_from_user(&sc, scp, sizeof (slave_config_t)))
495 488 return -EFAULT;
496 489  
497   - slave_dev = dev_get_by_name(&init_net, sc.slave_name);
  490 + slave_dev = __dev_get_by_name(&init_net, sc.slave_name);
498 491 if (!slave_dev)
499 492 return -ENODEV;
500 493  
... ... @@ -510,8 +503,6 @@
510 503 }
511 504 spin_unlock_bh(&eql->queue.lock);
512 505  
513   - dev_put(slave_dev);
514   -
515 506 if (!ret && copy_to_user(scp, &sc, sizeof (slave_config_t)))
516 507 ret = -EFAULT;
517 508  
... ... @@ -529,7 +520,7 @@
529 520 if (copy_from_user(&sc, scp, sizeof (slave_config_t)))
530 521 return -EFAULT;
531 522  
532   - slave_dev = dev_get_by_name(&init_net, sc.slave_name);
  523 + slave_dev = __dev_get_by_name(&init_net, sc.slave_name);
533 524 if (!slave_dev)
534 525 return -ENODEV;
535 526  
... ... @@ -547,8 +538,6 @@
547 538 }
548 539 }
549 540 spin_unlock_bh(&eql->queue.lock);
550   -
551   - dev_put(slave_dev);
552 541  
553 542 return ret;
554 543 }