PERFORCE change 104455 for review
Adam Martin
adamartin at FreeBSD.org
Fri Aug 18 00:12:56 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=104455
Change 104455 by adamartin at adamartin_hobbes on 2006/08/18 00:12:18
Moved to Pseudofs for basis of autofs core. Autofs_ctl device has
ioctl implemented partially for creation of new autofs devices.
Affected files ...
.. //depot/projects/soc2006/adamartin_autofs/autofs/Makefile#3 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs.c#3 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs.h#3 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_ctl.c#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_pfsops.c#1 add
.. //depot/projects/soc2006/adamartin_autofs/autofs/autofs_vfsops.c#3 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/cleanup.h#3 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/protocol.c#2 edit
.. //depot/projects/soc2006/adamartin_autofs/autofs/protocol.h#2 edit
Differences ...
==== //depot/projects/soc2006/adamartin_autofs/autofs/Makefile#3 (text+ko) ====
@@ -27,7 +27,7 @@
AUTOFS_DEV_SOURCE=autofs_ctl.c autofs_dev.c
-AUTOFS_FS_SOURCE=autofs_vnops.c autofs_vfsops.c vnode_if.h
+AUTOFS_FS_SOURCE=autofs_pfsops.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
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs.c#3 (text+ko) ====
@@ -29,7 +29,6 @@
-#include <autofs.h>
#include <sys/types.h>
#include <sys/module.h>
@@ -48,23 +47,17 @@
#include <sys/vnode.h>
-#define AUTOFS_CTL_DEV_NAME "autofs_ctl"
+#include "autofs.h"
+#include "autofs_ctl.h"
+
+
-static struct cdevsw autofs_ctl_devops = {
- .d_version= D_VERSION,
- .d_open= NULL,
- .d_close= NULL,
- .d_read= NULL,
- .d_write= NULL,
- .d_name= AUTOFS_CTL_DEV_NAME,
-};
/** There's no more block devices, so all are cdevs, as c represents char
in cdev **/
-static struct cdev *autofs_ctl_dev;
@@ -72,17 +65,21 @@
autofs_handle_loader( struct module *mod, int action, void *args )
{
int err= 0;
- switch( action )
- {
+ switch (action) {
case MOD_LOAD:
- KPRINTF( "Now loading AutoFS module: \n" );
- autofs_ctl_dev= make_dev( &autofs_ctl_devops,
+ KPRINTF("Now loading AutoFS module: \n");
+ autofs_ctl_dev = make_dev(&autofs_ctl_devops,
00,
UID_ROOT,
GID_WHEEL,
0600,
- AUTOFS_CTL_DEV_NAME );
- KPRINTF( "AutoFS module successfully loaded.\n" );
+ AUTOFS_CTL_DEV_NAME);
+ DEBUG KPRINTF(".");
+ autofs_ctl_state = (struct autofs_ctl_state)
+ malloc(
+ sizeof(struct autofs_ctl_state),
+ M_AUTOFS_CTL_NODES, M_WAITOK);
+ KPRINTF("AutoFS module successfully loaded.\n");
break;
case MOD_QUIESCE:
@@ -96,6 +93,7 @@
case MOD_UNLOAD:
destroy_dev( autofs_ctl_dev );
+ free(autofs_ctl_state, M_AUTOFS_CTL_NODES);
KPRINTF( "AutoFS unloaded.\n" );
break;
@@ -112,6 +110,9 @@
}
+
+int vn_iscdev(struct vnode *vp, int *errp);
+
int
vn_iscdev(struct vnode *vp, int *errp)
{
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs.h#3 (text+ko) ====
@@ -31,6 +31,9 @@
#define __AUTOFS_MAIN_HEADER__
+#define AUTOFS_VERSION ( 1 )
+
+
//#define USE_SETJMP_CLEANUP
//#define NO_USE_SETJMP_INCLUDE
//#define NO_CLEANUP_WARNING
@@ -50,7 +53,7 @@
#define DEBUG_L( level ) if( DEBUG_LEVEL >= level )
-#define DEBUG DEBUG8
+#define DEBUG DEBUG5
#define DEBUG1 DEBUG_L( 1 )
#define DEBUG2 DEBUG_L( 2 )
@@ -63,38 +66,16 @@
-#define STOR_NAME_MAX 64
-
#define MNT_TARGET ( "fspath" )
#define MNT_DEVICE ( "from" )
-typedef struct _autofs_storage_unit {
- char name [ STOR_NAME_MAX ];
- struct _autofs_storage_unit *next;
-} autofs_storage_unit;
-
-
-struct autofs_mount {
- struct autofs_ctrl *ctrl;
- autofs_storage_unit contents;
- struct vnode *afsm_devvp;
- 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;
-
#endif /*** __AUTOFS_MAIN_HEADER__ ***/
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_ctl.c#2 (text+ko) ====
@@ -27,4 +27,82 @@
*
*/
+#include <sys/types.h>
+#include <sys/module.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/conf.h>
+#include <sys/uio.h>
+#include <sys/malloc.h>
+
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+
+#include "autofs.h"
+#include "autofs_ctl.h"
+#include "cleanup.h"
+
+struct cdev *autofs_ctl_dev;
+
+static d_ioctl_t autofs_ctl_ioctl;
+
+struct cdevsw autofs_ctl_devops = {
+ .d_version= D_VERSION,
+ .d_open= NULL,
+ .d_close= NULL,
+ .d_read= NULL,
+ .d_write= NULL,
+ .d_name= AUTOFS_CTL_DEV_NAME,
+ .d_ioctl= autofs_ctl_ioctl,
+};
+
+
+
+struct autofs_ctl_state autofs_ctl_state;
+/*
+ * We only handle the IOCTLS for create and destroy autofs_dev instances.
+ * Autofs devs are addressed by number. Creation always assigns a new,
+ * per-mount unique number. (This number can be recycled, if it's freed
+ * by delete.)
+ *
+ * Autofs_ctl will return the assigned number, via the ioctl arg 1
+ * value, unless an error occurs.
+ */
+
+
+static int
+autofs_ctl_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg_c, int mode,
+ struct thread *td)
+{
+ $cleanup_init_size( 8 );
+ int error= 0;
+ int *arg= (int *) arg_c;
+
+ switch( cmd ) {
+ case AFSIOCREATDEV:
+ mtx_lock(&autofs_ctl_state.lock);
+ $cleanup(
+ mtx_unlock(&autofs_ctl_state.lock);
+ )
+
+ arg= autofs_ctl_state.next_assignable_node++;
+ error= create_autofs_node(arg);
+
+ $do_cleanup;
+
+ break;
+
+ default:
+ /* NOTREACHED */
+
+ /*
+ * In theory, but could be reached when someone sends
+ * a bad IOCTL code...
+ */
+ error= EIO;
+
+}
==== //depot/projects/soc2006/adamartin_autofs/autofs/autofs_vfsops.c#3 (text+ko) ====
@@ -54,7 +54,15 @@
#include "cleanup.h"
+static vfs_mount_t autofs_mount;
+static vfs_root_t autofs_root;
+static vfs_unmount_t autofs_unmount;
+static struct vfsops autofs_vfsops = {
+ entity(vfs_mount, autofs_mount),
+ entity(vfs_unmount, autofs_unmount),
+ entity(vfs_root, autofs_root),
+};
MALLOC_DEFINE(M_AUTOFS_MOUNTBUF, "AutoFS mntbuf", "AutoFS mountpoint data, to simulate filesystem contents.");
@@ -68,6 +76,8 @@
struct vnode *devvp;
struct autofs_mount *a_mnt;
+ struct vnode *root_vp;
+
struct nameidata ndp;
/* Mount point path and length */
@@ -139,12 +149,17 @@
vfs_mountedfrom(mp, "autofs");
DEBUG KPRINTF("Done\n");
+ DEBUG KPRINTF("Setting up root vnode pointer...");
+ error = autofs_allocvp(
+
//DEBUG $return (EOPNOTSUPP);
$cleanup(
DEBUG KPRINTF("Mount done -- error = %d...\n", error);
);
+
+
DEBUG KPRINTF("Leaving mount, invoking cleanups -- error = %d...\n",
error);
$return (error);
@@ -170,9 +185,16 @@
$return (error);
}
-static struct vfsops autofs_vfsops = {
- entity(vfs_mount, autofs_mount),
- entity(vfs_unmount, autofs_unmount),
-};
+static int
+autofs_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
+{
+ struct vnode *vp;
+ vp= VFSTOAUTOFS(mp)->root_vnode;
+ VREF(vp);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
+
+ *vpp= vp;
+ return 0;
+}
VFS_SET(autofs_vfsops, autofs, 0);
==== //depot/projects/soc2006/adamartin_autofs/autofs/cleanup.h#3 (text+ko) ====
@@ -198,6 +198,8 @@
#define $cleanup_init_size( a ) CLEANUP_STACK_SIZE( a )
#define $cleanup( a ) REGISTER_ACTION( a )
+#define $do_cleanup CLEANUP_RESOURCES
+
#define $return leave
#define $cleanup_local GET_LOCAL()
==== //depot/projects/soc2006/adamartin_autofs/autofs/protocol.c#2 (text+ko) ====
@@ -26,3 +26,5 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
+
+#include "protocol.h"
==== //depot/projects/soc2006/adamartin_autofs/autofs/protocol.h#2 (text+ko) ====
@@ -25,9 +25,13 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- */#ifndef AUTOFS_PROTOCOL_HEADER
+ */
+
+#ifndef AUTOFS_PROTOCOL_HEADER
#define AUTOFS_PROTOCOL_HEADER
+#include <sys/types.h>
+
/*
* The protocol between AutoFS and Automounter consists of these data types,
* strung together, as explained below.
@@ -45,7 +49,7 @@
the message pertains to. */
uint32_t message_type; /* Used to identify which command is issued in
this packet. COMMAND_* constants are used to fill these */
- void message_data[]; /* The rest of the message data, as an
+ char message_data[]; /* The rest of the message data, as an
indeterminate length. */
};
@@ -213,7 +217,7 @@
struct modify_mounts_acknowledge {
uint32_t n_mounts; /* Number of entries that are in response */
- struct managed_mounts mounts[]; /* The mount entries, and correspondant
+ struct managed_mount mounts[]; /* The mount entries, and correspondant
status of action */
};
More information about the p4-projects
mailing list