Date: Sat, 14 Apr 2007 04:20:10 GMT From: Adam Martin <adamartin@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 118076 for review Message-ID: <200704140420.l3E4KA0a041861@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=118076 Change 118076 by adamartin@adamartin_hobbes on 2007/04/14 04:19:21 Checkin of changes before scheduled outage. (fixes to many crash conditions.) Affected files ... .. //depot/projects/soc2006/adamartin_autofs/autofs/Makefile#9 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/autofs.c#10 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_ctl.c#11 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_dev.c#10 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_dev.h#8 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_tfsinit.c#2 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_tfsops.c#5 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/debug.h#2 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/protocol.c#10 edit .. //depot/projects/soc2006/adamartin_autofs/autofs/protocol.h#9 edit .. //depot/projects/soc2006/adamartin_autofs/templatefs/templatefs.h#4 edit .. //depot/projects/soc2006/adamartin_autofs/templatefs/templatefs_vnops.c#3 edit Differences ... ==== //depot/projects/soc2006/adamartin_autofs/autofs/Makefile#9 (text+ko) ==== @@ -28,9 +28,11 @@ AUTOFS_DEV_SOURCE=autofs_ctl.c autofs_dev.c AUTOFS_FS_SOURCE=autofs_tfsops.c autofs_tfsinit.c vnode_if.h -AUTOFS_CORE_SOURCE=autofs.c protocol.c +AUTOFS_CORE_SOURCE=autofs.c +AUTOFS_PROTOCOL_SOURCE=protocol.c AUTOFS_SUPPORT_SOURCE=autofs_subr.c -SRCS=$(AUTOFS_CORE_SOURCE) $(AUTOFS_FS_SOURCE) $(AUTOFS_DEV_SOURCE) $(AUTOFS_SUPPORT_SOURCE) +SRCS=$(AUTOFS_CORE_SOURCE) $(AUTOFS_FS_SOURCE) $(AUTOFS_DEV_SOURCE) $(AUTOFS_SUPPORT_SOURCE) $(AUTOFS_PROTOCOL_SOURCE) +#SRCS=$(AUTOFS_CORE_SOURCE) $(AUTOFS_PROTOCOL_SOURCE) $(AUTOFS_SUPPORT_SOURCE) $(AUTOFS_DEV_SOURCE) HEADERS=autofs.h cleanup.h protocol.h autofs_subr.h autofs_ctl.h autofs_dev.h debug.h KMOD=autofs ==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs.c#10 (text+ko) ==== @@ -53,10 +53,13 @@ #include "debug.h" +#define PUBLIC_LOADER static +PUBLIC_LOADER int autofs_handle_loader( + struct module *mod, int action, void *args ); -static int +PUBLIC_LOADER int autofs_handle_loader( struct module *mod, int action, void *args ) { int err; @@ -73,6 +76,8 @@ GID_WHEEL, 0600, AUTOFS_CTL_DEV_NAME ); + + dev_depends( autofs_ctl_dev, autofs_ctl_dev ); DEBUG EPRINTF( "." ); autofs_ctl_init(); DEBUG EPRINTF( "." ); @@ -85,16 +90,17 @@ * Find out what we should do for QUIESCE option? * */ + + //cleanup_autofs(); + //free( autofs_ctl_state, M_AUTOFS_CTL_NODES ); + destroy_dev( autofs_ctl_dev ); EPRINTF( "AutoFS quiesced.\n" ); return 0; break; case MOD_UNLOAD: - //cleanup_autofs(); - destroy_dev( autofs_ctl_dev ); - //free( autofs_ctl_state, M_AUTOFS_CTL_NODES ); - EPRINTF( "AutoFS unloaded.\n" ); + printf( "AutoFS unloaded.\n" ); break; default: ==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_ctl.c#11 (text+ko) ==== @@ -40,6 +40,8 @@ #include <sys/lock.h> #include <sys/mutex.h> +#include <sys/stat.h> + //#include <machine/setjmp.h> //#include "cleanup.h"> @@ -53,6 +55,14 @@ #define AUTOFS_NAME "autofs_dev" + +#define AUTOFS_DEV_PERMS ( \ + ( ( S_IRUSR ) | ( S_IWUSR ) ) \ + | \ + ( ( S_IRGRP ) | ( S_IWGRP ) ) \ + ) + + struct cdev *autofs_ctl_dev; struct autofs_ctl_state autofs_ctl_state; @@ -76,7 +86,7 @@ .d_close= autofs_dev_close, .d_read= autofs_dev_read, .d_write= autofs_dev_write, - .d_poll= autofs_dev_poll, + //.d_poll= autofs_dev_poll, .d_version= D_VERSION, .d_name= AUTOFS_NAME, }; @@ -121,7 +131,7 @@ { $cleanup_init; - int error; + int error; struct cdevsw *devsw; struct cdev *device; struct autofs_dev_bufs *buffers; @@ -129,9 +139,15 @@ struct tfs_info *ti; struct autofs_protocol_state *prot_state; - error= 0; + error= 0; + + ti= NULL; + - instance_p= NULL; + /* + * TODO: return instance via instance_p. For now we leak... + */ + instance_p= NULL; /* * Allocate all autofs buffers, and setup a new TemplateFS instance. @@ -157,9 +173,7 @@ { $return ( error ); } -# if 0 - $cleanup( tfs_destroy_instance( ti );); -# endif + // $cleanup( tfs_destroy_instance( ti ); ); /* * Associate TemplateFS data structures together @@ -167,20 +181,20 @@ - prot_state->message= NULL; - prot_state->current_state= PROTOCOL_WAITING; - prot_state->bytes_read= 0; + prot_state->message= NULL; + prot_state->current_state= PROTOCOL_WAITING; + prot_state->bytes_read= 0; - buffers->input= autofs_queue_init(); - buffers->output= autofs_queue_init(); - buffers->instances= 0; + buffers->input= autofs_queue_init(); + buffers->output= autofs_queue_init(); + buffers->instances= 0; /* * Make the device, and lock it. */ - device= make_dev( devsw, num, UID_ROOT, GID_WHEEL, 0600, + device= make_dev( devsw, num, UID_ROOT, GID_WHEEL, AUTOFS_DEV_PERMS, AUTOFS_DEV_FORMAT"%d", num ); /* Possible race? Locking the device? */ @@ -192,11 +206,12 @@ { panic( "Bad device in %s:%d\n", __FILE__, __LINE__ ); } - prot_state->instance= instance; - buffers->this_instance= instance; - ti->ti_priv= (void *) instance; - device->si_priv= (struct cdev_priv *) instance; - instance->templatefs_info= ti; + prot_state->instance= instance; + buffers->this_instance= instance; + ti->ti_priv= (void *) instance; + device->si_priv= (struct cdev_priv *) instance; + instance->templatefs_info= ti; + instance->dev_buffers= buffers; /* * Don't deallocate the resources -- ==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_dev.c#10 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2006 + * Copyright (c) 2006,2007 * Adam Martin, Erez Zadok. All rights reserved. * * This code is derived from software in FreeBSD, and 4.4BSD. @@ -48,8 +48,21 @@ #include "autofs_dev.h" #include "autofs_subr.h" +#include <sys/time.h> + #define AUTOFS_IO_BUF_SIZE ( 4096 ) +#define LONG_TIMEOUT_SECONDS ( 10 ) +#define TIMEOUT_MICROSECONDS ( 50000 ) + +static struct timeval __LONG_TIMEOUT_SECONDS= +{ + .tv_sec= 0, + .tv_usec= TIMEOUT_MICROSECONDS, +}; + +#define LONG_TIMEOUT ( tvtohz( &__LONG_TIMEOUT_SECONDS ) ) + struct uio *in_buffer, *out_buffer; @@ -72,15 +85,19 @@ error= 0; + DEBUG printf( "Trying to open AutoFS device...\n" ); + instance= AUTOFS_GET_INSTANCE( DEV, dev ); buffers= AUTOFS_GET_BUFFERS( DEV, dev ); inst_p= &( buffers->instances ); + DEBUG printf( "AutoFS Device instances: %d\n", *inst_p ); + if( *inst_p == 0 ) { ( *inst_p )++; } else { - DEBUG EPRINTF( "Tried to open the autofs device \"%s\" " + DEBUG printf( "Tried to open the autofs device \"%s\" " "multiple times!\n", dev->si_devsw->d_name ); error= ENXIO; } @@ -105,7 +122,7 @@ if( *inst_p == 0 ) { - DEBUG EPRINTF( "Tried to close device: \"%s\", beyond natural " + DEBUG printf( "Tried to close device: \"%s\", beyond natural " "close minimum!\n", dev->si_devsw->d_name ); error= EDOOFUS; } @@ -131,6 +148,9 @@ int amt; int error; unsigned char out_buf[ AUTOFS_IO_BUF_SIZE ]; /* No more than a page! */ + int sleepstat; + + DEBUG7 printf( "Entered autofs_dev_read\n" ); error= 0; amt= MIN( uio->uio_resid, AUTOFS_IO_BUF_SIZE ); @@ -142,11 +162,42 @@ do { remains= autofs_queue_remaining( q ); + DEBUG7 printf( "Got %d remaining bytes...\n", remains ); /* * We really should do SOME kind of sleep. This is * more a spinlock * right now. */ + + if( remains != 0 ) break; + sleepstat= tsleep( q, PCATCH, "BAFS", LONG_TIMEOUT ); + + switch( sleepstat ) + { + case EWOULDBLOCK: + SKIP DEBUG printf( "Blocking more.\n" ); + break; + + + case ERESTART: + DEBUG_L(17) printf( "restart system call?\n" ); + + return ERESTART; + break; + + case EINTR: + DEBUG_L(17) printf( "Interrupted... die?\n" ); + + return EINTR; + break; + + + default: + /** NOTREACHED **/ + DEBUG0 printf( "Unknown sleepstatus!\n" ); + break; + } + } while( remains == 0 ); /** FIXME: Shouldn't this be == **/ ==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_dev.h#8 (text+ko) ==== ==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_tfsinit.c#2 (text+ko) ==== @@ -27,6 +27,8 @@ * */ +#define FIXED_VFS_SET_BUG + #include "autofs.h" #include <sys/cdefs.h> #include <sys/types.h> @@ -72,6 +74,8 @@ struct tfs_node *foo; +void null_wrapper______( void ); + static struct tfs_info * autofs_mount_handler( TFS_MOUNT_HANDLER_ARGS ) @@ -130,12 +134,16 @@ ti->ti_priv= AUTOFS_GET_INSTANCE( DEV, dev ); + strlcpy( ti->ti_name, dev_name, TFS_FSNAMELEN ); + DEBUG3 EPRINTF( "Making a fake node: %p is the parent (root) node", ti->ti_root ); foo= tfs_create_dir( ti->ti_root, "foo", autofs_attr, autofs_vis, 0 ); foo->tn_lookup= autofs_lookup; + vput( devvp ); + DEBUG3 EPRINTF( "leaving autofs_mount\n" ); return ti; } @@ -180,8 +188,8 @@ /** Make some fake files... Could be that these are killing us? **/ - foo= tfs_create_dir( ti->ti_root, "foo", autofs_attr, autofs_vis, 0 ); - foo->tn_lookup= autofs_lookup; + //foo= tfs_create_dir( ti->ti_root, "foo", autofs_attr, autofs_vis, 0 ); + //foo->tn_lookup= autofs_lookup; return 0; } @@ -192,5 +200,19 @@ return 0; } +#ifndef FIXED_VFS_SET_BUG +#undef VFS_SET +#define VFS_SET( a, b, c ) +#endif TEMPLATEFS( autofs, AUTOFS_VERSION, autofs_mount_handler ); + +#ifndef FIXED_VFS_SET_BUG +void null_wrapper______() +{ + autofs_mount_handler( NULL, NULL, NULL ); + autofs_init( NULL, NULL ); + autofs_uninit( NULL, NULL ); + autofs_vfsops= autofs_vfsops; +} +#endif ==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_tfsops.c#5 (text+ko) ==== @@ -68,6 +68,9 @@ #include "autofs_templatefs.h" +#define DOTDOT_CHECKER_SHORTCUT SKIP + + int autofs_vis( TFS_VIS_ARGS ) { @@ -118,6 +121,11 @@ instance= AUTOFS_GET_INSTANCE( ROOT, ti ); buffers= AUTOFS_GET_BUFFERS( ROOT, ti ); + if( buffers == NULL ) + { + panic( "Buffers shouldn't be null!" ); + } + DEBUG7 EPRINTF( "cn_nameptr= %s, cn_pnbuf= %s\n", c.cn_nameptr, c.cn_pnbuf ); DEBUG7 EPRINTF( "cn_namelen= %ld, cn_consume= %ld\n", c.cn_namelen, @@ -126,14 +134,15 @@ /* Prepare a mount message */ msg.flags= 0; msg.transaction_id= generate_tid(); + msg.reserved= 0; msg.message_type= COMMAND_MOUNT_REQUEST; - msg.message_data= (char *) &mr; + //msg.message_data= (char *) &mr; mr.action= ACTION_MOUNT; mr.mountpoint_len= c.cn_namelen; strlcpy( mr.mountpoint, c.cn_nameptr, c.cn_namelen ); - if( strcmp( mr.mountpoint, ".." ) ) + DOTDOT_CHECKER_SHORTCUT if( strcmp( mr.mountpoint, ".." ) ) { return 0; } @@ -142,6 +151,7 @@ //if( take_autofs_lock( instance, node ) ) //{ + DEBUG7 EPRINTF( "Passing protocol message: %p\n", &msg ); send_mount_request( &msg, buffers ); //} ==== //depot/projects/soc2006/adamartin_autofs/autofs/debug.h#2 (text+ko) ==== @@ -125,12 +125,24 @@ #else /*** FREEBSD_SYS ***/ -#define EPRINTF( a, ... ) \ - do\ - {\ - printf( a, ## __VA_ARGS__ );\ - uprintf( a, ## __VA_ARGS__ );\ - } while( 0 ) + +#include <sys/param.h> +#include <sys/lock.h> +#include <sys/mutex.h> + + +#define EPRINTF( a, ... ) \ + \ + do \ + { \ + printf( a, ## __VA_ARGS__ ); \ + SKIP if( mtx_trylock( &Giant ) ) \ + { \ + mtx_unlock( &Giant ); \ + uprintf( a, ## __VA_ARGS__ ); \ + } \ + } while( 0 ) \ + #endif /*** FREEBSD_SYS ***/ ==== //depot/projects/soc2006/adamartin_autofs/autofs/protocol.c#10 (text+ko) ==== @@ -106,7 +106,7 @@ int cnt; error= 0; - cnt=0; + cnt= 0; instance= AUTOFS_GET_INSTANCE( PROTOCOL, protocol ); @@ -261,8 +261,18 @@ struct mount_request *mb; queue *out_buffer; + DEBUG7 EPRINTF( "Sending Mount request...\n" ); + DEBUG7 EPRINTF( "Given request buffer pointer: %p\n", req ); out_buffer= buffers->output; - mb= (struct mount_request *) req->message_data; + mb= (struct mount_request *) ( *( + (struct mount_request **) + ( ( (unsigned char *) &req ) + sizeof( + struct message_header ) ) ) ) ; + + DEBUG7 EPRINTF( "Mount output buffer %p, request buffer %p\n", + out_buffer, mb ); + + return 0; write_buffer( out_buffer, (void *) req, sizeof( struct message_header ) ); @@ -271,6 +281,7 @@ write_buffer( out_buffer, (void *) mb->mountpoint, mb->mountpoint_len ); + DEBUG7 EPRINTF( "Done with mount request write\n" ); return 0; } ==== //depot/projects/soc2006/adamartin_autofs/autofs/protocol.h#9 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2006 + * Copyright (c) 2006,2007 * Adam Martin, Erez Zadok. All rights reserved. * * This code is derived from software in FreeBSD, and 4.4BSD. @@ -47,10 +47,17 @@ uint64_t flags; /* flags, for some usage, yet to be determined. */ uint64_t transaction_id; /* Used to identify which transaction the message pertains to. */ + + uint32_t reserved; /* Reserved for future use (Padding for now, + keep at 0) */ uint32_t message_type; /* Used to identify which command is issued in this packet. COMMAND_* constants are used to fill these */ + +# ifdef AUTOFS_USE_VARIABLE_LENGTH_TERMINATORS void *message_data; /* The rest of the message data, as an indeterminate length. */ + +# endif /*** AUTOFS_USE_VARIABLE_LENGTH_TERMINATORS ***/ }; ==== //depot/projects/soc2006/adamartin_autofs/templatefs/templatefs.h#4 (text+ko) ==== @@ -315,6 +315,7 @@ \ static int \ _##name##_init(struct vfsconf *vfc) { \ + printf( "Initing Templatefs..." ); \ /*return tfs_init(&name##_info, vfc);*/ \ return 0; \ } \ @@ -332,9 +333,9 @@ .vfs_uninit = _##name##_uninit, \ .vfs_unmount = tfs_unmount, \ }; \ -VFS_SET(name##_vfsops, name, VFCF_SYNTHETIC); \ -MODULE_VERSION(name, version); \ -MODULE_DEPEND(name, templatefs, 1, 1, 1); +VFS_SET(name##_vfsops, name, VFCF_SYNTHETIC | VFCF_READONLY); \ + +//MODULE_DEPEND(name, templatefs, 1, 1, 1); #endif ==== //depot/projects/soc2006/adamartin_autofs/templatefs/templatefs_vnops.c#3 (text+ko) ==== @@ -459,6 +459,7 @@ TFS_RETURN (td->tn_lookup(curthread, pfind(pid), td, cnp)); #else td->tn_lookup(curthread, pfind(pid), td, cnp); + printf( "tn_lookup returned\n" ); #endif } /**/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704140420.l3E4KA0a041861>