ports/159322: [PATCH] sysutils/fusefs-kmod doesn't build due to recent changes in vfs_flagopt(9)
Brandon Gooch
jamesbrandongooch at gmail.com
Sun Jul 31 04:40:07 UTC 2011
>Number: 159322
>Category: ports
>Synopsis: [PATCH] sysutils/fusefs-kmod doesn't build due to recent changes in vfs_flagopt(9)
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Sun Jul 31 04:40:06 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Brandon Gooch
>Release: 9-CURRENT amd64
>Organization:
>Environment:
FreeBSD m6500.local 9.0-BETA1 FreeBSD 9.0-BETA1 #0 r224414: Tue Jul 26 02:22:28 CDT 2011 root at m6500.local:/usr/obj/usr/src/sys/DELL_M6500 amd64
>Description:
A recent change to vfs_flagopt(9) has resulted in an un-buildable sysutils/fusefs-kmod. The patch provided brings the fusefs-kmod port's use of vfs_flagopt(9) up-to-date.
>From the commit log:
This update changes the mnt_flag field in the mount structure from
32 bits to 64 bits and eliminates the unused mnt_xflag field. The
existing mnt_flag field is completely out of bits, so this update
gives us room to expand. Note that the f_flags field in the statfs
structure is already 64 bits, so the expanded mnt_flag field can
be exported without having to make any changes in the statfs structure.
Approved by: re (bz)
http://svnweb.freebsd.org/base?view=revision&revision=224290
>How-To-Repeat:
Try to build sysutils/fusefs-kmod on 9-CURRENT after r224290.
>Fix:
Drop the supplied patch into sysutils/fusefs-kmod/files/ (you can remove the .txt extension) -- overwriting the file that exists. Run `make clean` and then rebuild the port.
Patch attached with submission follows:
--- fuse_module/fuse_vfsops.c.orig 2008-02-04 23:25:57.000000000 -0600
+++ fuse_module/fuse_vfsops.c 2011-07-30 23:09:43.000000000 -0500
@@ -18,6 +18,7 @@
#include <sys/namei.h>
#include <sys/mount.h>
#include <sys/sysctl.h>
+#include <sys/fcntl.h>
#include "fuse.h"
#include "fuse_session.h"
@@ -60,14 +61,14 @@
};
SYSCTL_INT(_vfs_fuse, OID_AUTO, init_backgrounded, CTLFLAG_RD,
- 0, 1, "indicate async handshake");
+ 0, 1, "indicate async handshake");
static int fuse_enforce_dev_perms = 0;
SYSCTL_LONG(_vfs_fuse, OID_AUTO, enforce_dev_perms, CTLFLAG_RW,
- &fuse_enforce_dev_perms, 0,
- "enforce fuse device permissions for secondary mounts");
+ &fuse_enforce_dev_perms, 0,
+ "enforce fuse device permissions for secondary mounts");
static unsigned sync_unmount = 1;
SYSCTL_UINT(_vfs_fuse, OID_AUTO, sync_unmount, CTLFLAG_RW,
- &sync_unmount, 0, "specify when to use synchronous unmount");
+ &sync_unmount, 0, "specify when to use synchronous unmount");
MALLOC_DEFINE(M_FUSEVFS, "fuse_filesystem", "buffer for fuse vfs layer");
@@ -155,8 +156,8 @@
if (VTOI(vp) == pmp->nodeid) {
KASSERT(! pmp->valid,
- ("more than one vnode seems to match #%llu",
- (unsigned long long)pmp->nodeid));
+ ("more than one vnode seems to match #%llu",
+ (unsigned long long)pmp->nodeid));
VTOFUD(vp)->parent_nid = pmp->parent_nid;
pmp->valid = 1;
}
@@ -213,8 +214,14 @@
* Mount system call
*/
static int
+#if VFSOPS_TAKES_THREAD
fuse_mount(struct mount *mp, struct thread *td)
{
+#else
+fuse_mount(struct mount *mp)
+{
+ struct thread *td = curthread;
+#endif
int err = 0;
size_t len;
char *fspec, *subtype = NULL;
@@ -224,14 +231,13 @@
struct cdev *fdev;
struct sx *slock;
struct fuse_data *data;
- int mntopts = 0, __mntopts = 0, max_read_set = 0, secondary = 0;
+ uint64_t mntopts = 0, __mntopts = 0, max_read_set = 0, secondary = 0;
unsigned max_read = ~0;
struct vnode *rvp;
struct fuse_vnode_data *fvdat;
GIANT_REQUIRED;
- KASSERT(fuse_useco >= 0,
- ("negative fuse usecount despite Giant"));
+ KASSERT(fuse_useco >= 0, ("negative fuse usecount despite Giant"));
if (mp->mnt_flag & MNT_UPDATE)
return (EOPNOTSUPP);
@@ -257,7 +263,7 @@
/*
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible disk device.
- */
+ */
NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, td);
if ((err = namei(ndp)) != 0)
@@ -318,10 +324,10 @@
FUSE_UNLOCK;
dev_rel(fdev);
return (ENXIO);
- }
+ }
FUSE_UNLOCK;
- /*
+ /*
* With the help of underscored options the mount program
* can inform us from the flags it sets by default
*/
@@ -361,7 +367,7 @@
DEBUG2G("mntopts 0x%x\n", mntopts);
- /* Sanity + permission checks */
+ /* Sanity + permission checks */
if (! data->daemoncred)
panic("fuse daemon found, but identity unknown");
@@ -371,7 +377,7 @@
if (data->dataflag & FSESS_PRIVATE)
/*
* device is owned and owner doesn't
- * wanna share it with us
+ * wanna share it with us
*/
err = EPERM;
if (/* actual option set differs from default */
@@ -422,9 +428,9 @@
if (! err) {
err = vn_lock(rvp, LK_EXCLUSIVE | LK_RETRY
#if VN_LOCK_TAKES_THREAD
- , td
+ , td
#endif
- );
+ );
#if NEW_VNODES_ADJUSTED_MANUALLY
if (err)
printf("fuse4bsd: leaking vnode %p\n", rvp);
@@ -450,13 +456,13 @@
fdata_kick_set(data);
sx_xunlock(slock);
free(fvdat, M_FUSEVN);
- goto out;
+ goto out;
} else
VOP_UNLOCK(rvp, 0
#if VOP_UNLOCK_TAKES_THREAD
- , td
+ , td
#endif
- );
+ );
data->mp = mp;
data->mpri = FM_PRIMARY;
data->dataflag |= mntopts;
@@ -468,7 +474,7 @@
sx_xunlock(slock);
- vfs_getnewfsid(mp);
+ vfs_getnewfsid(mp);
mp->mnt_flag |= MNT_LOCAL;
#ifdef MNTK_MPSAFE
mp->mnt_kern_flag |= MNTK_MPSAFE;
@@ -499,7 +505,7 @@
len++;
} else {
sprintf(mp->mnt_stat.f_mntfromname + len, "%d",
- data->mntco - 1);
+ data->mntco - 1);
len += log;
}
}
@@ -529,8 +535,14 @@
* Unmount system call
*/
static int
+#if VFSOPS_TAKES_THREAD
fuse_unmount(struct mount *mp, int mntflags, struct thread *td)
{
+#else
+fuse_unmount(struct mount *mp, int mntflags)
+{
+ struct thread *td = curthread;
+#endif
int flags = 0, err = 0;
struct fuse_data *data;
struct fuse_secondary_data *fsdat = NULL;
@@ -558,7 +570,7 @@
struct vnode *vp, *nvp;
#endif
- if (! (mntflags & MNT_FORCE ||
+ if (!(mntflags & MNT_FORCE ||
data->dataflag & FSESS_NEGLECT_SHARES ||
LIST_EMPTY(&data->slaves_head))) {
err = EBUSY;
@@ -590,14 +602,14 @@
#if FUSE_HAS_DESTROY
if (data->dataflag & FSESS_SYNC_UNMOUNT &&
((sync_unmount == 1 &&
- data->dataflag & FSESS_CAN_SYNC_UNMOUNT) ||
- sync_unmount == 2) &&
+ data->dataflag & FSESS_CAN_SYNC_UNMOUNT) ||
+ sync_unmount == 2) &&
!(mntflags & MNT_FORCE)) {
struct fuse_dispatcher fdi;
fdisp_init(&fdi, 0);
fdisp_make(&fdi, mp, FUSE_DESTROY, FUSE_ROOT_ID, td,
- NULL);
+ NULL);
fdisp_wait_answ(&fdi);
/* ignore return value */
}
@@ -616,7 +628,7 @@
FUSE_LOCK;
fdev = data->fdev;
DEBUG2G("mntco %d, opened 0x%x\n",
- data->mntco, data->dataflag & FSESS_OPENED);
+ data->mntco, data->dataflag & FSESS_OPENED);
if (data->mntco == 0 && ! (data->dataflag & FSESS_OPENED)) {
data->fdev->si_drv1 = NULL;
fdata_destroy(data);
@@ -629,12 +641,18 @@
mp->mnt_flag &= ~MNT_LOCAL;
return (0);
-}
+}
/* stolen from portalfs */
static int
+#if VFSOPS_TAKES_THREAD
fuse_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
{
+#else
+fuse_root(struct mount *mp, int flags, struct vnode **vpp)
+{
+ struct thread *td = curthread;
+#endif
/*
* Return locked reference to root.
*/
@@ -650,7 +668,11 @@
data = fsdat->master;
sx_slock(&data->mhierlock);
if (data->mpri == FM_PRIMARY)
- err = fuse_root(data->mp, flags, vpp, td);
+ err = fuse_root(data->mp, flags, vpp
+#if VFSOPS_TAKES_THREAD
+ , td
+#endif
+ );
else
err = ENXIO;
sx_sunlock(&data->mhierlock);
@@ -661,13 +683,17 @@
vref(vp);
vn_lock(vp, flags | LK_RETRY
#if VN_LOCK_TAKES_THREAD
- , td
+ , td
#endif
- );
+ );
if (vp->v_type == VNON) {
struct vattr va;
- (void)VOP_GETATTR(vp, &va, td->td_ucred, td);
+ (void)VOP_GETATTR(vp, &va, td->td_ucred
+#if VOP_GETATTR_TAKES_THREAD
+ , td
+#endif
+ );
}
*vpp = vp;
#if _DEBUG2G
@@ -678,12 +704,18 @@
}
static int
+#if VFSOPS_TAKES_THREAD
fuse_statfs(struct mount *mp, struct statfs *sbp, struct thread *td)
{
+#else
+fuse_statfs(struct mount *mp, struct statfs *sbp)
+{
+ struct thread *td = curthread;
+#endif
struct fuse_dispatcher fdi;
struct fuse_statfs_out *fsfo;
struct fuse_data *data;
- int err = 0;
+ int err = 0;
DEBUG2G("mp %p: %s\n", mp, mp->mnt_stat.f_mntfromname);
data = fusefs_get_data(mp);
@@ -696,7 +728,11 @@
sx_slock(&data->mhierlock);
if (data->mpri == FM_PRIMARY)
- err = fuse_statfs(data->mp, sbp, td);
+ err = fuse_statfs(data->mp, sbp
+#if VFSOPS_TAKES_THREAD
+ , td
+#endif
+ );
else
err = ENXIO;
sx_sunlock(&data->mhierlock);
@@ -752,14 +788,20 @@
*/
sbp->f_bsize = fsfo->st.bsize; /* cast from uint32_t to uint64_t */
- DEBUG("fuse_statfs_out -- blocks: %llu, bfree: %llu, bavail: %llu, files: %llu, ffree: %llu, bsize: %i, namelen: %i\n",
- (unsigned long long)fsfo->st.blocks, (unsigned long long)fsfo->st.bfree, (unsigned long long)fsfo->st.bavail, (unsigned long long)fsfo->st.files, (unsigned long long)fsfo->st.ffree, fsfo->st.bsize, fsfo->st.namelen);
+ DEBUG("fuse_statfs_out -- blocks: %llu, bfree: %llu, bavail: %llu,"
+ "files: %llu, ffree: %llu, bsize: %i, namelen: %i\n",
+ (unsigned long long)fsfo->st.blocks,
+ (unsigned long long)fsfo->st.bfree,
+ (unsigned long long)fsfo->st.bavail,
+ (unsigned long long)fsfo->st.files,
+ (unsigned long long)fsfo->st.ffree, fsfo->st.bsize,
+ fsfo->st.namelen);
fuse_ticket_drop(fdi.tick);
return (0);
fake:
- sbp->f_blocks = 0;
+ sbp->f_blocks = 0;
sbp->f_bfree = 0;
sbp->f_bavail = 0;
sbp->f_files = 0;
@@ -777,8 +819,8 @@
int
fuse_vget_i(struct mount *mp, struct thread *td, uint64_t nodeid,
- enum vtype vtyp, struct vnode **vpp, enum vget_mode vmod,
- uint64_t parentid)
+ enum vtype vtyp, struct vnode **vpp, enum vget_mode vmod,
+ uint64_t parentid)
{
#define myflags LK_EXCLUSIVE | LK_RETRY
int err = 0;
@@ -786,7 +828,7 @@
struct vnode *vp2;
DEBUG("been asked for vno #%llu, parent #%llu\n",
- (long long unsigned)nodeid, (long long unsigned)parentid);
+ (long long unsigned)nodeid, (long long unsigned)parentid);
if (vtyp == VNON)
return (EINVAL);
@@ -794,7 +836,11 @@
if (nodeid == FUSE_ROOT_ID) {
if (parentid != FUSE_NULL_ID)
return (ENOENT);
- err = VFS_ROOT(mp, myflags, vpp, td);
+ err = VFS_ROOT(mp, myflags, vpp
+#if VFSOPS_TAKES_THREAD
+ , td
+#endif
+ );
if (err)
return (err);
KASSERT(*vpp, ("we neither err'd nor found the root node"));
@@ -809,7 +855,7 @@
if (vmod == VG_WANTNEW)
*vpp = NULL;
else if ((err = vfs_hash_get(mp, nodeid, /*flags*/ myflags, td, vpp,
- fuse_vnode_cmp, &nodeid)))
+ fuse_vnode_cmp, &nodeid)))
return (err);
/*
@@ -842,11 +888,10 @@
pmp.parent_nid = parentid;
pmp.valid = 0;
err = vfs_hash_get(mp, pmp.nodeid, 0,
- td, &xvp,
- fuse_vnode_setparent_cmp,
- &pmp);
+ td, &xvp,
+ fuse_vnode_setparent_cmp, &pmp);
KASSERT(xvp == NULL,
- ("findparent routine has fetched a vnode"));
+ ("findparent routine has fetched a vnode"));
} else
/* parent mismatch for a directory */
err = EIO;
@@ -882,25 +927,25 @@
#endif
if (err) {
- free(fvdat, M_FUSEVN);
+ free(fvdat, M_FUSEVN);
VNASSERT(! *vpp, *vpp,
- ("Maybe I misunderstood how getnewvnode() works..."));
- return (err);
+ ("Maybe I misunderstood how getnewvnode() works..."));
+ return (err);
}
#if NEW_VNODES_ADJUSTED_MANUALLY
err = vn_lock(*vpp, myflags
#if VN_LOCK_TAKES_THREAD
- , td
+ , td
#endif
- );
+ );
if (err)
printf("fuse4bsd: leaking vnode %p\n", *vpp);
else
err = insmntque(*vpp, mp);
if (err) {
- free(fvdat, M_FUSEVN);
- return (err);
+ free(fvdat, M_FUSEVN);
+ return (err);
}
#endif
@@ -912,7 +957,7 @@
*/
fuse_vnode_init(*vpp, fvdat, nodeid, vtyp, parentid);
err = vfs_hash_insert(*vpp, nodeid, /*flags*/ myflags, td, &vp2,
- fuse_vnode_bgdrop_cmp, fvdat);
+ fuse_vnode_bgdrop_cmp, fvdat);
if (err) {
free(fvdat, M_FUSEVN);
@@ -923,7 +968,8 @@
}
if (vp2) {
- DEBUG("gee, vfs hash collision for node #%llu\n", (unsigned long long)nodeid);
+ DEBUG("gee, vfs hash collision for node #%llu\n",
+ (unsigned long long)nodeid);
if (vmod == VG_WANTNEW) {
vput(vp2);
*vpp = NULL;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list