lkml.org 
[lkml]   [2007]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[patch 3/5] VFS: pass open file to ->xattr()
From: Miklos Szeredi <mszeredi@suse.cz>

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 <mszeredi@suse.cz>
---

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 majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2007-09-21 14:39    [W:0.464 / U:0.428 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site