devfs
[Top] [All Lists]

Re: Removeable Media, partitions and devfs?

To: "Kevin P. Fleming" <kevin@xxxxxxxxxxxxx>
Subject: Re: Removeable Media, partitions and devfs?
From: Richard Gooch <rgooch@xxxxxxxxxxxxxxx>
Date: Fri, 14 Dec 2001 11:10:06 -0700
Cc: "Paul Bristow" <paul@xxxxxxxxxxxxxxx>, <Andrej.Borsenkow@xxxxxxxxxxxxxx>, <devfs@xxxxxxxxxxx>
In-reply-to: <003401c184bc$107efb80$6caaa8c0@kevin>
References: <3C0C9AC5.4080504@paulbristow.net> <001801c17d15$758b6760$c8aaa8c0@kevin> <3C0D588F.9000806@paulbristow.net> <03be01c17d20$5d1b72f0$c8aaa8c0@kevin> <200112050639.fB56d0a05344@vindaloo.ras.ucalgary.ca> <00e901c17dd2$8ccffe50$c8aaa8c0@kevin> <200112060633.fB66XoZ22006@vindaloo.ras.ucalgary.ca> <3C0FED36.9050506@paulbristow.net> <010b01c17f4f$87b478a0$c8aaa8c0@kevin> <200112090303.fB933vw04632@vindaloo.ras.ucalgary.ca> <001501c181ba$fdb65650$6caaa8c0@kevin> <200112140650.fBE6oN201769@vindaloo.ras.ucalgary.ca> <003401c184bc$107efb80$6caaa8c0@kevin>
Sender: owner-devfs@xxxxxxxxxxx
Kevin P. Fleming writes:
> > > This leads to existing partX entries not being removed, as
> > > grok_partitions does not make any attempt to update the partition
> > > information. If I forcibly pass a non-zero size, grok_partitions
> > > cleans up the old entries, but only after generating at least two
> > > IDE I/O errors in the system log as it tries to read the partition
> > > table from the disk. If I had other partition methods compiled in my
> > > kernel, I'm sure it would generate even more errors.
> >
> > You shouldn't need to pass a non-zero size. That's what my tiny patch
> > is meant to solve. If size==0 and the media is removable, it creates
> > the device directory and "disc" entry, *without reading the partition
> > table*. Thus there should be no errors.
> 
> That patch only has an effect when the drive is originally registered;
> calling devfs_register_disc later does _not_ cause existing partition
> entries to be removed. Once the directory has been created,
> devfs_register_disc seems to be a no-op.
> 
> > From your previous message, it appeared that all but one problem (new
> > media of the same size) was solved when using my patch. Is that not
> > the case?
> 
> A bit of oversimplification; my previous message said that my new
> ide-floppy code could catch almost all media change events. That
> does not mean, however, that I have the ability to get the right
> thing done in the device directory for every possible type of event.

Ah. In this case: partitions aren't being unregistered properly.

> > > Any suggestions on how you want see this handled? This is (somewhat)
> > > where I arrived previously, in that the driver knows that the
> > > partition entries need to be removed, but has no direct way to cause
> > > that to happen.
> >
> > Doesn't my patch fix this?
> 
> Nope, existing entries don't go away when devfs_register_disc gets
> called for the second (or subsequent) times.

OK, I've looked at this, and the appended patch should fix this. This
superceeds my earlier patch. Now, if the driver passes size==0 and it
flags the media as removable, then the device directory and "disc"
entry will be created (if not already), and any old partitions are
removed. Please try this out and let me know how it goes. I hope it
works, because I've hit the 20 line patch limit I imposed :-)

                                Regards,

                                        Richard....
Permanent: rgooch@xxxxxxxxxxxxx
Current:   rgooch@xxxxxxxxxxxxxxx

--- check.c~    Thu Oct 11 18:25:10 2001
+++ check.c     Fri Dec 14 11:02:19 2001
@@ -338,7 +338,8 @@
        if (!unregister)
                devfs_register_disc (dev, minor);
        for (part = 1; part < dev->max_p; part++) {
-               if ( unregister || (dev->part[part + minor].nr_sects < 1) ) {
+               if ( unregister || (dev->part[minor].nr_sects < 1) ||
+                    (dev->part[part + minor].nr_sects < 1) ) {
                        devfs_unregister (dev->part[part + minor].de);
                        dev->part[part + minor].de = NULL;
                        continue;
@@ -383,6 +384,8 @@
 
        dev->part[first_minor].nr_sects = size;
        /* No such device or no minors to use for partitions */
+       if ( !size && dev->flags && (dev->flags[drive] & GENHD_FL_REMOVABLE) )
+               devfs_register_partitions (dev, first_minor, 0);
        if (!size || minors == 1)
                return;
 

<Prev in Thread] Current Thread [Next in Thread>