diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/.cvsignore | 3 | ||||
-rw-r--r-- | kernel/Makefile.in | 25 | ||||
-rw-r--r-- | kernel/configure.ac | 72 | ||||
-rw-r--r-- | kernel/fuse_i.h | 18 | ||||
-rw-r--r-- | kernel/linux/fuse.h | 238 | ||||
-rwxr-xr-x | kernel/makeconf.sh | 9 |
6 files changed, 347 insertions, 18 deletions
diff --git a/kernel/.cvsignore b/kernel/.cvsignore index a9f8088..907cdec 100644 --- a/kernel/.cvsignore +++ b/kernel/.cvsignore @@ -1,4 +1,7 @@ Makefile +configure +config.* +*.cache .deps .*.cmd *.mod.c diff --git a/kernel/Makefile.in b/kernel/Makefile.in index 7850b83..2f7b74b 100644 --- a/kernel/Makefile.in +++ b/kernel/Makefile.in @@ -2,11 +2,14 @@ SHELL = /bin/sh INSTALL = @INSTALL@ -mkdir_p = @mkdir_p@ +mkdir_p = mkdir -p majver = @majver@ +VERSION = @PACKAGE_VERSION@ -DISTFILES = Makefile.in dev.c dir.c file.c inode.c util.c fuse_i.h +DISTFILES = Makefile.in configure.ac configure config.h.in makeconf.sh \ + dev.c dir.c file.c inode.c util.c fuse_i.h COMPATDISTFILES = compat/parser.c compat/parser.h +LINUXDISTFILES = linux/fuse.h fusemoduledir = @kmoduledir@/kernel/fs/fuse @@ -32,20 +35,24 @@ clean: distclean: clean rm -f Makefile + rm -f config.h config.log config.status config.cache + rm -rf .tmp_versions maintainer-clean: distclean -distdir: $(DISTFILES) $(COMPATDISTFILES) +distdir: $(DISTFILES) $(COMPATDISTFILES) $(LINUXDISTFILES) cp -p $(DISTFILES) $(distdir) mkdir $(distdir)/compat cp -p $(COMPATDISTFILES) $(distdir)/compat + mkdir $(distdir)/linux + cp -p $(LINUXDISTFILES) $(distdir)/linux ifeq ($(majver), 2.4) -CC = @CC@ -LD = @LD@ +CC = gcc +LD = ld CFLAGS = -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -pipe -CPPFLAGS = -I@kernelsrc@/include -I../include -D__KERNEL__ -DMODULE -D_LOOSE_KERNEL_NAMES -DFUSE_VERSION=\"@VERSION@\" @KERNELCPPFLAGS@ +CPPFLAGS = -I@kernelsrc@/include -I. -D__KERNEL__ -DMODULE -D_LOOSE_KERNEL_NAMES -DFUSE_VERSION=\"$(VERSION)\" @KERNELCPPFLAGS@ fuse_objs = dev.o dir.o file.o inode.o util.o compat/parser.o @@ -59,7 +66,7 @@ all-spec: fuse.o fuse.o: $(fuse_objs) $(LD) -r -o fuse.o $(fuse_objs) -fuse_headers = fuse_i.h ../include/linux/fuse.h +fuse_headers = fuse_i.h linux/fuse.h dev.o: $(fuse_headers) dir.o: $(fuse_headers) @@ -69,8 +76,8 @@ util.o: $(fuse_headers) else -export FUSE_INCLUDE ?= $(shell pwd)/../include -EXTRA_CFLAGS += -I$(FUSE_INCLUDE) -DFUSE_VERSION=\"@VERSION@\" +export FUSE_INCLUDE ?= $(shell pwd) +EXTRA_CFLAGS += -I$(FUSE_INCLUDE) -DFUSE_VERSION=\"$(VERSION)\" obj-m := fuse.o fuse-objs := dev.o dir.o file.o inode.o util.o diff --git a/kernel/configure.ac b/kernel/configure.ac new file mode 100644 index 0000000..8dce5bd --- /dev/null +++ b/kernel/configure.ac @@ -0,0 +1,72 @@ +AC_INIT(fuse-kernel, 2.1-pre0) +AC_CONFIG_HEADERS([config.h]) + +AC_MSG_CHECKING([kernel source directory]) +kernelsrc= +AC_ARG_WITH(kernel, + [ --with-kernel=PATH Specify location of kernel source ], + [kernelsrc="$withval"]) + +if test -z "$kernelsrc"; then + buildlink=/lib/modules/`uname -r`/build + if test -e $buildlink; then + kernelsrc=`(cd $buildlink; /bin/pwd)` + else + AC_MSG_RESULT([Not found]) + AC_MSG_ERROR([ +*** Please specify the location of the kernel source with +*** the '--with-kernel=SRCDIR' option]) + fi +fi +AC_MSG_RESULT([$kernelsrc]) + +AC_MSG_CHECKING([kernel source version]) +if test -r $kernelsrc/include/linux/version.h; then + kernsrcver=`(echo "#include <linux/version.h>"; echo "kernsrcver=UTS_RELEASE") | cpp -I $kernelsrc/include | grep "^kernsrcver=" | cut -d \" -f 2` +fi +if test -z "$kernsrcver"; then + AC_MSG_RESULT([Not found]) + AC_MSG_ERROR([ +*** Cannot determine the version of the linux kernel source. Please +*** configure the kernel before running this script]) +fi +AC_MSG_RESULT([$kernsrcver]) +majver=`echo "$kernsrcver" | cut -f-2 -d.` +kmoduledir=/lib/modules/$kernsrcver +AC_SUBST(kernelsrc) +AC_SUBST(majver) +AC_SUBST(kmoduledir) +subdirs="$subdirs kernel" + +if echo "$kernsrcver" | grep -q "^2.4"; then + old_cflags="$CFLAGS" + CFLAGS="-I${kernelsrc}/include -Wall -O2 -fno-strict-aliasing -D__KERNEL__" + AC_CHECK_DECL(i_size_read, + AC_DEFINE(HAVE_I_SIZE_FUNC, 1, + [Kernel has i_size_read() and i_size_write() functions]),, + [#include <linux/fs.h>]) + CFLAGS="$old_cflags" +fi +AC_MSG_CHECKING([if kernel has extended attribute support]) +if test -f $kernelsrc/include/linux/xattr.h; then + AC_DEFINE(HAVE_KERNEL_XATTR, 1, [Kernel has xattr support],,) + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +isuml=no +KERNELMAKE_PARAMS= +KERNELCPPFLAGS= +AC_MSG_CHECKING([if this is user mode linux]) +if test -f $kernelsrc/include/linux/autoconf.h && grep -q "^#define CONFIG_USERMODE 1" $kernelsrc/include/linux/autoconf.h; then + isuml=yes + KERNELMAKE_PARAMS="ARCH=um" + KERNELCPPFLAGS="-D__arch_um__ -DSUBARCH=\\\"i386\\\" -D_LARGEFILE64_SOURCE -I${kernelsrc}/arch/um/include -Derrno=kernel_errno -I${kernelsrc}/arch/um/kernel/tt/include -I${kernelsrc}/arch/um/kernel/skas/include" +fi +AC_MSG_RESULT([$isuml]) +AC_SUBST(KERNELMAKE_PARAMS) +AC_SUBST(KERNELCPPFLAGS) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index d0cde75..3c18975 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -20,15 +20,15 @@ #include <config.h> #ifndef KERNEL_2_6 -#include <linux/config.h> -#ifdef CONFIG_MODVERSIONS -#define MODVERSIONS -#include <linux/modversions.h> -#endif -#ifndef HAVE_I_SIZE_FUNC -#define i_size_read(inode) ((inode)->i_size) -#define i_size_write(inode, size) do { (inode)->i_size = size; } while(0) -#endif +# include <linux/config.h> +# ifdef CONFIG_MODVERSIONS +# define MODVERSIONS +# include <linux/modversions.h> +# endif +# ifndef HAVE_I_SIZE_FUNC +# define i_size_read(inode) ((inode)->i_size) +# define i_size_write(inode, size) do { (inode)->i_size = size; } while(0) +# endif #endif #include <linux/kernel.h> #include <linux/module.h> diff --git a/kernel/linux/fuse.h b/kernel/linux/fuse.h new file mode 100644 index 0000000..e5f9a6c --- /dev/null +++ b/kernel/linux/fuse.h @@ -0,0 +1,238 @@ +/* + FUSE: Filesystem in Userspace + Copyright (C) 2001-2004 Miklos Szeredi <miklos@szeredi.hu> + + This program can be distributed under the terms of the GNU GPL. + See the file COPYING. +*/ + +/* This file defines the kernel interface of FUSE */ + +/** Version number of this interface */ +#define FUSE_KERNEL_VERSION 4 + +/** Minor version number of this interface */ +#define FUSE_KERNEL_MINOR_VERSION 1 + +/** The node ID of the root inode */ +#define FUSE_ROOT_ID 1 + +/** Opening this will yield a new control file */ +#define FUSE_DEV "/proc/fs/fuse/dev" + +/** The file containing the version in the form MAJOR.MINOR */ +#define FUSE_VERSION_FILE "/proc/fs/fuse/version" + +struct fuse_attr { + unsigned long ino; + unsigned int mode; + unsigned int nlink; + unsigned int uid; + unsigned int gid; + unsigned int rdev; + unsigned long long size; + unsigned long blocks; + unsigned long atime; + unsigned long atimensec; + unsigned long mtime; + unsigned long mtimensec; + unsigned long ctime; + unsigned long ctimensec; +}; + +struct fuse_kstatfs { + unsigned int bsize; + unsigned long long blocks; + unsigned long long bfree; + unsigned long long bavail; + unsigned long long files; + unsigned long long ffree; + unsigned int namelen; +}; + +#define FATTR_MODE (1 << 0) +#define FATTR_UID (1 << 1) +#define FATTR_GID (1 << 2) +#define FATTR_SIZE (1 << 3) +#define FATTR_ATIME (1 << 4) +#define FATTR_MTIME (1 << 5) +#define FATTR_CTIME (1 << 6) + +enum fuse_opcode { + FUSE_LOOKUP = 1, + FUSE_FORGET = 2, /* no reply */ + FUSE_GETATTR = 3, + FUSE_SETATTR = 4, + FUSE_READLINK = 5, + FUSE_SYMLINK = 6, + FUSE_GETDIR = 7, + FUSE_MKNOD = 8, + FUSE_MKDIR = 9, + FUSE_UNLINK = 10, + FUSE_RMDIR = 11, + FUSE_RENAME = 12, + FUSE_LINK = 13, + FUSE_OPEN = 14, + FUSE_READ = 15, + FUSE_WRITE = 16, + FUSE_STATFS = 17, + FUSE_RELEASE = 18, /* no reply */ + FUSE_INVALIDATE = 19, /* user initiated */ + FUSE_FSYNC = 20, + FUSE_SETXATTR = 21, + FUSE_GETXATTR = 22, + FUSE_LISTXATTR = 23, + FUSE_REMOVEXATTR = 24, + FUSE_FLUSH = 25, +}; + +/* Conservative buffer size for the client */ +#define FUSE_MAX_IN 8192 + +#define FUSE_NAME_MAX 1024 +#define FUSE_SYMLINK_MAX 4096 +#define FUSE_XATTR_SIZE_MAX 4096 + +struct fuse_entry_out { + unsigned long nodeid; /* Inode ID */ + unsigned long generation; /* Inode generation: nodeid:gen must + be unique for the fs's lifetime */ + unsigned long entry_valid; /* Cache timeout for the name */ + unsigned long entry_valid_nsec; + unsigned long attr_valid; /* Cache timeout for the attributes */ + unsigned long attr_valid_nsec; + struct fuse_attr attr; +}; + +struct fuse_forget_in { + int version; +}; + +struct fuse_attr_out { + unsigned long attr_valid; /* Cache timeout for the attributes */ + unsigned long attr_valid_nsec; + struct fuse_attr attr; +}; + +struct fuse_getdir_out { + int fd; +}; + +struct fuse_mknod_in { + unsigned int mode; + unsigned int rdev; +}; + +struct fuse_mkdir_in { + unsigned int mode; +}; + +struct fuse_rename_in { + unsigned long newdir; +}; + +struct fuse_link_in { + unsigned long newdir; +}; + +struct fuse_setattr_in { + struct fuse_attr attr; + unsigned int valid; +}; + +struct fuse_open_in { + unsigned int flags; +}; + +struct fuse_open_out { + unsigned long fh; +}; + +struct fuse_release_in { + unsigned long fh; + unsigned int flags; +}; + +struct fuse_flush_in { + unsigned long fh; +}; + +struct fuse_read_in { + unsigned long fh; + unsigned long long offset; + unsigned int size; +}; + +struct fuse_write_in { + int writepage; + unsigned long fh; + unsigned long long offset; + unsigned int size; +}; + +struct fuse_write_out { + unsigned int size; +}; + +struct fuse_statfs_out { + struct fuse_kstatfs st; +}; + +struct fuse_fsync_in { + unsigned long fh; + int datasync; +}; + +struct fuse_setxattr_in { + unsigned int size; + unsigned int flags; +}; + +struct fuse_getxattr_in { + unsigned int size; +}; + +struct fuse_getxattr_out { + unsigned int size; +}; + +struct fuse_in_header { + int unique; + enum fuse_opcode opcode; + unsigned long nodeid; + unsigned int uid; + unsigned int gid; + unsigned int pid; +}; + +struct fuse_out_header { + int unique; + int error; +}; + +struct fuse_user_header { + int unique; /* zero */ + enum fuse_opcode opcode; + unsigned long nodeid; + unsigned long ino; /* Needed only on 2.4.x where ino is also + used for inode lookup */ +}; + +struct fuse_dirent { + unsigned long ino; + unsigned short namelen; + unsigned char type; + char name[256]; +}; + +#define FUSE_NAME_OFFSET ((unsigned int) ((struct fuse_dirent *) 0)->name) +#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(long) - 1) & ~(sizeof(long) - 1)) +#define FUSE_DIRENT_SIZE(d) \ + FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) + +/* + * Local Variables: + * indent-tabs-mode: t + * c-basic-offset: 8 + * End: + */ diff --git a/kernel/makeconf.sh b/kernel/makeconf.sh new file mode 100755 index 0000000..d9d6fe1 --- /dev/null +++ b/kernel/makeconf.sh @@ -0,0 +1,9 @@ +#! /bin/sh + +echo Running autoheader... +autoheader +echo Running autoconf... +autoconf + +rm -f config.cache config.status +echo "To compile run './configure', and then 'make'." |