2010-10-03 09:46:47 +04:00
|
|
|
/* $NetBSD: debug.c,v 1.5 2010/10/03 05:46:47 manu Exp $ */
|
2010-08-25 11:16:00 +04:00
|
|
|
|
|
|
|
/*-
|
|
|
|
* Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
|
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <puffs.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
#include "perfuse_if.h"
|
|
|
|
#include "fuse.h"
|
|
|
|
|
|
|
|
struct perfuse_opcode {
|
|
|
|
int opcode;
|
|
|
|
const char *opname;
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct perfuse_opcode perfuse_opcode[] = {
|
|
|
|
{ FUSE_LOOKUP, "LOOKUP" },
|
|
|
|
{ FUSE_FORGET, "FORGET" },
|
|
|
|
{ FUSE_GETATTR, "GETATTR" },
|
|
|
|
{ FUSE_SETATTR, "SETATTR" },
|
|
|
|
{ FUSE_READLINK, "READLINK" },
|
|
|
|
{ FUSE_SYMLINK, "SYMLINK" },
|
|
|
|
{ FUSE_MKNOD, "MKNOD" },
|
|
|
|
{ FUSE_MKDIR, "MKDIR" },
|
|
|
|
{ FUSE_UNLINK, "UNLINK" },
|
|
|
|
{ FUSE_RMDIR, "RMDIR" },
|
|
|
|
{ FUSE_RENAME, "RENAME" },
|
|
|
|
{ FUSE_LINK, "LINK" },
|
|
|
|
{ FUSE_OPEN, "OPEN" },
|
|
|
|
{ FUSE_READ, "READ" },
|
|
|
|
{ FUSE_WRITE, "WRITE" },
|
|
|
|
{ FUSE_STATFS, "STATFS" },
|
|
|
|
{ FUSE_RELEASE, "RELEASE" },
|
|
|
|
{ FUSE_FSYNC, "FSYNC" },
|
|
|
|
{ FUSE_SETXATTR, "SETXATTR" },
|
|
|
|
{ FUSE_GETXATTR, "GETXATTR" },
|
|
|
|
{ FUSE_LISTXATTR, "LISTXATTR" },
|
|
|
|
{ FUSE_REMOVEXATTR, "REMOVEXATTR" },
|
|
|
|
{ FUSE_FLUSH, "FLUSH" },
|
|
|
|
{ FUSE_INIT, "INIT" },
|
|
|
|
{ FUSE_OPENDIR, "OPENDIR" },
|
|
|
|
{ FUSE_READDIR, "READDIR" },
|
|
|
|
{ FUSE_RELEASEDIR, "RELEASEDIR" },
|
|
|
|
{ FUSE_FSYNCDIR, "FSYNCDIR" },
|
|
|
|
{ FUSE_GETLK, "GETLK" },
|
|
|
|
{ FUSE_SETLK, "SETLK" },
|
|
|
|
{ FUSE_SETLKW, "SETLKW" },
|
|
|
|
{ FUSE_ACCESS, "ACCESS" },
|
|
|
|
{ FUSE_CREATE, "CREATE" },
|
|
|
|
{ FUSE_INTERRUPT, "INTERRUPT" },
|
|
|
|
{ FUSE_BMAP, "BMAP" },
|
|
|
|
{ FUSE_DESTROY, "DESTROY" },
|
|
|
|
{ FUSE_IOCTL, "IOCTL" },
|
|
|
|
{ FUSE_POLL, "POLL" },
|
|
|
|
{ FUSE_CUSE_INIT, "CUSE_INIT" },
|
|
|
|
{ 0, "UNKNOWN" },
|
|
|
|
};
|
|
|
|
|
== file close operations ==
- use PUFFS_KFLAG_WTCACHE to puffs_init so that all writes are
immediatly send to the filesystem, and we do not have anymore write
after inactive. As a consequence, we can close files at inactive
stage, and there is not any concern left with files opened at
create time. We also do not have anymore to open ourselves in readdir and
fsync.
- Fsync on close (inactive stage). That makes sure we will not need to
do these operations once the file is closed (FUSE want an open file).
short sircuit the request that come after the close, bu not fsinc'ing
closed files,
- Use PUFFS_KFLAG_IAONDEMAND to get less inactive calls
== Removed nodes ==
- more ENOENT retunred for operations on removed node (but there
are probably some still missing): getattr, ooen, setattr, fsync
- set PND_REMOVE before sending the UNLINK/RMDIR operations so that we avoid
races during UNLINK completion. Also set PND_REMOVED on node we overwirte
in rename
== Filehandle fixes ==
- queue open operation to avoid getting two fh for one file
- set FH in getattr, if the file is open
- Just requires a read FH for fsyncdir, as we always opendir in read
mode. Ok, this is misleading :-)
== Misc ==
- do not set FUSE_FATTR_ATIME_NOW in setattr, as we provide the time
- short circuit nilpotent operations in setattr
- add a filename diagnostic flag to dump file names
2010-09-23 20:02:34 +04:00
|
|
|
const char *perfuse_qtypestr[] = {
|
|
|
|
"READDIR",
|
|
|
|
"READ",
|
|
|
|
"WRITE",
|
|
|
|
"AFTERWRITE",
|
2010-10-03 09:46:47 +04:00
|
|
|
"OPEN",
|
2010-09-29 12:01:10 +04:00
|
|
|
"AFTERXCHG"
|
== file close operations ==
- use PUFFS_KFLAG_WTCACHE to puffs_init so that all writes are
immediatly send to the filesystem, and we do not have anymore write
after inactive. As a consequence, we can close files at inactive
stage, and there is not any concern left with files opened at
create time. We also do not have anymore to open ourselves in readdir and
fsync.
- Fsync on close (inactive stage). That makes sure we will not need to
do these operations once the file is closed (FUSE want an open file).
short sircuit the request that come after the close, bu not fsinc'ing
closed files,
- Use PUFFS_KFLAG_IAONDEMAND to get less inactive calls
== Removed nodes ==
- more ENOENT retunred for operations on removed node (but there
are probably some still missing): getattr, ooen, setattr, fsync
- set PND_REMOVE before sending the UNLINK/RMDIR operations so that we avoid
races during UNLINK completion. Also set PND_REMOVED on node we overwirte
in rename
== Filehandle fixes ==
- queue open operation to avoid getting two fh for one file
- set FH in getattr, if the file is open
- Just requires a read FH for fsyncdir, as we always opendir in read
mode. Ok, this is misleading :-)
== Misc ==
- do not set FUSE_FATTR_ATIME_NOW in setattr, as we provide the time
- short circuit nilpotent operations in setattr
- add a filename diagnostic flag to dump file names
2010-09-23 20:02:34 +04:00
|
|
|
};
|
2010-09-15 05:51:43 +04:00
|
|
|
|
2010-08-25 11:16:00 +04:00
|
|
|
const char *
|
|
|
|
perfuse_opname(opcode)
|
|
|
|
int opcode;
|
|
|
|
{
|
|
|
|
const struct perfuse_opcode *po;
|
|
|
|
|
|
|
|
for (po = perfuse_opcode; po->opcode; po++) {
|
|
|
|
if (po->opcode == opcode)
|
|
|
|
return po->opname;
|
|
|
|
}
|
|
|
|
|
|
|
|
return po->opname; /* "UNKNOWN" */
|
|
|
|
}
|