Thread: [Aoetools-discuss] removing a device from /dev on failure...
Brought to you by:
ecashin,
elcapitansam
From: Don H. <Don...@pm...> - 2006-07-06 17:25:37
|
Hello, When a device fails I would like to remove its corresponding entry from /dev (to give some semblance of "hot plug"). I tried modifying aoedev.c to include a rmdev(..) function that takes a string and if it matches to remove the device just like on aoedev_exit(..).. Well this panics the kernel very hard ("scheduling while atomic.."). so I'm sure I am doing something wrong. :)=20 Anyway, I was wondering if anyone has any suggestions on what I = should look at next? Or if they know of an example that I can learn from? Cheers, don void aoedev_rmdev(const unsigned char *dev_str) { =A0struct aoedev *d; =A0ulong flags; =A0flush_scheduled_work(); =A0while ((d =3D devlist)) { =A0=A0devlist =3D d->next; =A0=A0 =A0=A0if ( dev_str =3D=3D NULL) { =A0=A0=A0printk(KERN_INFO "aoe: rmdev all devices\n"); =A0=A0=A0spin_lock_irqsave(&d->lock, flags); =A0=A0=A0aoedev_downdev(d); =A0=A0=A0d->flags |=3D DEVFL_TKILL; =A0=A0=A0spin_unlock_irqrestore(&d->lock, flags); =A0=A0=A0 =A0=A0=A0del_timer_sync(&d->timer); =A0=A0=A0aoedev_freedev(d); =A0=A0} else if ( d->gd->disk_name =3D=3D NULL ) { =A0=A0=A0/* this should never happen! */ =A0=A0=A0printk(KERN_CRIT "aoe: rmdev YIKES!, disk_name is = NULL!\n");=A0=A0=A0 =A0=A0} else if ( !strncmp(d->gd->disk_name, dev_str, strlen(dev_str)) = ) { =A0=A0=A0printk(KERN_INFO "aoe: rmdev \"%s\"\n", dev_str); =A0=A0=A0spin_lock_irqsave(&d->lock, flags); =A0=A0=A0aoedev_downdev(d); =A0=A0=A0d->flags |=3D DEVFL_TKILL; =A0=A0=A0spin_unlock_irqrestore(&d->lock, flags); =A0=A0=A0 =A0=A0=A0del_timer_sync(&d->timer); =A0=A0=A0aoedev_freedev(d); =A0=A0=A0break; =A0=A0}=20 =A0} =20 } void aoedev_exit(void) { =A0aoedev_rmdev(NULL); /* remove all devices */ } |
From: Ed L. C. <ec...@co...> - 2006-07-12 15:44:47
|
On Thu, Jul 06, 2006 at 10:25:24AM -0700, Don Hiatt wrote: > Hello, > > When a device fails I would like to remove its corresponding entry > from /dev (to give some semblance of "hot plug"). I tried modifying > aoedev.c to include a rmdev(..) function that takes a string and if > it matches to remove the device just like on aoedev_exit(..).. Well > this panics the kernel very hard ("scheduling while atomic.."). so > I'm sure I am doing something wrong. :) > > Anyway, I was wondering if anyone has any suggestions on what I should > look at next? Or if they know of an example that I can learn from? It's probably a pretty tricky thing to get right, because in the Linux kernel it's easy to make mistakes in unloading a module or removing things. That's because there are often subtle race conditions where someone might be using a resource that you're removing; also, as you discovered, there are limitations on what you can do in the different contexts. Those difficulties mean that a lot of testing would be necessary before a change like this could really be trusted. That testing would probably have to be done and documented by the author of the changes. In case you (or anyone listening) is still interested in working on it, the next things to learn about would be the different contexts that there are in the kernel: interrupt context, tasklet context, and process context. -- Ed L Cashin <ec...@co...> |