From 689f563f9bb37e1eaa5075f3d374ab6e598d21dc Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 4 May 2004 08:49:16 +0000 Subject: [PATCH] Extended attributes for 2.4 --- ChangeLog | 4 ++ configure.in | 10 ++++- kernel/dir.c | 102 ++++++++++++++++++++++++++++--------------------- kernel/inode.c | 6 --- lib/fuse_i.h | 1 - 5 files changed, 71 insertions(+), 52 deletions(-) diff --git a/ChangeLog b/ChangeLog index f1d3d0d..5631b3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-05-04 Miklos Szeredi + + * Extended attributes support for 2.4 (patch by Cody Pisto) + 2004-04-20 Miklos Szeredi * Fixed parser with modversions (Mattias Wadman) diff --git a/configure.in b/configure.in index cd943fe..a41407b 100644 --- a/configure.in +++ b/configure.in @@ -11,7 +11,7 @@ fi AC_SUBST(LD) CFLAGS="-Wall -W -g -O2" -CPPFLAGS="$(CPPFLAGS) -D_FILE_OFFSET_BITS=64" +CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64" AC_ARG_ENABLE(kernel-module, [ --enable-kernel-module Compile kernel module, requires --with-kernel option ]) @@ -71,6 +71,14 @@ if test "$enable_kernel_module" != "no"; then [#include ]) 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= AC_MSG_CHECKING([if this is user mode linux]) diff --git a/kernel/dir.c b/kernel/dir.c index 73f8043..110a472 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -726,8 +726,53 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) return _fuse_dentry_revalidate(entry); } +#else /* KERNEL_2_6 */ + +#define fuse_create _fuse_create +#define fuse_permission _fuse_permission + +static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry) +{ + struct inode *inode; + struct dentry *alias; + + int err = fuse_lookup_iget(dir, entry, &inode); + if (err) + return ERR_PTR(err); + + if (inode && S_ISDIR(inode->i_mode) && + (alias = d_find_alias(inode)) != NULL) { + dput(alias); + iput(inode); + printk("fuse: cannot assign an existing directory\n"); + return ERR_PTR(-EPROTO); + } + + d_add(entry, inode); + return NULL; +} + +static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode, + int rdev) +{ + return fuse_mknod(dir, entry, mode, rdev); +} + +static int fuse_dentry_revalidate(struct dentry *entry, int flags) +{ + return _fuse_dentry_revalidate(entry); +} +#endif /* KERNEL_2_6 */ + +#ifdef HAVE_KERNEL_XATTR + +#ifdef KERNEL_2_6 static int fuse_setxattr(struct dentry *entry, const char *name, const void *value, size_t size, int flags) +#else +static int fuse_setxattr(struct dentry *entry, const char *name, + void *value, size_t size, int flags) +#endif { struct inode *inode = entry->d_inode; struct fuse_conn *fc = INO_FC(inode); @@ -843,44 +888,7 @@ static int fuse_removexattr(struct dentry *entry, const char *name) } -#else /* KERNEL_2_6 */ - -#define fuse_create _fuse_create -#define fuse_permission _fuse_permission - -static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry) -{ - struct inode *inode; - struct dentry *alias; - - int err = fuse_lookup_iget(dir, entry, &inode); - if (err) - return ERR_PTR(err); - - if (inode && S_ISDIR(inode->i_mode) && - (alias = d_find_alias(inode)) != NULL) { - dput(alias); - iput(inode); - printk("fuse: cannot assign an existing directory\n"); - return ERR_PTR(-EPROTO); - } - - d_add(entry, inode); - return NULL; -} - -static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode, - int rdev) -{ - return fuse_mknod(dir, entry, mode, rdev); -} - -static int fuse_dentry_revalidate(struct dentry *entry, int flags) -{ - return _fuse_dentry_revalidate(entry); -} -#endif /* KERNEL_2_6 */ - +#endif static struct inode_operations fuse_dir_inode_operations = { @@ -897,12 +905,14 @@ static struct inode_operations fuse_dir_inode_operations = .permission = fuse_permission, #ifdef KERNEL_2_6 .getattr = fuse_getattr, +#else + .revalidate = fuse_revalidate, +#endif +#ifdef HAVE_KERNEL_XATTR .setxattr = fuse_setxattr, .getxattr = fuse_getxattr, .listxattr = fuse_listxattr, .removexattr = fuse_removexattr, -#else - .revalidate = fuse_revalidate, #endif }; @@ -918,12 +928,14 @@ static struct inode_operations fuse_file_inode_operations = { .permission = fuse_permission, #ifdef KERNEL_2_6 .getattr = fuse_getattr, +#else + .revalidate = fuse_revalidate, +#endif +#ifdef HAVE_KERNEL_XATTR .setxattr = fuse_setxattr, .getxattr = fuse_getxattr, .listxattr = fuse_listxattr, .removexattr = fuse_removexattr, -#else - .revalidate = fuse_revalidate, #endif }; @@ -934,12 +946,14 @@ static struct inode_operations fuse_symlink_inode_operations = .follow_link = fuse_follow_link, #ifdef KERNEL_2_6 .getattr = fuse_getattr, +#else + .revalidate = fuse_revalidate, +#endif +#ifdef HAVE_KERNEL_XATTR .setxattr = fuse_setxattr, .getxattr = fuse_getxattr, .listxattr = fuse_listxattr, .removexattr = fuse_removexattr, -#else - .revalidate = fuse_revalidate, #endif }; diff --git a/kernel/inode.c b/kernel/inode.c index 3aa3f02..fb02569 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -140,12 +140,6 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d) memset(d, 0, sizeof(struct fuse_mount_data)); d->fd = -1; - if (opt == NULL) - return 0; - - if (opt[PAGE_SIZE - 1] != '\0') - return 0; - while ((p = strsep(&opt, ",")) != NULL) { int token; int value; diff --git a/lib/fuse_i.h b/lib/fuse_i.h index ce81604..3938f29 100644 --- a/lib/fuse_i.h +++ b/lib/fuse_i.h @@ -52,7 +52,6 @@ struct fuse_dirhandle { }; struct fuse_cmd { - struct fuse *f; char *buf; size_t buflen; }; -- 2.30.2