Commit ebd93a7daf40d61b994b9928dd7bf26e0dcca10d
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
drivers/net/eql.c
... | ... | @@ -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 | } |