Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Module problem on amd64



On Sun, 30 Nov 2008, Andrew Doran wrote:

On Fri, Nov 28, 2008 at 04:54:46PM -0800, Paul Goyette wrote:

Well, even if noone else thinks it is useful, I went and did the deed!

Cool, thanks! I think there is MD code that plays with 'mountroot'. See:

http://nxr.homeunix.org/source/search?q=&defs=&refs=mountroot&path=&hist=

TEST1 and TEST2 boot successfully to single user, and I'm able to do a
'ls' command from the single-user shell prompt.  However, both of these
panic due to the "end <= VM_MAX_KERNEL_ADDRESS" thing mentioned in an
earlier thread.

I will fix that soon.

+               /*
+                * If user specified a file system type, use only
+                * that type
+                */
+               if (strcmp(rootfstype, "?") && strcmp(rootfstype, v->vfs_name))
+                       continue;

KNF says 'strcmp(a, b) == 0'

Well, hopefully you meant 'strcmp(a,b) != 0' ??  I have fixed this.


+       static char my_vfs_name[NAME_MAX + 1];

Should be MNAMELEN from mount.h, I think.

OK, that's easy to fix.


+                               /*
+                                * Copy the vfs_name since *vops might be
+                                * deallocated?
+                                */
+                               strncpy(my_vfs_name, vops->vfs_name,
+                                       sizeof(my_vfs_name));
+                               rootfstype = (const char *)my_vfs_name;
                                vfs_delref(vops);
                                break;

Can you make 'rootfstype' in ioconf.c (or wherever it is emitted) into an
array sized MNAMELEN and not a pointer? That way, we can get rid of
'mountroot' completely and always key on the name. So the code in
vfs_mountroot() would look like:

It's emitted in config's mkswap.c, and defined in sys/systm.h.

I've already completely removed the mountroot variable; everything already keys only on the name. The only benefit of allocating the new rootfstype as a fixed array is to avoid having the local 'my_vfs_name' above.

But, if I define it as an array in swapnetbsd.c, it would also need to be defined that way is sys/sys/systm.h, and then either systm.h would need to #include mount.h, or all of its users would need to do that.

So, which is more desirable?

        1. #include <mount.h> in systm.h?
        2. #include <mount.h> in all users of systm.h?
        3. Have my_vfs_name statically allocated in kern_subr.c, retain
           rootfstype as a simple pointer, and make rootfstype point to
           it if needed?

        if (strcmp(rootfstype, "?") != 0 &&
            (v = vfs_getopsbyname(rootfstype)) != NULL) {
                if (v->vfs_mountroot != NULL) {
                        error = (*(v->vfs_mountroot))();
                        vfs_delref(v);
                        goto done;
                } else {
                        vfs_delref(v);
                }
        }

I have just noticed a bug in the existing code. In setroot():

http://nxr.homeunix.org/source/xref/sys/kern/kern_subr.c#928

If vops->vfs_mountroot == NULL, it should do vfs_delref(vops) before
continuing on.

I've added the additional call to vfs_delref() as follows:

                        vops = vfs_getopsbyname(buf);
                        if (vops == NULL || vops->vfs_mountroot == NULL) {
                                printf("use one of: generic");
                                for (vops = LIST_FIRST(&vfs_list);
                                     vops != NULL;
                                     vops = LIST_NEXT(vops, vfs_list)) {
                                        if (vops->vfs_mountroot != NULL)
                                                printf(" %s", vops->vfs_name);
                                }
                                if (vops != NULL)
                                        vfs_delref(vops);
#if defined(DDB)
                                printf(" ddb");
#endif
                                printf(" halt reboot\n");
                        } else {


I'm going to add another test kernel to force me into the RB_ASKNAME parts of setroot() just to verify that that code path works.

----------------------------------------------------------------------
|   Paul Goyette   | PGP DSS Key fingerprint: |  E-mail addresses:   |
| Customer Service | FA29 0E3B 35AF E8AE 6651 |  paul%whooppee.com@localhost   |
| Network Engineer | 0786 F758 55DE 53BA 7731 | pgoyette%juniper.net@localhost |
----------------------------------------------------------------------


Home | Main Index | Thread Index | Old Index