PERFORCE change 166251 for review
Tatsiana Severyna
tatsianka at FreeBSD.org
Sun Jul 19 07:18:26 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166251
Change 166251 by tatsianka at tatsianka_zonder on 2009/07/19 07:18:22
Add librefuse port
Add fuse implementations of sshfs and unionfs for testing
Fix statfs and nodetofh/fhtonode issues
Affected files ...
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/dirent_compat.h#2 delete
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/null.c#4 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/opdump.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/puffs_dirent_compat.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/libpuffs/subr.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/Makefile#1 add
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/fuse.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/fuse_opt.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse.3#1 add
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/librefuse/refuse_opt.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/mount_psshfs/fs.c#3 edit
.. //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vnops.c#7 edit
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-sshfs/Makefile#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-sshfs/cache.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-sshfs/cache.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-sshfs/config.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-sshfs/sshfs.1#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-sshfs/sshfs.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/CMakeLists.txt#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/CREDITS#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/Makefile#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/cow.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/cow.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/cow_utils.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/cow_utils.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/debug.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/debug.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/elfhash.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/elfhash.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/findbranch.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/findbranch.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/general.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/general.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hash.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hash.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hashtable.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hashtable.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hashtable_itr.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hashtable_itr.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/hashtable_private.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/opts.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/opts.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/readdir.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/readdir.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/rmdir.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/rmdir.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/stats.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/stats.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/string.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/string.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/test.sh#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/unionfs.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/unionfs.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/unlink.c#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/unlink.h#1 add
.. //depot/projects/soc2009/tatsianka_puffs/test-fusefs-unionfs/version.h#1 add
Differences ...
==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/null.c#4 (text+ko) ====
@@ -47,7 +47,7 @@
#include <stdlib.h>
#include <unistd.h>
-#include "dirent_compat.h"
+#include "puffs_dirent_compat.h"
PUFFSOP_PROTOS(puffs_null)
@@ -167,10 +167,8 @@
PUFFSOP_SET(pops, puffs_null, fs, statvfs);
PUFFSOP_SETFSNOP(pops, unmount);
PUFFSOP_SETFSNOP(pops, sync);
-#ifdef XXX_TS
PUFFSOP_SET(pops, puffs_null, fs, fhtonode);
PUFFSOP_SET(pops, puffs_null, fs, nodetofh);
-#endif
PUFFSOP_SET(pops, puffs_null, node, lookup);
PUFFSOP_SET(pops, puffs_null, node, create);
@@ -202,26 +200,21 @@
return 0;
}
-#ifdef XXX_TS
/*
* XXX: this is the stupidest crap ever, but:
* getfh() returns the fhandle type, when we are expected to deliver
* the fid type. Just adjust it a bit and stop whining.
*
* Yes, this really really needs fixing. Yes, *REALLY*.
+ *
+ * XXX_TS: Directly use struct fid, as fh larger then MAXFIDSZ is unsupported
*/
-#define FHANDLE_HEADERLEN 8
-struct kernfid {
- unsigned short fid_len; /* length of data in bytes */
- unsigned short fid_reserved; /* compat: historic align */
- char fid_data[0]; /* data (variable length) */
-};
/*ARGSUSED*/
static void *
fhcmp(struct puffs_usermount *pu, struct puffs_node *pn, void *arg)
{
- struct kernfid *kf1, *kf2;
+ struct fid *kf1, *kf2;
if ((kf1 = pn->pn_data) == NULL)
return NULL;
@@ -247,6 +240,9 @@
{
struct puffs_node *pn_res;
+ if (fidsize != sizeof(struct fid))
+ return EINVAL;
+
pn_res = puffs_pn_nodewalk(pu, fhcmp, fid);
if (pn_res == NULL)
return ENOENT;
@@ -264,38 +260,25 @@
void *fid, size_t *fidsize)
{
struct puffs_node *pn = opc;
- struct kernfid *kfid;
- void *bounce;
+ fhandle_t fh;
int rv;
+ if (*fidsize != sizeof(struct fid))
+ return EINVAL;
+
rv = 0;
- bounce = NULL;
- if (*fidsize) {
- bounce = malloc(*fidsize + FHANDLE_HEADERLEN);
- if (!bounce)
- return ENOMEM;
- *fidsize += FHANDLE_HEADERLEN;
- }
- if (getfh(PNPATH(pn), bounce, fidsize) == -1)
+ if (getfh(PNPATH(pn), &fh) == -1)
rv = errno;
- else
- memcpy(fid, (uint8_t *)bounce + FHANDLE_HEADERLEN,
- *fidsize - FHANDLE_HEADERLEN);
- kfid = fid;
if (rv == 0) {
- *fidsize = kfid->fid_len;
+ *(struct fid *)fid = fh.fh_fid;
pn->pn_data = malloc(*fidsize);
if (pn->pn_data == NULL)
abort(); /* lazy */
memcpy(pn->pn_data, fid, *fidsize);
- } else {
- *fidsize -= FHANDLE_HEADERLEN;
}
- free(bounce);
return rv;
}
-#endif
int
puffs_null_node_lookup(struct puffs_usermount *pu, puffs_cookie_t opc,
@@ -431,18 +414,6 @@
if (fd == -1)
return errno;
-#ifdef XXX_TS
- if (how & PUFFS_FSYNC_DATAONLY)
- fflags = FDATASYNC;
- else
- fflags = FFILESYNC;
- if (how & PUFFS_FSYNC_CACHE)
- fflags |= FDISKSYNC;
-
- if (fsync_range(fd, fflags, offlo, offhi - offlo) == -1)
- rv = errno;
-#endif
-
if (fsync(fd) == -1)
rv = errno;
==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/opdump.c#3 (text+ko) ====
@@ -258,7 +258,6 @@
void
puffsdump_cn(struct puffs_kcn *pkcn)
{
-
/* XXX_TS under if _KERNEL */
const int NAMEI_OPMASK = 3;
==== //depot/projects/soc2009/tatsianka_puffs/libpuffs/subr.c#3 (text+ko) ====
@@ -44,7 +44,7 @@
#include "puffs_priv.h"
-#include "dirent_compat.h"
+#include "puffs_dirent_compat.h"
int
puffs_gendotdent(struct dirent **dent, ino_t id, int dotdot, size_t *reslen)
==== //depot/projects/soc2009/tatsianka_puffs/mount_psshfs/fs.c#3 (text+ko) ====
@@ -180,11 +180,7 @@
uint8_t type;
memset(sbp, 0, sizeof(*sbp));
-#ifdef XXX_TS
- sbp->f_bsize = sbp->f_frsize = sbp->f_iosize = 512;
-#else
sbp->f_bsize = sbp->f_iosize = 512;
-#endif
if ((pctx->extensions & SFTP_EXT_STATVFS) == 0)
goto out;
@@ -200,21 +196,15 @@
}
psbuf_get_8(pb, &tmpval);
- sbp->f_bsize = tmpval;
+ sbp->f_iosize = tmpval; /* statvfs.f_bsize */
psbuf_get_8(pb, &tmpval);
-#ifdef XXX_TS
- sbp->f_frsize = tmpval;
-#endif
+ sbp->f_bsize = tmpval; /* statvfs.f_frsize */
psbuf_get_8(pb, &sbp->f_blocks);
psbuf_get_8(pb, &sbp->f_bfree);
psbuf_get_8(pb, &sbp->f_bavail);
psbuf_get_8(pb, &sbp->f_files);
psbuf_get_8(pb, &sbp->f_ffree);
-#ifdef XXX_TS
- psbuf_get_8(pb, &sbp->f_favail);
-#else
- psbuf_get_8(pb, &tmpval);
-#endif
+ psbuf_get_8(pb, &tmpval); /* favail */
psbuf_get_8(pb, &tmpval); /* fsid */
psbuf_get_8(pb, &tmpval); /* flag */
==== //depot/projects/soc2009/tatsianka_puffs/puffs/puffs_vnops.c#7 (text+ko) ====
@@ -123,9 +123,10 @@
struct vnode *vp = ap->a_vp;
struct fid *fhp = ap->a_fhp;
PUFFS_MSG_VARS(vfs, nodetofh);
+ struct puffs_node *pn = VPTOPP(vp);
struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
size_t argsize, fhlen;
- int error;
+ int error, ltype;
DTRACE();
if (pmp->pmp_args.pa_fhsize == 0)
@@ -138,8 +139,11 @@
nodetofh_msg->pvfsr_dsize = fhlen;
puffs_msg_setinfo(park_nodetofh, PUFFSOP_VFS, PUFFS_VFS_VPTOFH, NULL);
- PUFFS_MSG_ENQUEUEWAIT(pmp, park_nodetofh, error);
+ puffs_msg_enqueue(pmp, park_nodetofh);
+ puffs_unlockvnode(pn, <ype);
+ error = puffs_msg_wait(pmp, park_nodetofh);
error = checkerr(pmp, error, __func__);
+ PUFFS_LOCKVNODE(pn, ltype, error);
if (pmp->pmp_args.pa_fhflags & PUFFS_FHFLAG_PASSTHROUGH)
fhlen = nodetofh_msg->pvfsr_dsize;
More information about the p4-projects
mailing list