aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--configure.in10
-rw-r--r--kernel/dir.c102
-rw-r--r--kernel/inode.c6
-rw-r--r--lib/fuse_i.h1
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 <mszeredi@inf.bme.hu>
+
+ * Extended attributes support for 2.4 (patch by Cody Pisto)
+
2004-04-20 Miklos Szeredi <mszeredi@inf.bme.hu>
* 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 <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=
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;
};