PERFORCE change 103535 for review
Adam Martin
adamartin at FreeBSD.org
Wed Aug 9 22:14:39 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=103535
Change 103535 by adamartin at adamartin_hobbes on 2006/08/09 22:14:10
Implemented most of vfsops. Need to implement vfs_root, so that
we do not get panics on "lost mount". Also need to implement a few
vnops, and import my other work on the protocol handler.
Affected files ...
.. //depot/projects/soc2006/adamartin_autofs/autofs/Makefile#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/README#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs.c#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs.h#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_vfsops.c#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_vnops.c#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/cleanup.h#2 edit
.. //depot/projects/soc2006/adamartin_autofs/mount_autofs/mount_autofs.c#2 edit
Differences ...
==== //depot/projects/soc2006/adamartin_autofs/autofs/Makefile#2 (text+ko) ====
@@ -30,6 +30,16 @@
AUTOFS_FS_SOURCE=autofs_vnops.c autofs_vfsops.c vnode_if.h
AUTOFS_CORE_SOURCE=autofs.c protocol.c
SRCS=$(AUTOFS_CORE_SOURCE) $(AUTOFS_FS_SOURCE) $(AUTOFS_DEV_SOURCE)
+HEADERS=autofs.h cleanup.h protocol.h
KMOD=autofs
+autofs.c: $(HEADERS)
+
+autofs_vfsops.c: $(HEADERS)
+
+autofs_vnops.c: $(HEADERS)
+
+autofs_ctl.c: $(HEADERS)
+
+
.include <bsd.kmod.mk>
==== //depot/projects/soc2006/adamartin_autofs/autofs/README#2 (text+ko) ====
@@ -1,0 +1,2 @@
+FreeBSD Autofs is written by ADAM David Alan Martin, for Google
+Summer of Code, 2006.
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs.c#2 (text+ko) ====
@@ -44,7 +44,10 @@
#include <machine/setjmp.h>
#include "cleanup.h"
+#include <sys/param.h>
+#include <sys/vnode.h>
+
#define AUTOFS_CTL_DEV_NAME "autofs_ctl"
@@ -108,4 +111,29 @@
return( err );
}
+
+int
+vn_iscdev(struct vnode *vp, int *errp)
+{
+ int error = 0;
+
+ dev_lock();
+
+ if (vp->v_type != VCHR)
+ error = ENODEV;
+
+ #ifdef USE_EXTENDED_DEV_CHECK
+ else if (vp->v_rdev == NULL)
+ error = ENXIO;
+ else if (vp->v_rdev->si_devsw == NULL)
+ error = ENXIO;
+ #endif
+ dev_unlock();
+
+
+ if (errp != NULL)
+ *errp = error;
+ return (error == 0);
+}
+
DEV_MODULE( AutoFS, autofs_handle_loader, NULL );
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs.h#2 (text+ko) ====
@@ -31,25 +31,42 @@
#define __AUTOFS_MAIN_HEADER__
-#define USE_SETJMP_CLEANUP
-#define NO_USE_SETJMP_INCLUDE
-#define NO_CLEANUP_WARNING
+//#define USE_SETJMP_CLEANUP
+//#define NO_USE_SETJMP_INCLUDE
+//#define NO_CLEANUP_WARNING
#define KPRINTF( a, ... ) \
- printf( a, ## __VA_ARGS__ );\
- uprintf( a, ## __VA_ARGS__ );
+ do {\
+ printf( a, ## __VA_ARGS__ );\
+ uprintf( a, ## __VA_ARGS__ );\
+ } while( 0 )
+
+
+
+#ifndef DEBUG_LEVEL
+#define DEBUG_LEVEL 8
+#endif /** DEBUG_LEVEL **/
+
+#define DEBUG_L( level ) if( DEBUG_LEVEL >= level )
+#define DEBUG DEBUG8
-#define DEBUGGING_ON 1
+#define DEBUG1 DEBUG_L( 1 )
+#define DEBUG2 DEBUG_L( 2 )
+#define DEBUG3 DEBUG_L( 3 )
+#define DEBUG4 DEBUG_L( 4 )
+#define DEBUG5 DEBUG_L( 5 )
+#define DEBUG6 DEBUG_L( 6 )
+#define DEBUG7 DEBUG_L( 7 )
+#define DEBUG8 DEBUG_L( 8 )
-#define DEBUG if( DEBUGGING_ON )
#define STOR_NAME_MAX 64
-#define MNT_TARGET ( "target" )
+#define MNT_TARGET ( "fspath" )
#define MNT_DEVICE ( "from" )
@@ -68,10 +85,15 @@
struct cdev *ctrl_dev;
};
+#define entity( member, value )\
+ .member = value
+
#define VFSTOAUTOFS(mp) ((struct autofs_mount *)((mp)->mnt_data))
+int vn_iscdev( struct vnode *vp, int *errp );
+
//extern struct vop_vector autofs_vnodeops;
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_vfsops.c#2 (text+ko) ====
@@ -55,55 +55,106 @@
-MALLOC_DEFINE( M_AUTOFS_MOUNTBUF, "AutoFS mntbuf", "AutoFS mountpoint data, to simulate filesystem contents." );
+
+
+MALLOC_DEFINE(M_AUTOFS_MOUNTBUF, "AutoFS mntbuf", "AutoFS mountpoint data, to simulate filesystem contents.");
static int
-autofs_mount( struct mount *mp, struct thread *td )
+autofs_mount(struct mount *mp, struct thread *td)
{
- $cleanup_init;
+ $cleanup_init_size(8);
int error = 0;
struct vnode *devvp;
- //struct autofs_mount *a_mnt;
+ struct autofs_mount *a_mnt;
struct nameidata ndp;
/* Mount point path and length */
char *m_dev;
+ devvp= NULL;
+ DEBUG KPRINTF("Now mounting autofs...\n");
/* Update and rootfs are not allowed. */
- if ((mp->mnt_flag & (MNT_ROOTFS | MNT_UPDATE)) != 0)
+ if ((mp->mnt_flag & (MNT_UPDATE)) != 0) {
+ DEBUG KPRINTF("Failed update\n");
+ $return (EOPNOTSUPP);
+ }
+ if ((mp->mnt_flag & (MNT_ROOTFS)) != 0) {
+ DEBUG KPRINTF("Failed autofs\n");
$return (EOPNOTSUPP);
+ }
+
/* Get the mount device (which is the autofs ctl point) */
m_dev = vfs_getopts(mp->mnt_optnew, MNT_DEVICE, &error);
- if (error != 0)
+ if (error != 0) {
+ DEBUG KPRINTF("Failed in mount options\n");
$return (error);
+ }
/* check that the device is a real device, and an autofs ctl point */
+ DEBUG KPRINTF("Now going to lookup devvp...\n");
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, m_dev, td);
- if ((error = namei(&ndp)) != 0)
+ DEBUG KPRINTF("NDINIT done...\n");
+ if ((error = namei(&ndp)) != 0) {
+ DEBUG KPRINTF("namei failed\n");
$return (error);
+ }
+
+ DEBUG KPRINTF("device mounting from %s\n", ndp.ni_dirp);
+
NDFREE(&ndp, NDF_ONLY_PNBUF);
+ DEBUG KPRINTF("NDFREE done...\n" );
+
devvp = ndp.ni_vp;
+ DEBUG KPRINTF("Devvp path is looked up...\n");
- $cleanup( vrele(devvp); );
-
+ $cleanup(
+ DEBUG KPRINTF("running vrele...\n");
+ vrele(devvp);
+ DEBUG KPRINTF("vrele done...\n");
+ );
- if (vn_isdisk(devvp, &error)){
+ DEBUG KPRINTF("Done looking up devvp...\n");
+
+ if (!vn_iscdev(devvp, &error)){
+ DEBUG KPRINTF("Device type check failed...\n"
+ "error: %d\n", error );
$return (error);
}
+
+ DEBUG KPRINTF("Making autofs mount structure...");
+ a_mnt = (struct autofs_mount *) malloc(sizeof(struct autofs_mount),
+ M_AUTOFS_MOUNTBUF, M_WAITOK);
+ DEBUG KPRINTF("Done\n");
+
+ DEBUG KPRINTF("Getting newfsid...");
+ vfs_getnewfsid(mp);
+ DEBUG KPRINTF("Done\n");
+
+ DEBUG KPRINTF("Setting vfs_mountedfrom...");
+ vfs_mountedfrom(mp, "autofs");
+ DEBUG KPRINTF("Done\n");
+
+
+ //DEBUG $return (EOPNOTSUPP);
+
+ $cleanup(
+ DEBUG KPRINTF("Mount done -- error = %d...\n", error);
+ );
+ DEBUG KPRINTF("Leaving mount, invoking cleanups -- error = %d...\n",
+ error);
$return (error);
-
}
static int
autofs_unmount(struct mount *mp, int mntflags, struct thread *td)
{
$cleanup_init;
- void *mntdata;
+ //void *mntdata;
int error = 0;
int flags = 0;
@@ -114,10 +165,14 @@
if((error = vflush(mp, 0, flags, td)))
$return (error);
- vinvalbuf( mp->mnt_data->
+ //vinvalbuf( mp->mnt_data->
+
+ $return (error);
+}
static struct vfsops autofs_vfsops = {
- .vfs_mount = autofs_mount,
+ entity(vfs_mount, autofs_mount),
+ entity(vfs_unmount, autofs_unmount),
};
VFS_SET(autofs_vfsops, autofs, 0);
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_vnops.c#2 (text+ko) ====
@@ -26,3 +26,32 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/fcntl.h>
+#include <sys/stat.h>
+#include <sys/kernel.h>
+#include <sys/vnode.h>
+#include <sys/mount.h>
+#include <sys/namei.h>
+#include <sys/malloc.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
+#include <sys/lock.h>
+#include <sys/sysctl.h>
+#include <sys/unistd.h>
+#include <sys/acl.h>
+#include <sys/event.h>
+#include <sys/extattr.h>
+#include <sys/mac.h>
+
+#include "autofs.h"
+#include "cleanup.h"
+//#include "protocol.h"
+
+
+
+struct vop_vector autofs_vnodeops ={
+
+};
==== //depot/projects/soc2006/adamartin_autofs/autofs/cleanup.h#2 (text+ko) ====
@@ -70,7 +70,7 @@
#if defined( __GNUC__ ) && !defined( USE_SETJMP_CLEANUP )
-typedef void (*__cleanup_ptr)();
+typedef void (*__cleanup_ptr)( void );
typedef void *___generic___;
@@ -85,7 +85,7 @@
#define REGISTER_ACTION( actions ) _REGISTER_ACTION( LN, actions )
#define _REGISTER_ACTION( name, actions ) \
- void ___cleanup_action_( name ) ()\
+ static void ___cleanup_action_( name ) ( void )\
{\
actions\
}\
@@ -172,6 +172,13 @@
[ __CLEANUP_STACK_MAX__ ];\
__VOLATILE_IMPLEMENTATION__ int __CLEANUP_STACK_POINTER__= 0
+
+#define CLEANUP_STACK_SIZE( size )\
+ ___CLEANUP_STACK_EXTRAS___\
+ __VOLATILE_IMPLEMENTATION__ __cleanup_ptr ___CLEANUP_STACK \
+ [ size ];\
+ __VOLATILE_IMPLEMENTATION__ int __CLEANUP_STACK_POINTER__= 0
+
/** Use REGISTER_CLEANUP_LOCAL *** XXX BEFORE XXX *** you register an action
to use that local with. It's just a void *. You must re-cast it to what is
useful to you. **/
@@ -188,6 +195,7 @@
#define $cleanup_init CLEANUP_STACK
+#define $cleanup_init_size( a ) CLEANUP_STACK_SIZE( a )
#define $cleanup( a ) REGISTER_ACTION( a )
#define $return leave
==== //depot/projects/soc2006/adamartin_autofs/mount_autofs/mount_autofs.c#2 (text+ko) ====
@@ -60,7 +60,7 @@
#define FSTYPE "autofs"
#define FSTYPE_HANDLE "fstype"
-#define SOURCE "source"
+#define SOURCE "fspath"
#define TARGET "from"
@@ -82,40 +82,33 @@
char source[MAXPATHLEN];
char target[MAXPATHLEN];
- mntflags = 0;
- while ((ch = getopt(argc, argv, "o:")) != -1)
- switch(ch) {
- case 'o':
- getmntopts(optarg, mopts, &mntflags, 0);
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
- if (argc != 2)
+ if (argc != 3)
usage();
/* resolve target and source with realpath(3) */
- (void)checkpath(argv[0], target);
- (void)checkpath(argv[1], source);
+ //(void)checkpath(argv[0], target);
+ fprintf(stderr, "argv[ 1 ]= %s, argv[ 2 ]= %s\n",
+ argv[ 1 ], argv[ 2 ] );
+ strcpy(target, argv[1]);
+ (void)checkpath(argv[2], source);
iov[0].iov_base = FSTYPE_HANDLE;
- iov[0].iov_len = sizeof(FSTYPE_HANDLE);
+ iov[0].iov_len = strlen(FSTYPE_HANDLE) + 1;
iov[1].iov_base = FSTYPE;
iov[1].iov_len = strlen(iov[1].iov_base) + 1;
+
iov[2].iov_base = SOURCE;
- iov[2].iov_len = sizeof(SOURCE);
+ iov[2].iov_len = strlen(SOURCE) + 1;
iov[3].iov_base = source;
iov[3].iov_len = strlen(source) + 1;
+
iov[4].iov_base = TARGET;
- iov[4].iov_len = sizeof(TARGET);
+ iov[4].iov_len = strlen(TARGET) + 1;
iov[5].iov_base = target;
iov[5].iov_len = strlen(target) + 1;
- if (nmount(iov, 6, mntflags))
+ if (nmount(iov, 6, MNT_RDONLY))
err(1, NULL);
exit(0);
}
More information about the p4-projects
mailing list