Edit

IABSD.fr/src/sys/miscfs/fuse/fusefs_node.h

Branch :

  • Show log

    Commit

  • Author : natano
    Date : 2016-09-07 17:53:35
    Hash : 5e69e0b6
    Message : Fix fuse node lookups. Currently fusefs nodes in the kernel remember the parent inode number for ".." lookups. This only works until the kernel starts to reuse vnodes and the parent's vnode is reclaimed and the ino to path mapping is removed from the userland process by libfuse. Fix this by using reference counting in libfuse, so that parent mapping are retained as long as a child uses them. Also, don't free the root node. This commit resolves following issue: $ doas fuse-zip ~/Downloads/foo.zip /mnt $ ls /mnt openbsd-www $ grep -IR foo /usr/src > /dev/null # force vfs to reclaim vnodes $ ls /mnt ls: /mnt: No such file or directory $ ok tedu

  • sys/miscfs/fuse/fusefs_node.h
  • /* $OpenBSD: fusefs_node.h,v 1.4 2016/09/07 17:53:35 natano Exp $ */
    /*
     * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com>
     *
     * Permission to use, copy, modify, and distribute this software for any
     * purpose with or without fee is hereby granted, provided that the above
     * copyright notice and this permission notice appear in all copies.
     *
     * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     */
    
    #ifndef _FUSEFS_NODE_H_
    #define _FUSEFS_NODE_H_
    
    #include <ufs/ufs/quota.h>
    #include <ufs/ufs/inode.h>
    #include <ufs/ufs/ufs_extern.h>
    
    enum fufh_type {
    	FUFH_INVALID = -1,
    	FUFH_RDONLY  = 0,
    	FUFH_WRONLY  = 1,
    	FUFH_RDWR    = 2,
    	FUFH_MAXTYPE = 3,
    };
    
    struct fusefs_filehandle {
    	uint64_t fh_id;
    	enum fufh_type fh_type;
    };
    
    struct fusefs_node {
    	struct inode ufs_ino;
    
    	/** I/O **/
    	struct     fusefs_filehandle fufh[FUFH_MAXTYPE];
    
    	/** meta **/
    	off_t             filesize;
    };
    
    #ifdef ITOV
    # undef ITOV
    #endif
    #define ITOV(ip) ((ip)->ufs_ino.i_vnode)
    
    #ifdef VTOI
    # undef VTOI
    #endif
    #define VTOI(vp) ((struct fusefs_node *)(vp)->v_data)
    
    uint64_t fusefs_fd_get(struct fusefs_node *, enum fufh_type);
    
    #endif /* _FUSEFS_NODE_H_ */