[patch 3/5] VFS: pass open file to ->xattr()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Miklos Szeredi <[email protected]>

Pass the open file into the filesystem's *xattr() methods.

This is needed to be able to correctly implement open-unlink-f*xattr
semantics, without having to resort to "silly-renaming".

Do this by adding a 'struct file *' parameter to i_op->*xattr().  For
f... variants pass the open file pointer, in other cases pass NULL.

This is safe from a compatibility standpoint, out-of-tree old stuff
will continue to work, but will get a warning at compile time.

Signed-off-by: Miklos Szeredi <[email protected]>
---

Index: linux/fs/bad_inode.c
===================================================================
--- linux.orig/fs/bad_inode.c	2007-09-21 13:45:07.000000000 +0200
+++ linux/fs/bad_inode.c	2007-09-21 13:45:11.000000000 +0200
@@ -261,24 +261,25 @@ static int bad_inode_setattr(struct dent
 }
 
 static int bad_inode_setxattr(struct dentry *dentry, const char *name,
-		const void *value, size_t size, int flags)
+		const void *value, size_t size, int flags, struct file *file)
 {
 	return -EIO;
 }
 
 static ssize_t bad_inode_getxattr(struct dentry *dentry, const char *name,
-			void *buffer, size_t size)
+			void *buffer, size_t size, struct file *file)
 {
 	return -EIO;
 }
 
 static ssize_t bad_inode_listxattr(struct dentry *dentry, char *buffer,
-			size_t buffer_size)
+			size_t buffer_size, struct file *file)
 {
 	return -EIO;
 }
 
-static int bad_inode_removexattr(struct dentry *dentry, const char *name)
+static int bad_inode_removexattr(struct dentry *dentry, const char *name,
+				 struct file *file)
 {
 	return -EIO;
 }
Index: linux/fs/ext2/xattr.c
===================================================================
--- linux.orig/fs/ext2/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ext2/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -328,7 +328,8 @@ cleanup:
  * dentry->d_inode->i_mutex: don't care
  */
 ssize_t
-ext2_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size,
+	       struct file *file)
 {
 	return ext2_xattr_list(dentry->d_inode, buffer, size);
 }
Index: linux/fs/ext2/xattr.h
===================================================================
--- linux.orig/fs/ext2/xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ext2/xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -61,7 +61,7 @@ extern struct xattr_handler ext2_xattr_a
 extern struct xattr_handler ext2_xattr_acl_default_handler;
 extern struct xattr_handler ext2_xattr_security_handler;
 
-extern ssize_t ext2_listxattr(struct dentry *, char *, size_t);
+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t, struct file *);
 
 extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t);
 extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
Index: linux/fs/ext3/xattr.c
===================================================================
--- linux.orig/fs/ext3/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ext3/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -143,7 +143,8 @@ ext3_xattr_handler(int name_index)
  * dentry->d_inode->i_mutex: don't care
  */
 ssize_t
-ext3_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size,
+	       struct file *file)
 {
 	return ext3_xattr_list(dentry->d_inode, buffer, size);
 }
Index: linux/fs/ext3/xattr.h
===================================================================
--- linux.orig/fs/ext3/xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ext3/xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -64,7 +64,7 @@ extern struct xattr_handler ext3_xattr_a
 extern struct xattr_handler ext3_xattr_acl_default_handler;
 extern struct xattr_handler ext3_xattr_security_handler;
 
-extern ssize_t ext3_listxattr(struct dentry *, char *, size_t);
+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t, struct file *);
 
 extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t);
 extern int ext3_xattr_list(struct inode *, char *, size_t);
Index: linux/fs/fuse/dir.c
===================================================================
--- linux.orig/fs/fuse/dir.c	2007-09-21 13:45:07.000000000 +0200
+++ linux/fs/fuse/dir.c	2007-09-21 13:45:11.000000000 +0200
@@ -1118,7 +1118,8 @@ static int fuse_getattr(struct vfsmount 
 }
 
 static int fuse_setxattr(struct dentry *entry, const char *name,
-			 const void *value, size_t size, int flags)
+			 const void *value, size_t size, int flags,
+			 struct file *file)
 {
 	struct inode *inode = entry->d_inode;
 	struct fuse_conn *fc = get_fuse_conn(inode);
@@ -1156,7 +1157,7 @@ static int fuse_setxattr(struct dentry *
 }
 
 static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
-			     void *value, size_t size)
+			     void *value, size_t size, struct file *file)
 {
 	struct inode *inode = entry->d_inode;
 	struct fuse_conn *fc = get_fuse_conn(inode);
@@ -1205,7 +1206,8 @@ static ssize_t fuse_getxattr(struct dent
 	return ret;
 }
 
-static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
+static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size,
+			      struct file *file)
 {
 	struct inode *inode = entry->d_inode;
 	struct fuse_conn *fc = get_fuse_conn(inode);
@@ -1255,7 +1257,8 @@ static ssize_t fuse_listxattr(struct den
 	return ret;
 }
 
-static int fuse_removexattr(struct dentry *entry, const char *name)
+static int fuse_removexattr(struct dentry *entry, const char *name,
+			    struct file *file)
 {
 	struct inode *inode = entry->d_inode;
 	struct fuse_conn *fc = get_fuse_conn(inode);
Index: linux/fs/nfs/nfs3acl.c
===================================================================
--- linux.orig/fs/nfs/nfs3acl.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/nfs/nfs3acl.c	2007-09-21 13:45:11.000000000 +0200
@@ -7,7 +7,8 @@
 
 #define NFSDBG_FACILITY	NFSDBG_PROC
 
-ssize_t nfs3_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ssize_t nfs3_listxattr(struct dentry *dentry, char *buffer, size_t size,
+		       struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct posix_acl *acl;
@@ -47,7 +48,7 @@ ssize_t nfs3_listxattr(struct dentry *de
 }
 
 ssize_t nfs3_getxattr(struct dentry *dentry, const char *name,
-		void *buffer, size_t size)
+		void *buffer, size_t size, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct posix_acl *acl;
@@ -76,7 +77,7 @@ ssize_t nfs3_getxattr(struct dentry *den
 }
 
 int nfs3_setxattr(struct dentry *dentry, const char *name,
-	     const void *value, size_t size, int flags)
+	     const void *value, size_t size, int flags, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct posix_acl *acl;
@@ -98,7 +99,7 @@ int nfs3_setxattr(struct dentry *dentry,
 	return error;
 }
 
-int nfs3_removexattr(struct dentry *dentry, const char *name)
+int nfs3_removexattr(struct dentry *dentry, const char *name, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	int type;
Index: linux/fs/nfs/nfs4_fs.h
===================================================================
--- linux.orig/fs/nfs/nfs4_fs.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/nfs/nfs4_fs.h	2007-09-21 13:45:11.000000000 +0200
@@ -167,9 +167,11 @@ extern struct dentry_operations nfs4_den
 extern const struct inode_operations nfs4_dir_inode_operations;
 
 /* inode.c */
-extern ssize_t nfs4_getxattr(struct dentry *, const char *, void *, size_t);
-extern int nfs4_setxattr(struct dentry *, const char *, const void *, size_t, int);
-extern ssize_t nfs4_listxattr(struct dentry *, char *, size_t);
+extern ssize_t nfs4_getxattr(struct dentry *, const char *, void *, size_t,
+			     struct file *);
+extern int nfs4_setxattr(struct dentry *, const char *, const void *, size_t,
+			 int, struct file *);
+extern ssize_t nfs4_listxattr(struct dentry *, char *, size_t, struct file *);
 
 
 /* nfs4proc.c */
Index: linux/fs/nfs/nfs4proc.c
===================================================================
--- linux.orig/fs/nfs/nfs4proc.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/nfs/nfs4proc.c	2007-09-21 13:45:11.000000000 +0200
@@ -3598,7 +3598,7 @@ out:
 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
 
 int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
-		size_t buflen, int flags)
+		size_t buflen, int flags, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 
@@ -3617,7 +3617,7 @@ int nfs4_setxattr(struct dentry *dentry,
  * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
  * attributes in kernel-managed attribute namespaces. */
 ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
-		size_t buflen)
+		size_t buflen, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 
@@ -3627,7 +3627,8 @@ ssize_t nfs4_getxattr(struct dentry *den
 	return nfs4_proc_get_acl(inode, buf, buflen);
 }
 
-ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
+ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen,
+		       struct file *file)
 {
 	size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
 
Index: linux/fs/revoked_inode.c
===================================================================
--- linux.orig/fs/revoked_inode.c	2007-09-21 13:45:07.000000000 +0200
+++ linux/fs/revoked_inode.c	2007-09-21 13:45:11.000000000 +0200
@@ -306,24 +306,27 @@ static int revoked_inode_setattr(struct 
 }
 
 static int revoked_inode_setxattr(struct dentry *dentry, const char *name,
-				  const void *value, size_t size, int flags)
+				  const void *value, size_t size, int flags,
+				  struct file *file)
 {
 	return -EBADF;
 }
 
 static ssize_t revoked_inode_getxattr(struct dentry *dentry, const char *name,
-				      void *buffer, size_t size)
+				      void *buffer, size_t size,
+				      struct file *file)
 {
 	return -EBADF;
 }
 
 static ssize_t revoked_inode_listxattr(struct dentry *dentry, char *buffer,
-				       size_t buffer_size)
+				       size_t buffer_size, struct file *file)
 {
 	return -EBADF;
 }
 
-static int revoked_inode_removexattr(struct dentry *dentry, const char *name)
+static int revoked_inode_removexattr(struct dentry *dentry, const char *name,
+				     struct file *file)
 {
 	return -EBADF;
 }
Index: linux/fs/xattr.c
===================================================================
--- linux.orig/fs/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -67,9 +67,8 @@ xattr_permission(struct inode *inode, co
 	return permission(inode, mask, NULL);
 }
 
-int
-vfs_setxattr(struct dentry *dentry, char *name, void *value,
-		size_t size, int flags)
+static int vfs_fsetxattr(struct dentry *dentry, char *name, void *value,
+			 size_t size, int flags, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	int error;
@@ -84,7 +83,8 @@ vfs_setxattr(struct dentry *dentry, char
 		goto out;
 	error = -EOPNOTSUPP;
 	if (inode->i_op->setxattr) {
-		error = inode->i_op->setxattr(dentry, name, value, size, flags);
+		error = inode->i_op->setxattr(dentry, name, value, size, flags,
+					      file);
 		if (!error) {
 			fsnotify_xattr(dentry);
 			security_inode_post_setxattr(dentry, name, value,
@@ -102,10 +102,16 @@ out:
 	mutex_unlock(&inode->i_mutex);
 	return error;
 }
+
+int vfs_setxattr(struct dentry *dentry, char *name, void *value,
+		 size_t size, int flags)
+{
+	return vfs_fsetxattr(dentry, name, value, size, flags, NULL);
+}
 EXPORT_SYMBOL_GPL(vfs_setxattr);
 
-ssize_t
-vfs_getxattr(struct dentry *dentry, char *name, void *value, size_t size)
+static ssize_t vfs_fgetxattr(struct dentry *dentry, char *name, void *value,
+			     size_t size, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	int error;
@@ -119,7 +125,7 @@ vfs_getxattr(struct dentry *dentry, char
 		return error;
 
 	if (inode->i_op->getxattr)
-		error = inode->i_op->getxattr(dentry, name, value, size);
+		error = inode->i_op->getxattr(dentry, name, value, size, file);
 	else
 		error = -EOPNOTSUPP;
 
@@ -138,10 +144,17 @@ vfs_getxattr(struct dentry *dentry, char
 
 	return error;
 }
+
+ssize_t vfs_getxattr(struct dentry *dentry, char *name, void *value,
+		     size_t size)
+{
+	return vfs_fgetxattr(dentry, name, value, size, NULL);
+}
 EXPORT_SYMBOL_GPL(vfs_getxattr);
 
-ssize_t
-vfs_listxattr(struct dentry *d, char *list, size_t size)
+
+static ssize_t vfs_flistxattr(struct dentry *d, char *list, size_t size,
+			      struct file *file)
 {
 	ssize_t error;
 
@@ -150,7 +163,7 @@ vfs_listxattr(struct dentry *d, char *li
 		return error;
 	error = -EOPNOTSUPP;
 	if (d->d_inode->i_op && d->d_inode->i_op->listxattr) {
-		error = d->d_inode->i_op->listxattr(d, list, size);
+		error = d->d_inode->i_op->listxattr(d, list, size, file);
 	} else {
 		error = security_inode_listsecurity(d->d_inode, list, size);
 		if (size && error > size)
@@ -158,10 +171,15 @@ vfs_listxattr(struct dentry *d, char *li
 	}
 	return error;
 }
+
+ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size)
+{
+	return vfs_flistxattr(d, list, size, NULL);
+}
 EXPORT_SYMBOL_GPL(vfs_listxattr);
 
-int
-vfs_removexattr(struct dentry *dentry, char *name)
+static int vfs_fremovexattr(struct dentry *dentry, char *name,
+			    struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	int error;
@@ -178,13 +196,18 @@ vfs_removexattr(struct dentry *dentry, c
 		return error;
 
 	mutex_lock(&inode->i_mutex);
-	error = inode->i_op->removexattr(dentry, name);
+	error = inode->i_op->removexattr(dentry, name, file);
 	mutex_unlock(&inode->i_mutex);
 
 	if (!error)
 		fsnotify_xattr(dentry);
 	return error;
 }
+
+int vfs_removexattr(struct dentry *dentry, char *name)
+{
+	return vfs_fremovexattr(dentry, name, NULL);
+}
 EXPORT_SYMBOL_GPL(vfs_removexattr);
 
 
@@ -193,7 +216,7 @@ EXPORT_SYMBOL_GPL(vfs_removexattr);
  */
 static long
 setxattr(struct dentry *d, char __user *name, void __user *value,
-	 size_t size, int flags)
+	 size_t size, int flags, struct file *file)
 {
 	int error;
 	void *kvalue = NULL;
@@ -220,7 +243,7 @@ setxattr(struct dentry *d, char __user *
 		}
 	}
 
-	error = vfs_setxattr(d, kname, kvalue, size, flags);
+	error = vfs_fsetxattr(d, kname, kvalue, size, flags, file);
 	kfree(kvalue);
 	return error;
 }
@@ -235,7 +258,7 @@ sys_setxattr(char __user *path, char __u
 	error = user_path_walk(path, &nd);
 	if (error)
 		return error;
-	error = setxattr(nd.dentry, name, value, size, flags);
+	error = setxattr(nd.dentry, name, value, size, flags, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -250,7 +273,7 @@ sys_lsetxattr(char __user *path, char __
 	error = user_path_walk_link(path, &nd);
 	if (error)
 		return error;
-	error = setxattr(nd.dentry, name, value, size, flags);
+	error = setxattr(nd.dentry, name, value, size, flags, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -268,7 +291,7 @@ sys_fsetxattr(int fd, char __user *name,
 		return error;
 	dentry = f->f_path.dentry;
 	audit_inode(NULL, dentry);
-	error = setxattr(dentry, name, value, size, flags);
+	error = setxattr(dentry, name, value, size, flags, f);
 	fput(f);
 	return error;
 }
@@ -277,7 +300,8 @@ sys_fsetxattr(int fd, char __user *name,
  * Extended attribute GET operations
  */
 static ssize_t
-getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
+getxattr(struct dentry *d, char __user *name, void __user *value, size_t size,
+	 struct file *file)
 {
 	ssize_t error;
 	void *kvalue = NULL;
@@ -297,7 +321,7 @@ getxattr(struct dentry *d, char __user *
 			return -ENOMEM;
 	}
 
-	error = vfs_getxattr(d, kname, kvalue, size);
+	error = vfs_fgetxattr(d, kname, kvalue, size, file);
 	if (error > 0) {
 		if (size && copy_to_user(value, kvalue, error))
 			error = -EFAULT;
@@ -320,7 +344,7 @@ sys_getxattr(char __user *path, char __u
 	error = user_path_walk(path, &nd);
 	if (error)
 		return error;
-	error = getxattr(nd.dentry, name, value, size);
+	error = getxattr(nd.dentry, name, value, size, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -335,7 +359,7 @@ sys_lgetxattr(char __user *path, char __
 	error = user_path_walk_link(path, &nd);
 	if (error)
 		return error;
-	error = getxattr(nd.dentry, name, value, size);
+	error = getxattr(nd.dentry, name, value, size, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -350,7 +374,7 @@ sys_fgetxattr(int fd, char __user *name,
 	if (!f)
 		return error;
 	audit_inode(NULL, f->f_path.dentry);
-	error = getxattr(f->f_path.dentry, name, value, size);
+	error = getxattr(f->f_path.dentry, name, value, size, f);
 	fput(f);
 	return error;
 }
@@ -359,7 +383,7 @@ sys_fgetxattr(int fd, char __user *name,
  * Extended attribute LIST operations
  */
 static ssize_t
-listxattr(struct dentry *d, char __user *list, size_t size)
+listxattr(struct dentry *d, char __user *list, size_t size, struct file *file)
 {
 	ssize_t error;
 	char *klist = NULL;
@@ -372,7 +396,7 @@ listxattr(struct dentry *d, char __user 
 			return -ENOMEM;
 	}
 
-	error = vfs_listxattr(d, klist, size);
+	error = vfs_flistxattr(d, klist, size, file);
 	if (error > 0) {
 		if (size && copy_to_user(list, klist, error))
 			error = -EFAULT;
@@ -394,7 +418,7 @@ sys_listxattr(char __user *path, char __
 	error = user_path_walk(path, &nd);
 	if (error)
 		return error;
-	error = listxattr(nd.dentry, list, size);
+	error = listxattr(nd.dentry, list, size, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -408,7 +432,7 @@ sys_llistxattr(char __user *path, char _
 	error = user_path_walk_link(path, &nd);
 	if (error)
 		return error;
-	error = listxattr(nd.dentry, list, size);
+	error = listxattr(nd.dentry, list, size, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -423,7 +447,7 @@ sys_flistxattr(int fd, char __user *list
 	if (!f)
 		return error;
 	audit_inode(NULL, f->f_path.dentry);
-	error = listxattr(f->f_path.dentry, list, size);
+	error = listxattr(f->f_path.dentry, list, size, f);
 	fput(f);
 	return error;
 }
@@ -432,7 +456,7 @@ sys_flistxattr(int fd, char __user *list
  * Extended attribute REMOVE operations
  */
 static long
-removexattr(struct dentry *d, char __user *name)
+removexattr(struct dentry *d, char __user *name, struct file *file)
 {
 	int error;
 	char kname[XATTR_NAME_MAX + 1];
@@ -443,7 +467,7 @@ removexattr(struct dentry *d, char __use
 	if (error < 0)
 		return error;
 
-	return vfs_removexattr(d, kname);
+	return vfs_fremovexattr(d, kname, file);
 }
 
 asmlinkage long
@@ -455,7 +479,7 @@ sys_removexattr(char __user *path, char 
 	error = user_path_walk(path, &nd);
 	if (error)
 		return error;
-	error = removexattr(nd.dentry, name);
+	error = removexattr(nd.dentry, name, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -469,7 +493,7 @@ sys_lremovexattr(char __user *path, char
 	error = user_path_walk_link(path, &nd);
 	if (error)
 		return error;
-	error = removexattr(nd.dentry, name);
+	error = removexattr(nd.dentry, name, NULL);
 	path_release(&nd);
 	return error;
 }
@@ -486,7 +510,7 @@ sys_fremovexattr(int fd, char __user *na
 		return error;
 	dentry = f->f_path.dentry;
 	audit_inode(NULL, dentry);
-	error = removexattr(dentry, name);
+	error = removexattr(dentry, name, f);
 	fput(f);
 	return error;
 }
@@ -541,7 +565,8 @@ xattr_resolve_name(struct xattr_handler 
  * Find the handler for the prefix and dispatch its get() operation.
  */
 ssize_t
-generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size)
+generic_getxattr(struct dentry *dentry, const char *name, void *buffer,
+		 size_t size, struct file *file)
 {
 	struct xattr_handler *handler;
 	struct inode *inode = dentry->d_inode;
@@ -557,7 +582,8 @@ generic_getxattr(struct dentry *dentry, 
  * list.
  */
 ssize_t
-generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
+generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size,
+		  struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct xattr_handler *handler, **handlers = inode->i_sb->s_xattr;
@@ -585,7 +611,8 @@ generic_listxattr(struct dentry *dentry,
  * Find the handler for the prefix and dispatch its set() operation.
  */
 int
-generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags)
+generic_setxattr(struct dentry *dentry, const char *name, const void *value,
+		 size_t size, int flags, struct file *file)
 {
 	struct xattr_handler *handler;
 	struct inode *inode = dentry->d_inode;
@@ -603,7 +630,7 @@ generic_setxattr(struct dentry *dentry, 
  * any associated extended attribute.
  */
 int
-generic_removexattr(struct dentry *dentry, const char *name)
+generic_removexattr(struct dentry *dentry, const char *name, struct file *file)
 {
 	struct xattr_handler *handler;
 	struct inode *inode = dentry->d_inode;
Index: linux/fs/xfs/linux-2.6/xfs_iops.c
===================================================================
--- linux.orig/fs/xfs/linux-2.6/xfs_iops.c	2007-09-21 13:45:07.000000000 +0200
+++ linux/fs/xfs/linux-2.6/xfs_iops.c	2007-09-21 13:45:11.000000000 +0200
@@ -666,7 +666,8 @@ xfs_vn_setxattr(
 	const char	*name,
 	const void	*data,
 	size_t		size,
-	int		flags)
+	int		flags,
+	struct file	*file)
 {
 	bhv_vnode_t	*vp = vn_from_inode(dentry->d_inode);
 	char		*attr = (char *)name;
@@ -696,7 +697,8 @@ xfs_vn_getxattr(
 	struct dentry	*dentry,
 	const char	*name,
 	void		*data,
-	size_t		size)
+	size_t		size,
+	struct file	*file)
 {
 	bhv_vnode_t	*vp = vn_from_inode(dentry->d_inode);
 	char		*attr = (char *)name;
@@ -725,7 +727,8 @@ STATIC ssize_t
 xfs_vn_listxattr(
 	struct dentry		*dentry,
 	char			*data,
-	size_t			size)
+	size_t			size,
+	struct file		*file)
 {
 	bhv_vnode_t		*vp = vn_from_inode(dentry->d_inode);
 	int			error, xflags = ATTR_KERNAMELS;
@@ -744,7 +747,8 @@ xfs_vn_listxattr(
 STATIC int
 xfs_vn_removexattr(
 	struct dentry	*dentry,
-	const char	*name)
+	const char	*name,
+	struct file	*file)
 {
 	bhv_vnode_t	*vp = vn_from_inode(dentry->d_inode);
 	char		*attr = (char *)name;
Index: linux/include/linux/fs.h
===================================================================
--- linux.orig/include/linux/fs.h	2007-09-21 13:45:07.000000000 +0200
+++ linux/include/linux/fs.h	2007-09-21 13:45:11.000000000 +0200
@@ -1214,10 +1214,12 @@ struct inode_operations {
 	int (*setattr) (struct dentry *, struct iattr *);
 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *,
 			struct file *file);
-	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
-	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-	ssize_t (*listxattr) (struct dentry *, char *, size_t);
-	int (*removexattr) (struct dentry *, const char *);
+	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int,
+			 struct file *);
+	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t,
+			     struct file *);
+	ssize_t (*listxattr) (struct dentry *, char *, size_t, struct file *);
+	int (*removexattr) (struct dentry *, const char *, struct file *);
 	void (*truncate_range)(struct inode *, loff_t, loff_t);
 	long (*fallocate)(struct inode *inode, int mode, loff_t offset,
 			  loff_t len);
Index: linux/include/linux/nfs_fs.h
===================================================================
--- linux.orig/include/linux/nfs_fs.h	2007-09-21 13:45:07.000000000 +0200
+++ linux/include/linux/nfs_fs.h	2007-09-21 13:45:11.000000000 +0200
@@ -343,11 +343,12 @@ static inline struct rpc_cred *nfs_file_
  * linux/fs/nfs/xattr.c
  */
 #ifdef CONFIG_NFS_V3_ACL
-extern ssize_t nfs3_listxattr(struct dentry *, char *, size_t);
-extern ssize_t nfs3_getxattr(struct dentry *, const char *, void *, size_t);
+extern ssize_t nfs3_listxattr(struct dentry *, char *, size_t, struct file *);
+extern ssize_t nfs3_getxattr(struct dentry *, const char *, void *, size_t,
+			     struct file *);
 extern int nfs3_setxattr(struct dentry *, const char *,
-			const void *, size_t, int);
-extern int nfs3_removexattr (struct dentry *, const char *name);
+			const void *, size_t, int, struct file *);
+extern int nfs3_removexattr (struct dentry *, const char *name, struct file *);
 #else
 # define nfs3_listxattr NULL
 # define nfs3_getxattr NULL
Index: linux/include/linux/xattr.h
===================================================================
--- linux.orig/include/linux/xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/include/linux/xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -51,10 +51,14 @@ ssize_t vfs_listxattr(struct dentry *d, 
 int vfs_setxattr(struct dentry *, char *, void *, size_t, int);
 int vfs_removexattr(struct dentry *, char *);
 
-ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size);
-ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
-int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags);
-int generic_removexattr(struct dentry *dentry, const char *name);
+ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer,
+			 size_t size, struct file *);
+ssize_t generic_listxattr(struct dentry *dentry, char *buffer,
+			  size_t buffer_size, struct file *);
+int generic_setxattr(struct dentry *dentry, const char *name,
+		     const void *value, size_t size, int flags, struct file *);
+int generic_removexattr(struct dentry *dentry, const char *name,
+			struct file *);
 
 #endif  /*  __KERNEL__  */
 
Index: linux/fs/ext4/xattr.c
===================================================================
--- linux.orig/fs/ext4/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ext4/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -136,7 +136,8 @@ ext4_xattr_handler(int name_index)
  * dentry->d_inode->i_mutex: don't care
  */
 ssize_t
-ext4_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ext4_listxattr(struct dentry *dentry, char *buffer, size_t size,
+	       struct file *file)
 {
 	return ext4_xattr_list(dentry->d_inode, buffer, size);
 }
Index: linux/fs/ext4/xattr.h
===================================================================
--- linux.orig/fs/ext4/xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ext4/xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -71,7 +71,7 @@ extern struct xattr_handler ext4_xattr_a
 extern struct xattr_handler ext4_xattr_acl_default_handler;
 extern struct xattr_handler ext4_xattr_security_handler;
 
-extern ssize_t ext4_listxattr(struct dentry *, char *, size_t);
+extern ssize_t ext4_listxattr(struct dentry *, char *, size_t, struct file *);
 
 extern int ext4_xattr_get(struct inode *, int, const char *, void *, size_t);
 extern int ext4_xattr_list(struct inode *, char *, size_t);
Index: linux/fs/gfs2/ops_inode.c
===================================================================
--- linux.orig/fs/gfs2/ops_inode.c	2007-09-21 13:45:07.000000000 +0200
+++ linux/fs/gfs2/ops_inode.c	2007-09-21 13:45:11.000000000 +0200
@@ -1064,7 +1064,8 @@ static int gfs2_getattr(struct vfsmount 
 }
 
 static int gfs2_setxattr(struct dentry *dentry, const char *name,
-			 const void *data, size_t size, int flags)
+			 const void *data, size_t size, int flags,
+			 struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct gfs2_ea_request er;
@@ -1084,7 +1085,7 @@ static int gfs2_setxattr(struct dentry *
 }
 
 static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name,
-			     void *data, size_t size)
+			     void *data, size_t size, struct file *file)
 {
 	struct gfs2_ea_request er;
 
@@ -1099,7 +1100,8 @@ static ssize_t gfs2_getxattr(struct dent
 	return gfs2_ea_get(GFS2_I(dentry->d_inode), &er);
 }
 
-static ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
+static ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size,
+			      struct file *file)
 {
 	struct gfs2_ea_request er;
 
@@ -1110,7 +1112,8 @@ static ssize_t gfs2_listxattr(struct den
 	return gfs2_ea_list(GFS2_I(dentry->d_inode), &er);
 }
 
-static int gfs2_removexattr(struct dentry *dentry, const char *name)
+static int gfs2_removexattr(struct dentry *dentry, const char *name,
+			    struct file *file)
 {
 	struct gfs2_ea_request er;
 
Index: linux/fs/hfs/attr.c
===================================================================
--- linux.orig/fs/hfs/attr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/hfs/attr.c	2007-09-21 13:45:11.000000000 +0200
@@ -14,7 +14,8 @@
 #include "btree.h"
 
 int hfs_setxattr(struct dentry *dentry, const char *name,
-		 const void *value, size_t size, int flags)
+		 const void *value, size_t size, int flags,
+		 struct file *unused_file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct hfs_find_data fd;
@@ -57,7 +58,7 @@ out:
 }
 
 ssize_t hfs_getxattr(struct dentry *dentry, const char *name,
-			 void *value, size_t size)
+			 void *value, size_t size, struct file *unused_file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct hfs_find_data fd;
@@ -103,7 +104,8 @@ out:
 
 #define HFS_ATTRLIST_SIZE (sizeof("hfs.creator")+sizeof("hfs.type"))
 
-ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size,
+		      struct file *unused_file)
 {
 	struct inode *inode = dentry->d_inode;
 
Index: linux/fs/hfs/hfs_fs.h
===================================================================
--- linux.orig/fs/hfs/hfs_fs.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/hfs/hfs_fs.h	2007-09-21 13:45:11.000000000 +0200
@@ -197,10 +197,12 @@ extern void hfs_delete_inode(struct inod
 
 /* attr.c */
 extern int hfs_setxattr(struct dentry *dentry, const char *name,
-			const void *value, size_t size, int flags);
+			const void *value, size_t size, int flags,
+			struct file *);
 extern ssize_t hfs_getxattr(struct dentry *dentry, const char *name,
-			    void *value, size_t size);
-extern ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
+			    void *value, size_t size, struct file *);
+extern ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size,
+			     struct file *);
 
 /* mdb.c */
 extern int hfs_mdb_get(struct super_block *);
Index: linux/fs/hfsplus/hfsplus_fs.h
===================================================================
--- linux.orig/fs/hfsplus/hfsplus_fs.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/hfsplus/hfsplus_fs.h	2007-09-21 13:45:11.000000000 +0200
@@ -335,10 +335,11 @@ void hfsplus_delete_inode(struct inode *
 int hfsplus_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
 		  unsigned long arg);
 int hfsplus_setxattr(struct dentry *dentry, const char *name,
-		     const void *value, size_t size, int flags);
+		     const void *value, size_t size, int flags, struct file *);
 ssize_t hfsplus_getxattr(struct dentry *dentry, const char *name,
-			 void *value, size_t size);
-ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size);
+			 void *value, size_t size, struct file *);
+ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size,
+			  struct file *);
 
 /* options.c */
 int hfsplus_parse_options(char *, struct hfsplus_sb_info *);
Index: linux/fs/hfsplus/ioctl.c
===================================================================
--- linux.orig/fs/hfsplus/ioctl.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/hfsplus/ioctl.c	2007-09-21 13:45:11.000000000 +0200
@@ -83,7 +83,8 @@ int hfsplus_ioctl(struct inode *inode, s
 }
 
 int hfsplus_setxattr(struct dentry *dentry, const char *name,
-		     const void *value, size_t size, int flags)
+		     const void *value, size_t size, int flags,
+		     struct file *unused_file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct hfs_find_data fd;
@@ -125,7 +126,7 @@ out:
 }
 
 ssize_t hfsplus_getxattr(struct dentry *dentry, const char *name,
-			 void *value, size_t size)
+			 void *value, size_t size, struct file *unused_file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct hfs_find_data fd;
@@ -170,7 +171,8 @@ out:
 
 #define HFSPLUS_ATTRLIST_SIZE (sizeof("hfs.creator")+sizeof("hfs.type"))
 
-ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size,
+			  struct file *unused_file)
 {
 	struct inode *inode = dentry->d_inode;
 
Index: linux/fs/reiserfs/xattr.c
===================================================================
--- linux.orig/fs/reiserfs/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/reiserfs/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -896,7 +896,7 @@ int reiserfs_chown_xattrs(struct inode *
  */
 ssize_t
 reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
-		  size_t size)
+		  size_t size, struct file *file)
 {
 	struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
 	int err;
@@ -920,7 +920,7 @@ reiserfs_getxattr(struct dentry * dentry
  */
 int
 reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value,
-		  size_t size, int flags)
+		  size_t size, int flags, struct file *file)
 {
 	struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
 	int err;
@@ -950,7 +950,8 @@ reiserfs_setxattr(struct dentry *dentry,
  *
  * dentry->d_inode->i_mutex down
  */
-int reiserfs_removexattr(struct dentry *dentry, const char *name)
+int reiserfs_removexattr(struct dentry *dentry, const char *name,
+			 struct file *file)
 {
 	int err;
 	struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
@@ -1027,7 +1028,8 @@ reiserfs_listxattr_filler(void *buf, con
  *
  * Preliminary locking: we down dentry->d_inode->i_mutex
  */
-ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
+ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size,
+			   struct file *unused_file)
 {
 	struct file *fp;
 	struct dentry *dir;
Index: linux/fs/unionfs/union.h
===================================================================
--- linux.orig/fs/unionfs/union.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/unionfs/union.h	2007-09-21 13:45:11.000000000 +0200
@@ -349,12 +349,14 @@ static inline void unionfs_xattr_kfree(c
 	kfree(p);
 }
 extern ssize_t unionfs_getxattr(struct dentry *dentry, const char *name,
-				void *value, size_t size);
-extern int unionfs_removexattr(struct dentry *dentry, const char *name);
+				void *value, size_t size, struct file *);
+extern int unionfs_removexattr(struct dentry *dentry, const char *name,
+			       struct file *);
 extern ssize_t unionfs_listxattr(struct dentry *dentry, char *list,
-				 size_t size);
+				 size_t size, struct file *);
 extern int unionfs_setxattr(struct dentry *dentry, const char *name,
-			    const void *value, size_t size, int flags);
+			    const void *value, size_t size, int flags,
+			    struct file *);
 #endif /* CONFIG_UNION_FS_XATTR */
 
 /* The root directory is unhashed, but isn't deleted. */
Index: linux/fs/unionfs/xattr.c
===================================================================
--- linux.orig/fs/unionfs/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/unionfs/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -40,7 +40,7 @@ void *unionfs_xattr_alloc(size_t size, s
  * dentry->d_inode->i_mutex locked
  */
 ssize_t unionfs_getxattr(struct dentry *dentry, const char *name, void *value,
-			 size_t size)
+			 size_t size, struct file *file)
 {
 	struct dentry *lower_dentry = NULL;
 	int err = -EOPNOTSUPP;
@@ -69,7 +69,8 @@ out:
  * dentry->d_inode->i_mutex locked
  */
 int unionfs_setxattr(struct dentry *dentry, const char *name,
-		     const void *value, size_t size, int flags)
+		     const void *value, size_t size, int flags,
+		     struct file *file)
 {
 	struct dentry *lower_dentry = NULL;
 	int err = -EOPNOTSUPP;
@@ -98,7 +99,8 @@ out:
  * BKL held by caller.
  * dentry->d_inode->i_mutex locked
  */
-int unionfs_removexattr(struct dentry *dentry, const char *name)
+int unionfs_removexattr(struct dentry *dentry, const char *name,
+			struct file *file)
 {
 	struct dentry *lower_dentry = NULL;
 	int err = -EOPNOTSUPP;
@@ -126,7 +128,8 @@ out:
  * BKL held by caller.
  * dentry->d_inode->i_mutex locked
  */
-ssize_t unionfs_listxattr(struct dentry *dentry, char *list, size_t size)
+ssize_t unionfs_listxattr(struct dentry *dentry, char *list, size_t size,
+			  struct file *file)
 {
 	struct dentry *lower_dentry = NULL;
 	int err = -EOPNOTSUPP;
Index: linux/include/linux/reiserfs_xattr.h
===================================================================
--- linux.orig/include/linux/reiserfs_xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/include/linux/reiserfs_xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -47,11 +47,13 @@ struct reiserfs_xattr_handler {
 #define is_reiserfs_priv_object(inode) IS_PRIVATE(inode)
 #define has_xattr_dir(inode) (REISERFS_I(inode)->i_flags & i_has_xattr_dir)
 ssize_t reiserfs_getxattr(struct dentry *dentry, const char *name,
-			  void *buffer, size_t size);
+			  void *buffer, size_t size, struct file *);
 int reiserfs_setxattr(struct dentry *dentry, const char *name,
-		      const void *value, size_t size, int flags);
-ssize_t reiserfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
-int reiserfs_removexattr(struct dentry *dentry, const char *name);
+		      const void *value, size_t size, int flags, struct file *);
+ssize_t reiserfs_listxattr(struct dentry *dentry, char *buffer, size_t size,
+			   struct file *);
+int reiserfs_removexattr(struct dentry *dentry, const char *name,
+			 struct file *);
 int reiserfs_delete_xattrs(struct inode *inode);
 int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs);
 int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
Index: linux/fs/cifs/cifsfs.h
===================================================================
--- linux.orig/fs/cifs/cifsfs.h	2007-09-21 13:45:07.000000000 +0200
+++ linux/fs/cifs/cifsfs.h	2007-09-21 13:45:11.000000000 +0200
@@ -95,11 +95,12 @@ extern int cifs_readlink(struct dentry *
 			 int buflen);
 extern int cifs_symlink(struct inode *inode, struct dentry *direntry,
 			const char *symname);
-extern int	cifs_removexattr(struct dentry *, const char *);
+extern int	cifs_removexattr(struct dentry *, const char *, struct file *);
 extern int 	cifs_setxattr(struct dentry *, const char *, const void *,
-			size_t, int);
-extern ssize_t	cifs_getxattr(struct dentry *, const char *, void *, size_t);
-extern ssize_t	cifs_listxattr(struct dentry *, char *, size_t);
+			size_t, int, struct file *);
+extern ssize_t	cifs_getxattr(struct dentry *, const char *, void *, size_t,
+			      struct file *);
+extern ssize_t	cifs_listxattr(struct dentry *, char *, size_t, struct file *);
 extern int cifs_ioctl(struct inode *inode, struct file *filep,
 		       unsigned int command, unsigned long arg);
 #define CIFS_VERSION   "1.51"
Index: linux/fs/cifs/xattr.c
===================================================================
--- linux.orig/fs/cifs/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/cifs/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -40,7 +40,8 @@
 
 
 
-int cifs_removexattr(struct dentry *direntry, const char *ea_name)
+int cifs_removexattr(struct dentry *direntry, const char *ea_name,
+		     struct file *file)
 {
 	int rc = -EOPNOTSUPP;
 #ifdef CONFIG_CIFS_XATTR
@@ -94,7 +95,8 @@ remove_ea_exit:
 }
 
 int cifs_setxattr(struct dentry *direntry, const char *ea_name,
-		  const void *ea_value, size_t value_size, int flags)
+		  const void *ea_value, size_t value_size, int flags,
+		  struct file *file)
 {
 	int rc = -EOPNOTSUPP;
 #ifdef CONFIG_CIFS_XATTR
@@ -200,7 +202,7 @@ set_ea_exit:
 }
 
 ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name,
-	void *ea_value, size_t buf_size)
+	void *ea_value, size_t buf_size, struct file *file)
 {
 	ssize_t rc = -EOPNOTSUPP;
 #ifdef CONFIG_CIFS_XATTR
@@ -318,7 +320,8 @@ get_ea_exit:
 	return rc;
 }
 
-ssize_t cifs_listxattr(struct dentry *direntry, char *data, size_t buf_size)
+ssize_t cifs_listxattr(struct dentry *direntry, char *data, size_t buf_size,
+		       struct file *file)
 {
 	ssize_t rc = -EOPNOTSUPP;
 #ifdef CONFIG_CIFS_XATTR
Index: linux/fs/ecryptfs/crypto.c
===================================================================
--- linux.orig/fs/ecryptfs/crypto.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ecryptfs/crypto.c	2007-09-21 13:45:11.000000000 +0200
@@ -1445,7 +1445,7 @@ ecryptfs_write_metadata_to_xattr(struct 
 	int rc;
 
 	rc = ecryptfs_setxattr(ecryptfs_dentry, ECRYPTFS_XATTR_NAME, page_virt,
-			       size, 0);
+			       size, 0, NULL);
 	return rc;
 }
 
@@ -1640,7 +1640,7 @@ int ecryptfs_read_xattr_region(char *pag
 	int rc = 0;
 
 	size = ecryptfs_getxattr(ecryptfs_dentry, ECRYPTFS_XATTR_NAME,
-				 page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE);
+				 page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE, NULL);
 	if (size < 0) {
 		printk(KERN_DEBUG "Error attempting to read the [%s] "
 		       "xattr from the lower file; return value = [%zd]\n",
Index: linux/fs/ecryptfs/ecryptfs_kernel.h
===================================================================
--- linux.orig/fs/ecryptfs/ecryptfs_kernel.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ecryptfs/ecryptfs_kernel.h	2007-09-21 13:45:11.000000000 +0200
@@ -587,10 +587,10 @@ int ecryptfs_open_lower_file(struct file
 			     struct vfsmount *lower_mnt, int flags);
 int ecryptfs_close_lower_file(struct file *lower_file);
 ssize_t ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value,
-			  size_t size);
+			  size_t size, struct file *);
 int
 ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
-		  size_t size, int flags);
+		  size_t size, int flags, struct file *);
 int ecryptfs_read_xattr_region(char *page_virt, struct dentry *ecryptfs_dentry);
 int ecryptfs_process_helo(unsigned int transport, uid_t uid, pid_t pid);
 int ecryptfs_process_quit(uid_t uid, pid_t pid);
Index: linux/fs/ecryptfs/inode.c
===================================================================
--- linux.orig/fs/ecryptfs/inode.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ecryptfs/inode.c	2007-09-21 13:45:11.000000000 +0200
@@ -967,7 +967,7 @@ out:
 
 int
 ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
-		  size_t size, int flags)
+		  size_t size, int flags, struct file *file)
 {
 	int rc = 0;
 	struct dentry *lower_dentry;
@@ -979,7 +979,7 @@ ecryptfs_setxattr(struct dentry *dentry,
 	}
 	mutex_lock(&lower_dentry->d_inode->i_mutex);
 	rc = lower_dentry->d_inode->i_op->setxattr(lower_dentry, name, value,
-						   size, flags);
+						   size, flags, NULL);
 	mutex_unlock(&lower_dentry->d_inode->i_mutex);
 out:
 	return rc;
@@ -987,7 +987,7 @@ out:
 
 ssize_t
 ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value,
-		  size_t size)
+		  size_t size, struct file *file)
 {
 	int rc = 0;
 	struct dentry *lower_dentry;
@@ -999,14 +999,15 @@ ecryptfs_getxattr(struct dentry *dentry,
 	}
 	mutex_lock(&lower_dentry->d_inode->i_mutex);
 	rc = lower_dentry->d_inode->i_op->getxattr(lower_dentry, name, value,
-						   size);
+						   size, NULL);
 	mutex_unlock(&lower_dentry->d_inode->i_mutex);
 out:
 	return rc;
 }
 
 static ssize_t
-ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size)
+ecryptfs_listxattr(struct dentry *dentry, char *list, size_t size,
+		   struct file *file)
 {
 	int rc = 0;
 	struct dentry *lower_dentry;
@@ -1017,13 +1018,15 @@ ecryptfs_listxattr(struct dentry *dentry
 		goto out;
 	}
 	mutex_lock(&lower_dentry->d_inode->i_mutex);
-	rc = lower_dentry->d_inode->i_op->listxattr(lower_dentry, list, size);
+	rc = lower_dentry->d_inode->i_op->listxattr(lower_dentry, list, size,
+						    NULL);
 	mutex_unlock(&lower_dentry->d_inode->i_mutex);
 out:
 	return rc;
 }
 
-static int ecryptfs_removexattr(struct dentry *dentry, const char *name)
+static int ecryptfs_removexattr(struct dentry *dentry, const char *name,
+				struct file *file)
 {
 	int rc = 0;
 	struct dentry *lower_dentry;
@@ -1034,7 +1037,7 @@ static int ecryptfs_removexattr(struct d
 		goto out;
 	}
 	mutex_lock(&lower_dentry->d_inode->i_mutex);
-	rc = lower_dentry->d_inode->i_op->removexattr(lower_dentry, name);
+	rc = lower_dentry->d_inode->i_op->removexattr(lower_dentry, name, NULL);
 	mutex_unlock(&lower_dentry->d_inode->i_mutex);
 out:
 	return rc;
Index: linux/fs/ecryptfs/mmap.c
===================================================================
--- linux.orig/fs/ecryptfs/mmap.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/ecryptfs/mmap.c	2007-09-21 13:45:11.000000000 +0200
@@ -532,7 +532,7 @@ static int ecryptfs_write_inode_size_to_
 	size = lower_dentry->d_inode->i_op->getxattr(lower_dentry,
 						     ECRYPTFS_XATTR_NAME,
 						     xattr_virt,
-						     PAGE_CACHE_SIZE);
+						     PAGE_CACHE_SIZE, NULL);
 	if (!lower_i_mutex_held)
 		mutex_unlock(&lower_dentry->d_inode->i_mutex);
 	if (size < 0)
@@ -544,7 +544,7 @@ static int ecryptfs_write_inode_size_to_
 		mutex_lock(&lower_dentry->d_inode->i_mutex);
 	rc = lower_dentry->d_inode->i_op->setxattr(lower_dentry,
 						   ECRYPTFS_XATTR_NAME,
-						   xattr_virt, size, 0);
+						   xattr_virt, size, 0, NULL);
 	if (!lower_i_mutex_held)
 		mutex_unlock(&lower_dentry->d_inode->i_mutex);
 	if (rc)
Index: linux/fs/jffs2/xattr.c
===================================================================
--- linux.orig/fs/jffs2/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/jffs2/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -947,7 +947,8 @@ static struct xattr_handler *xprefix_to_
 	return ret;
 }
 
-ssize_t jffs2_listxattr(struct dentry *dentry, char *buffer, size_t size)
+ssize_t jffs2_listxattr(struct dentry *dentry, char *buffer, size_t size,
+			struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
Index: linux/fs/jffs2/xattr.h
===================================================================
--- linux.orig/fs/jffs2/xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/jffs2/xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -97,7 +97,7 @@ extern struct xattr_handler *jffs2_xattr
 extern struct xattr_handler jffs2_user_xattr_handler;
 extern struct xattr_handler jffs2_trusted_xattr_handler;
 
-extern ssize_t jffs2_listxattr(struct dentry *, char *, size_t);
+extern ssize_t jffs2_listxattr(struct dentry *, char *, size_t, struct file *);
 #define jffs2_getxattr		generic_getxattr
 #define jffs2_setxattr		generic_setxattr
 #define jffs2_removexattr	generic_removexattr
Index: linux/fs/jfs/jfs_xattr.h
===================================================================
--- linux.orig/fs/jfs/jfs_xattr.h	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/jfs/jfs_xattr.h	2007-09-21 13:45:11.000000000 +0200
@@ -55,11 +55,13 @@ struct jfs_ea_list {
 extern int __jfs_setxattr(tid_t, struct inode *, const char *, const void *,
 			  size_t, int);
 extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t,
-			int);
+			int, struct file *);
 extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t);
-extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t);
-extern ssize_t jfs_listxattr(struct dentry *, char *, size_t);
-extern int jfs_removexattr(struct dentry *, const char *);
+extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t,
+			    struct file *);
+extern ssize_t jfs_listxattr(struct dentry *, char *, size_t,
+			     struct file *);
+extern int jfs_removexattr(struct dentry *, const char *, struct file *);
 
 #ifdef CONFIG_JFS_SECURITY
 extern int jfs_init_security(tid_t, struct inode *, struct inode *);
Index: linux/fs/jfs/xattr.c
===================================================================
--- linux.orig/fs/jfs/xattr.c	2007-09-21 13:44:54.000000000 +0200
+++ linux/fs/jfs/xattr.c	2007-09-21 13:45:11.000000000 +0200
@@ -920,7 +920,7 @@ int __jfs_setxattr(tid_t tid, struct ino
 }
 
 int jfs_setxattr(struct dentry *dentry, const char *name, const void *value,
-		 size_t value_len, int flags)
+		 size_t value_len, int flags, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct jfs_inode_info *ji = JFS_IP(inode);
@@ -1012,7 +1012,7 @@ ssize_t __jfs_getxattr(struct inode *ino
 }
 
 ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
-		     size_t buf_size)
+		     size_t buf_size, struct file *file)
 {
 	int err;
 
@@ -1031,7 +1031,8 @@ static inline int can_list(struct jfs_ea
 		capable(CAP_SYS_ADMIN));
 }
 
-ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
+ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size,
+		      struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	char *buffer;
@@ -1084,7 +1085,7 @@ ssize_t jfs_listxattr(struct dentry * de
 	return size;
 }
 
-int jfs_removexattr(struct dentry *dentry, const char *name)
+int jfs_removexattr(struct dentry *dentry, const char *name, struct file *file)
 {
 	struct inode *inode = dentry->d_inode;
 	struct jfs_inode_info *ji = JFS_IP(inode);
Index: linux/Documentation/filesystems/Locking
===================================================================
--- linux.orig/Documentation/filesystems/Locking	2007-09-21 13:45:07.000000000 +0200
+++ linux/Documentation/filesystems/Locking	2007-09-21 13:45:11.000000000 +0200
@@ -48,10 +48,12 @@ ata *);
 	int (*setattr) (struct dentry *, struct iattr *);
 	int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *,
 			struct file *);
-	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
-	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-	ssize_t (*listxattr) (struct dentry *, char *, size_t);
-	int (*removexattr) (struct dentry *, const char *);
+	int (*setxattr) (struct dentry *, const char *, const void *, size_t,
+			int, struct file *);
+	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t,
+			struct file *);
+	ssize_t (*listxattr) (struct dentry *, char *, size_t, struct file *);
+	int (*removexattr) (struct dentry *, const char *, struct file *);
 
 locking rules:
 	all may block, none have BKL
Index: linux/Documentation/filesystems/vfs.txt
===================================================================
--- linux.orig/Documentation/filesystems/vfs.txt	2007-09-21 13:45:07.000000000 +0200
+++ linux/Documentation/filesystems/vfs.txt	2007-09-21 13:45:11.000000000 +0200
@@ -344,10 +344,12 @@ struct inode_operations {
 	int (*setattr) (struct dentry *, struct iattr *);
 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *,
 			struct file *);
-	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
-	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-	ssize_t (*listxattr) (struct dentry *, char *, size_t);
-	int (*removexattr) (struct dentry *, const char *);
+	int (*setxattr) (struct dentry *, const char *, const void *, size_t,
+			int, struct file *);
+	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t,
+			struct file *);
+	ssize_t (*listxattr) (struct dentry *, char *, size_t, struct file *);
+	int (*removexattr) (struct dentry *, const char *, struct file *);
 	void (*truncate_range)(struct inode *, loff_t, loff_t);
 };
 

--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux