PERFORCE change 85234 for review
soc-chenk
soc-chenk at FreeBSD.org
Thu Oct 13 14:56:49 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=85234
Change 85234 by soc-chenk at soc-chenk_leavemealone on 2005/10/13 21:55:53
* vnode identification cleaned up
- use the VV_ROOT flag for identifying root node instead of inode number
- do not truncate 64 bit nodedids
Submitted by: soc-chenk
Affected files ...
.. //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.c#13 edit
.. //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.h#6 edit
Differences ...
==== //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.c#13 (text+ko) ====
@@ -538,10 +538,7 @@
static __inline int
fdata_kick_get(struct fuse_data *data)
{
-#if _DEBUG
- DEBUG2G("0x%x\n", data->dataflag & FDAT_KICK);
- kdb_backtrace();
-#endif
+ DEBUG("0x%x\n", data->dataflag & FDAT_KICK);
return (data->dataflag & FDAT_KICK);
}
@@ -1517,11 +1514,12 @@
typedef int fuse_buffeater_t(struct uio *uio, size_t reqsize, void *buf, size_t bufsize, void *param);
typedef int fuse_metrics_t(struct vnode *vp, struct thread *td, struct ucred *cred, int mode, struct fuse_filehandle *fufh, void *param);
-static __inline void fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat, enum vtype vtyp);
+static __inline void fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat, uint64_t nodeid, enum vtype vtyp);
static vfs_mount_t fuse_mount;
static vfs_unmount_t fuse_unmount;
static vfs_root_t fuse_root;
static vfs_statfs_t fuse_statfs;
+static vfs_hash_cmp_t fuse_vnode_cmp;
/* static vfs_vget_t fuse_vget; */
static int fuse_vget_i(struct mount *mp, struct thread *td, uint64_t nodeid, enum vtype vtyp, struct vnode **vpp);
static __inline void fat2vat(struct mount *mp, struct fuse_attr *fat, struct vattr *vap);
@@ -1634,14 +1632,14 @@
*/
#define GETPARENT(pvp, vp) \
do { \
- KASSERT((vp)->v_dd != (vp) || VTOI((vp)) == FUSE_ROOT_INODE, \
+ KASSERT((vp)->v_dd != (vp) || (vp)->v_vflag & VV_ROOT, \
("self-parented non-root")); \
(pvp) = (vp)->v_dd; \
} while (0)
#define SETPARENT(vp, pvp) \
do { \
- KASSERT((vp) != (pvp) || VTOI((vp)) == FUSE_ROOT_INODE, \
+ KASSERT((vp) != (pvp) || (vp)->v_vflag & VV_ROOT, \
("attempt to make non-root node parented by itself")); \
(vp)->v_dd = (pvp); \
} while (0)
@@ -1861,9 +1859,8 @@
* without resorting to the vfs hashing mechanism, thus it also
* can be inserted directly to the v_hash slot.
*/
- rvp->v_hash = FUSE_ROOT_INODE;
fmnt->rvp = rvp;
- fuse_vnode_init(rvp, fvdat, VDIR);
+ fuse_vnode_init(rvp, fvdat, FUSE_ROOT_INODE, VDIR);
rvp->v_vflag |= VV_ROOT;
rootdone:
@@ -1915,7 +1912,7 @@
if (err ) {
data->mntco--;
FUSE_LOCK;
- if (data->mntco == 0 && (! data->dataflag & FDAT_OPENED)) {
+ if (data->mntco == 0 && ! (data->dataflag & FDAT_OPENED)) {
fdev->si_drv1 = NULL;
fdata_destroy(data);
}
@@ -2101,6 +2098,12 @@
return (0);
}
+static int
+fuse_vnode_cmp(struct vnode *vp, void *nidp)
+{
+ return (((struct fuse_vnode_data *)vp->v_data)->nid != *((uint64_t *)nidp));
+}
+
/* ..._i, as "internal" */
static int
@@ -2125,8 +2128,7 @@
DEBUG2G("mp %p: %s\n", mp, mp->mnt_stat.f_mntfromname);
- /* XXX nodeid: cast from 64 bytes to 32 */
- if ((err = vfs_hash_get(mp, nodeid, /*flags*/ myflags, td, vpp, NULL, NULL)))
+ if ((err = vfs_hash_get(mp, 0, /*flags*/ myflags, td, vpp, fuse_vnode_cmp, &nodeid)))
return (err);
audit:
@@ -2156,7 +2158,7 @@
}
/* XXX nodeid: cast from 64 bytes to 32 */
- err = vfs_hash_insert(*vpp, nodeid, /*flags*/ myflags, td, &vp2, NULL, NULL);
+ err = vfs_hash_insert(*vpp, 0, /*flags*/ myflags, td, &vp2, fuse_vnode_cmp, &nodeid);
if (err) {
FREE(fvdat, M_FUSEFS);
@@ -2172,7 +2174,7 @@
goto audit;
}
- fuse_vnode_init(*vpp, fvdat, vtyp);
+ fuse_vnode_init(*vpp, fvdat, nodeid, vtyp);
#if _DEBUG
DEBUG2G("\n");
vn_printf(*vpp, " * ");
@@ -2193,11 +2195,11 @@
static __inline void
fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat,
- enum vtype vtyp)
+ uint64_t nodeid, enum vtype vtyp)
{
- KASSERT(VTOI(vp), ("vnode tried to be inited before getting an inode for it"));
+ fvdat->nid = nodeid;
vp->v_data = fvdat;
- SETPARENT(vp, (VTOI(vp) == FUSE_ROOT_INODE) ? vp : NULL);
+ SETPARENT(vp, (vp->v_vflag & VV_ROOT) ? vp : NULL);
vp->v_type = vtyp;
sx_init(&fvdat->fh_lock, "lock for fuse filehandles");
@@ -2211,20 +2213,17 @@
fuse_recyc_backend(struct vnode *vp, struct thread *td)
{
struct fuse_vnode_data *fvdat;
- ino_t ino;
if (! vp->v_data) {
DEBUG("got a dataless node\n");
return (0);
}
- DEBUG("getting at vnode of ino %d\n", VTOI(vp));
+ DEBUG("getting at vnode of ino %llu\n", VTOI(vp));
- ino = VTOI(vp);
fvdat = vp->v_data;
- vp->v_data = NULL;
- if (VTOI(vp) != FUSE_ROOT_INODE) {
+ if (! (vp->v_vflag & VV_ROOT)) {
vfs_hash_remove(vp);
if (fvdat && fvdat->nlookup) {
@@ -2241,6 +2240,7 @@
fvdat->nlookup, &fdi);
}
}
+ vp->v_data = NULL;
/*
* Taking down fuse_vnode_data structures is just hooked in here...
@@ -2262,7 +2262,7 @@
KASSERT(fufh->useco >= 0, ("negative use count for fuse filehandle"));
KASSERT(! fufh->fp || fufh->useco > 0,
("filehandle bound with 0 use counter"));
- DEBUG2G("vnode #%d, fufh owner %p, useco %d\n", VTOI(vp), fufh->fp, fufh->useco);
+ DEBUG2G("vnode #%llu, fufh owner %p, useco %d\n", VTOI(vp), fufh->fp, fufh->useco);
if (! fufh->fp && fufh->useco == 0) {
LIST_REMOVE(fufh, fh_link);
fuse_send_release(vp, td, cred, fufh, fufh->mode);
@@ -2307,7 +2307,7 @@
int err;
- DEBUG("getting at vnode of ino %d\n", VTOI(vp));
+ DEBUG("getting at vnode of ino %llu\n", VTOI(vp));
#if _DEBUG
DEBUG2G("=============>\n");
kdb_backtrace();
@@ -2478,7 +2478,7 @@
return (EIO);
}
- DEBUG("node #%d, type %d\n", VTOI(vp), vap->va_type);
+ DEBUG("node #%llu, type %d\n", VTOI(vp), vap->va_type);
#if _DEBUG
DEBUG2G("\n");
vn_printf(vp, " * ");
@@ -2582,7 +2582,7 @@
#endif
if (dvp->v_type != VDIR) {
- DEBUG("vnode #%d of vtype %d is not a dir\n", VTOI(dvp),
+ DEBUG("vnode #%llu of vtype %d is not a dir\n", VTOI(dvp),
dvp->v_type);
return (ENOTDIR);
}
@@ -2602,14 +2602,14 @@
#if NO_EARLY_PERM_CHECK_HACK
1
#else
- VTOI(dvp) == FUSE_ROOT_INODE
+ dvp->v_vflag & VV_ROOT
#endif
) {
if ((err = VOP_ACCESS(dvp, VEXEC, cred, td)))
return (err);
}
- DEBUG2G("lookup in #%d, with flags 0x%x\n", VTOI(dvp), flags);
+ DEBUG2G("lookup in #%llu, with flags 0x%x\n", VTOI(dvp), flags);
/* fetching data from "storage" */
@@ -2993,13 +2993,13 @@
sx_sunlock(&fvdat->fh_lock);
if (err == -1) {
- DEBUG2G("suitable fh of vnode #%d found\n", VTOI(vp));
+ DEBUG2G("suitable fh of vnode #%llu found\n", VTOI(vp));
return (fufh);
}
else if (err)
return (NULL);
- DEBUG2G("we need to fetch a new filehandle for vnode #%d\n", VTOI(vp));
+ DEBUG2G("we need to fetch a new filehandle for vnode #%llu\n", VTOI(vp));
fdi.iosize = sizeof(*foi);
if ((err = fdisp_prepare_all(&fdi,
@@ -3255,7 +3255,7 @@
KASSERT(! fufh->fp && fufh->useco == 0, ("active-looking fuse filehandle was attempted to release"));
fvdat->fh_counter--;
- DEBUG2G("filehandle of vnode #%d being released, fh counter now is %d\n",
+ DEBUG2G("filehandle of vnode #%llu being released, fh counter now is %d\n",
VTOI(vp), fvdat->fh_counter);
fdi.iosize = sizeof(*fri);
@@ -3287,7 +3287,7 @@
*/
#define BREAK_IF_BAD(fp) \
if (! (fp)->f_vnode->v_data) { \
- DEBUG("bad fileop on vnode no. %d\n", VTOI((fp)->f_vnode)); \
+ DEBUG("bad fileop on vnode no. %llu\n", VTOI((fp)->f_vnode)); \
return (EBADF); \
}
@@ -3319,7 +3319,7 @@
fvdat = fp->f_vnode->v_data;
fufh = fp->f_data;
KASSERT(fufh->fp == fp, ("file's filehandle is stolen"));
- DEBUG2G("vnode #%d, fufh owner %p, useco %d\n",
+ DEBUG2G("vnode #%llu, fufh owner %p, useco %d\n",
VTOI(fp->f_vnode), fp, fufh->useco);
fufh->useco--;
@@ -3536,13 +3536,13 @@
*/
if (fp->f_flag & O_DIRECT ||
fufh->flags & FUSEFH_DIRECTIO) {
- DEBUG2G("direct read of vnode %d via file handle %llu\n",
+ DEBUG2G("direct read of vnode %llu via file handle %llu\n",
VTOI(fp->f_vnode), fufh->fh_id);
err = fuse_read_directbackend(fp->f_vnode, fufh, uio, cred, td,
FUSE_READ, fuse_std_buffeater,
NULL);
} else {
- DEBUG2G("buffered read of vnode %d\n", VTOI(fp->f_vnode));
+ DEBUG2G("buffered read of vnode %llu\n", VTOI(fp->f_vnode));
err = fuse_read_biobackend(fp->f_vnode, fufh, uio, cred, td,
FUSE_READ, fuse_std_buffeater, NULL);
}
@@ -4214,8 +4214,8 @@
struct vnode *pdp2;
DEBUG("trying at chenkpath\n");
do {
- DEBUG("checkpath bumped into node %d\n", VTOI(pdp));
- if (VTOI(pdp) == FUSE_ROOT_INODE)
+ DEBUG("checkpath bumped into node %llu\n", VTOI(pdp));
+ if (pdp->v_vflag & VV_ROOT)
err = -1;
if (pdp == fvp) {
DEBUG("huh, we caught a move-into-subdir-of-itself attempt\n");
@@ -4850,12 +4850,12 @@
if (fp->f_flag & O_DIRECT ||
fufh->flags & FUSEFH_DIRECTIO) {
- DEBUG2G("direct write of vnode %d via file handle %llu\n",
+ DEBUG2G("direct write of vnode %llu via file handle %llu\n",
VTOI(fp->f_vnode), fufh->fh_id);
err = fuse_write_directbackend(fp->f_vnode, fufh->fh_id, uio,
cred, td);
} else {
- DEBUG2G("buffered write of vnode %d\n", VTOI(fp->f_vnode));
+ DEBUG2G("buffered write of vnode %llu\n", VTOI(fp->f_vnode));
err = fuse_write_biobackend(fp->f_vnode, uio, cred, td);
}
@@ -4893,13 +4893,13 @@
#endif
if (! (vp->v_type == VREG || vp->v_type == VDIR)) {
- DEBUG("for vnode #%d v_type is %d, dropping\n",
+ DEBUG("for vnode #%llu v_type is %d, dropping\n",
VTOI(vp), vp->v_type);
return (EOPNOTSUPP);
}
if (bp->b_iocmd != BIO_READ && bp->b_iocmd != BIO_WRITE) {
- DEBUG("for vnode #%d bio tried with biocmd 0x%x, dropping\n",
+ DEBUG("for vnode #%llu bio tried with biocmd 0x%x, dropping\n",
VTOI(vp), bp->b_iocmd);
return (EOPNOTSUPP);
}
@@ -4939,7 +4939,7 @@
if (err)
goto out;
- DEBUG2G("vp #%d, fufh #%llu\n", VTOI(vp), fufh->fh_id);
+ DEBUG2G("vp #%llu, fufh #%llu\n", VTOI(vp), fufh->fh_id);
if (bp->b_iocmd == BIO_READ) {
struct fuse_read_in *fri;
@@ -5091,7 +5091,7 @@
{
struct fuse_vnode_data *fvdat = ap->a_vp->v_data;
- printf("nodeid: %d, fh_counter: %d, nlookup: %llu\n",
+ printf("nodeid: %llu, fh_counter: %d, nlookup: %llu\n",
VTOI(ap->a_vp), fvdat->fh_counter, fvdat->nlookup);
return (0);
}
@@ -5102,9 +5102,9 @@
struct vnode *vp;
int rc;
- DEBUG("vnode #%d\n", VTOI((struct vnode *)bo->bo_private));
+ DEBUG("vnode #%llu\n", VTOI((struct vnode *)bo->bo_private));
vp = bo->bo_private;
- KASSERT(bo == &vp->v_bufobj, ("BO/VP mismatch: vp %p #(%d) bo %p != %p",
+ KASSERT(bo == &vp->v_bufobj, ("BO/VP mismatch: vp %p (#%llu) bo %p != %p",
vp, VTOI(vp), &vp->v_bufobj, bo));
rc = VOP_STRATEGY(vp, bp);
KASSERT(rc == 0, ("Fuse VOP_STRATEGY failed: bp=%p, "
==== //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.h#6 (text+ko) ====
@@ -136,7 +136,7 @@
#define FUSE_ROOT_INODE 1 /* Fuse convention: node id of root node is 1 */
-#define VTOI(vp) (vp)->v_hash
+#define VTOI(vp) ((struct fuse_vnode_data *)(vp)->v_data)->nid
/** Max number of pages that can be used in a single read request */
/* (taken from Linux Fuse) */
@@ -173,7 +173,7 @@
};
struct fuse_vnode_data {
- //uint64_t nid;
+ uint64_t nid;
uint64_t nlookup;
//struct vnode *parent;
/* Timeout related stuff, etc. will come here */
More information about the p4-projects
mailing list