mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
[ATM]: deregistration removes device from atm_devs list immediately
atm_dev_deregister() removes device from atm_dev list immediately to prevent operations on a phantom device. Decision to free device based only on ->refcnt now. Remove shutdown_atm_dev() use atm_dev_deregister() instead. atm_dev_deregister() also asynchronously releases all vccs related to device. Signed-off-by: Stanislaw Gruszka <stf_xl@wp.pl> Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aaaaaadbe7
commit
64bf69ddff
6 changed files with 51 additions and 56 deletions
|
@ -274,7 +274,7 @@ enum {
|
|||
|
||||
|
||||
enum {
|
||||
ATM_DF_CLOSE, /* close device when last VCC is closed */
|
||||
ATM_DF_REMOVED, /* device was removed from atm_devs list */
|
||||
};
|
||||
|
||||
|
||||
|
@ -415,7 +415,6 @@ struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops,
|
|||
int number,unsigned long *flags); /* number == -1: pick first available */
|
||||
struct atm_dev *atm_dev_lookup(int number);
|
||||
void atm_dev_deregister(struct atm_dev *dev);
|
||||
void shutdown_atm_dev(struct atm_dev *dev);
|
||||
void vcc_insert_socket(struct sock *sk);
|
||||
|
||||
|
||||
|
@ -457,11 +456,12 @@ static inline void atm_dev_hold(struct atm_dev *dev)
|
|||
|
||||
static inline void atm_dev_put(struct atm_dev *dev)
|
||||
{
|
||||
atomic_dec(&dev->refcnt);
|
||||
|
||||
if ((atomic_read(&dev->refcnt) == 1) &&
|
||||
test_bit(ATM_DF_CLOSE,&dev->flags))
|
||||
shutdown_atm_dev(dev);
|
||||
if (atomic_dec_and_test(&dev->refcnt)) {
|
||||
BUG_ON(!test_bit(ATM_DF_REMOVED, &dev->flags));
|
||||
if (dev->ops->dev_close)
|
||||
dev->ops->dev_close(dev);
|
||||
kfree(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue