build & send implemented operations list to kernel

This commit is contained in:
pooka 2006-12-01 12:38:11 +00:00
parent 74baaf5c7d
commit 465f49d71b

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs.c,v 1.9 2006/11/30 05:37:48 pooka Exp $ */
/* $NetBSD: puffs.c,v 1.10 2006/12/01 12:38:11 pooka Exp $ */
/*
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if !defined(lint)
__RCSID("$NetBSD: puffs.c,v 1.9 2006/11/30 05:37:48 pooka Exp $");
__RCSID("$NetBSD: puffs.c,v 1.10 2006/12/01 12:38:11 pooka Exp $");
#endif /* !lint */
#include <sys/param.h>
@ -53,6 +53,54 @@ __RCSID("$NetBSD: puffs.c,v 1.9 2006/11/30 05:37:48 pooka Exp $");
static int puffcall(struct puffs_usermount *, struct puffs_req *);
#define FILLOP(lower, upper) \
do { \
if (pvn->puffs_##lower) \
opmask[PUFFS_VN_##upper] = 1; \
} while (/*CONSTCOND*/0)
static void
fillvnopmask(struct puffs_vnops *pvn, uint8_t *opmask)
{
memset(opmask, 0, PUFFS_VN_MAX);
FILLOP(create, CREATE);
FILLOP(mknod, MKNOD);
FILLOP(open, OPEN);
FILLOP(close, CLOSE);
FILLOP(access, ACCESS);
FILLOP(getattr, GETATTR);
FILLOP(setattr, SETATTR);
FILLOP(poll, POLL); /* XXX: not ready in kernel */
FILLOP(revoke, REVOKE);
FILLOP(mmap, MMAP); /* XXX: not called currently */
FILLOP(fsync, FSYNC);
FILLOP(seek, SEEK);
FILLOP(remove, REMOVE);
FILLOP(link, LINK);
FILLOP(rename, RENAME);
FILLOP(mkdir, MKDIR);
FILLOP(rmdir, RMDIR);
FILLOP(symlink, SYMLINK);
FILLOP(readdir, READDIR);
FILLOP(readlink, READLINK);
FILLOP(reclaim, RECLAIM);
FILLOP(inactive, INACTIVE);
FILLOP(print, PRINT);
FILLOP(read, READ);
FILLOP(write, WRITE);
/* XXX: not implemented in the kernel */
FILLOP(getextattr, GETEXTATTR);
FILLOP(setextattr, SETEXTATTR);
FILLOP(listextattr, LISTEXTATTR);
/* XXX */
FILLOP(ioctl1, IOCTL);
FILLOP(fcntl1, FCNTL);
}
#undef FILLOP
struct puffs_usermount *
puffs_mount(struct puffs_vfsops *pvfs, struct puffs_vnops *pvn,
const char *dir, int mntflags, const char *puffsname,
@ -77,6 +125,7 @@ puffs_mount(struct puffs_vfsops *pvfs, struct puffs_vnops *pvn,
pargs.pa_flags = PUFFSFLAG_KERN(pflags);
pargs.pa_fd = fd;
pargs.pa_maxreqlen = maxreqlen;
fillvnopmask(pvn, pargs.pa_vnopmask);
(void)strlcpy(pargs.pa_name, puffsname, sizeof(pargs.pa_name));
pu = malloc(sizeof(struct puffs_usermount));
@ -227,6 +276,7 @@ puffcall(struct puffs_usermount *pu, struct puffs_req *preq)
}
/* XXX: audit return values */
/* XXX: sync with kernel */
} else if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN) {
switch (preq->preq_optype) {
case PUFFS_VN_LOOKUP: