* catch up with kernel changes
* better error handling when mounting
This commit is contained in:
parent
098590e87e
commit
80ce20607e
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: puffs.c,v 1.5 2006/11/07 22:10:53 pooka Exp $ */
|
||||
/* $NetBSD: puffs.c,v 1.6 2006/11/09 13:11:01 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.5 2006/11/07 22:10:53 pooka Exp $");
|
||||
__RCSID("$NetBSD: puffs.c,v 1.6 2006/11/09 13:11:01 pooka Exp $");
|
||||
#endif /* !lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
@ -52,22 +52,20 @@ __RCSID("$NetBSD: puffs.c,v 1.5 2006/11/07 22:10:53 pooka Exp $");
|
||||
|
||||
static int puffcall(struct puffs_usermount *, struct puffs_req *);
|
||||
|
||||
#define eret(a) do {errno=(a);goto failfree;}while/*NOTREACHED*/(/*CONSTCOND*/0)
|
||||
|
||||
struct puffs_usermount *
|
||||
puffs_mount(struct puffs_vfsops *pvfs, struct puffs_vnops *pvn,
|
||||
const char *dir, int mntflags, const char *puffsname,
|
||||
uint32_t pflags, size_t maxreqlen)
|
||||
{
|
||||
struct puffs_startreq sreq;
|
||||
struct puffs_args pargs;
|
||||
struct puffs_vfsreq_start sreq;
|
||||
struct puffs_usermount *pu;
|
||||
int fd;
|
||||
int fd = 0, rv;
|
||||
|
||||
pu = NULL;
|
||||
|
||||
if (pvfs->puffs_start == NULL)
|
||||
eret(EINVAL);
|
||||
if (pvfs->puffs_mount == NULL) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fd = open("/dev/puffs", O_RDONLY);
|
||||
if (fd == -1)
|
||||
@ -81,29 +79,44 @@ puffs_mount(struct puffs_vfsops *pvfs, struct puffs_vnops *pvn,
|
||||
|
||||
pu = malloc(sizeof(struct puffs_usermount));
|
||||
if (!pu)
|
||||
eret(ENOMEM);
|
||||
return NULL;
|
||||
|
||||
pu->pu_flags = pflags;
|
||||
pu->pu_pvfs = *pvfs;
|
||||
pu->pu_pvn = *pvn;
|
||||
pu->pu_fd = fd;
|
||||
if ((pu->pu_rootpath = strdup(dir)) == NULL)
|
||||
eret(ENOMEM);
|
||||
goto failfree;
|
||||
LIST_INIT(&pu->pu_pnodelst);
|
||||
|
||||
if (mount(MOUNT_PUFFS, dir, mntflags, &pargs) == -1)
|
||||
return NULL;
|
||||
goto failfree;
|
||||
pu->pu_maxreqlen = pargs.pa_maxreqlen;
|
||||
|
||||
if (pu->pu_pvfs.puffs_start(pu, &sreq) != 0)
|
||||
return NULL;
|
||||
if ((rv = pu->pu_pvfs.puffs_mount(pu, &sreq.psr_cookie)) != 0) {
|
||||
errno = rv;
|
||||
goto failfree;
|
||||
}
|
||||
|
||||
/* tell kernel we're flying */
|
||||
if (ioctl(pu->pu_fd, PUFFSMOUNTOP, &sreq) == -1)
|
||||
return NULL;
|
||||
if (ioctl(pu->pu_fd, PUFFSSTARTOP, &sreq) == -1)
|
||||
goto failfree;
|
||||
|
||||
/* finally, store fsidx and call start if appropriate */
|
||||
pu->pu_fsidx = sreq.psr_fsidx;
|
||||
if (pu->pu_pvfs.puffs_start) {
|
||||
if ((rv = pu->pu_pvfs.puffs_start(pu)) != 0) {
|
||||
errno = rv;
|
||||
goto failfree;
|
||||
}
|
||||
}
|
||||
|
||||
return pu;
|
||||
|
||||
failfree:
|
||||
/* can't unmount() from here for obvious reasons */
|
||||
if (fd)
|
||||
close(fd);
|
||||
free(pu);
|
||||
return NULL;
|
||||
}
|
||||
@ -156,11 +169,11 @@ puffs_getselectable(struct puffs_usermount *pu)
|
||||
}
|
||||
|
||||
int
|
||||
puffs_setblockingmode(struct puffs_usermount *pu, int block)
|
||||
puffs_setblockingmode(struct puffs_usermount *pu, int mode)
|
||||
{
|
||||
int x;
|
||||
|
||||
x = !block;
|
||||
x = mode;
|
||||
return ioctl(pu->pu_fd, FIONBIO, &x);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: puffs.h,v 1.4 2006/11/07 22:10:53 pooka Exp $ */
|
||||
/* $NetBSD: puffs.h,v 1.5 2006/11/09 13:11:01 pooka Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
|
||||
@ -73,8 +73,8 @@ struct puffs_node {
|
||||
|
||||
/* callbacks for operations */
|
||||
struct puffs_vfsops {
|
||||
int (*puffs_start)(struct puffs_usermount *,
|
||||
struct puffs_vfsreq_start *);
|
||||
int (*puffs_mount)(struct puffs_usermount *, void **);
|
||||
int (*puffs_start)(struct puffs_usermount *);
|
||||
int (*puffs_unmount)(struct puffs_usermount *, int, pid_t);
|
||||
int (*puffs_statvfs)(struct puffs_usermount *,
|
||||
struct statvfs *, pid_t);
|
||||
@ -138,10 +138,6 @@ struct puffs_vnops {
|
||||
void *, int, int *);
|
||||
int (*puffs_advlock)(struct puffs_usermount *,
|
||||
void *, void *, int, struct flock *, int);
|
||||
int (*puffs_getpages)(struct puffs_usermount *,
|
||||
void *, struct puffs_vnreq_getpages *);
|
||||
int (*puffs_putpages)(struct puffs_usermount *,
|
||||
void *, struct puffs_vnreq_putpages *);
|
||||
int (*puffs_getextattr)(struct puffs_usermount *,
|
||||
void *, struct puffs_vnreq_getextattr *);
|
||||
int (*puffs_setextattr)(struct puffs_usermount *,
|
||||
@ -173,6 +169,7 @@ struct puffs_usermount {
|
||||
|
||||
struct puffs_node *pu_rootnode;
|
||||
const char * pu_rootpath;
|
||||
fsid_t pu_fsidx;
|
||||
LIST_HEAD(, puffs_node) pu_pnodelst;
|
||||
|
||||
int pu_wcnt;
|
||||
@ -190,6 +187,9 @@ int puffs_getselectable(struct puffs_usermount *);
|
||||
int puffs_setblockingmode(struct puffs_usermount *, int);
|
||||
void puffs_dummyops(struct puffs_vnops *);
|
||||
|
||||
#define PUFFSDEV_BLOCK 0
|
||||
#define PUFFSDEV_NONBLOCK 1
|
||||
|
||||
struct puffs_node * puffs_newpnode(struct puffs_usermount *, void *,
|
||||
enum vtype);
|
||||
void puffs_putpnode(struct puffs_node *);
|
||||
@ -225,8 +225,8 @@ int puffs_cred_isjuggernaut(const struct puffs_cred *pcr);
|
||||
|
||||
|
||||
#define PUFFSVFS_PROTOS(fsname) \
|
||||
int fsname##_start(struct puffs_usermount *, \
|
||||
struct puffs_vfsreq_start *); \
|
||||
int fsname##_mount(struct puffs_usermount *, void **); \
|
||||
int fsname##_start(struct puffs_usermount *); \
|
||||
int fsname##_unmount(struct puffs_usermount *, int, pid_t); \
|
||||
int fsname##_statvfs(struct puffs_usermount *, \
|
||||
struct statvfs *, pid_t); \
|
||||
@ -294,10 +294,6 @@ int puffs_cred_isjuggernaut(const struct puffs_cred *pcr);
|
||||
void *, int, int *); \
|
||||
int fsname##_advlock(struct puffs_usermount *, \
|
||||
void *, void *, int, struct flock *, int); \
|
||||
int fsname##_getpages(struct puffs_usermount *, \
|
||||
void *, struct puffs_vnreq_getpages *); \
|
||||
int fsname##_putpages(struct puffs_usermount *, \
|
||||
void *, struct puffs_vnreq_putpages *); \
|
||||
int fsname##_getextattr(struct puffs_usermount *, \
|
||||
void *, struct puffs_vnreq_getextattr *); \
|
||||
int fsname##_setextattr(struct puffs_usermount *, \
|
||||
|
Loading…
Reference in New Issue
Block a user