Commit 3227e14c authored by Jeff Mahoney's avatar Jeff Mahoney Committed by Al Viro

[PATCH] reiserfs: eliminate private use of struct file in xattr

After several posts and bug reports regarding interaction with the NULL
nameidata, here's a patch to clean up the mess with struct file in the
reiserfs xattr code.

As observed in several of the posts, there's really no need for struct file
to exist in the xattr code.  It was really only passed around due to the
f_op->readdir() and a_ops->{prepare,commit}_write prototypes requiring it.

reiserfs_prepare_write() and reiserfs_commit_write() don't actually use the
struct file passed to it, and the xattr code uses a private version of
reiserfs_readdir() to enumerate the xattr directories.
Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
Acked-by: default avatarAl Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarDave Hansen <haveblue@us.ibm.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent f382d6e6
...@@ -191,28 +191,11 @@ static struct dentry *get_xa_file_dentry(const struct inode *inode, ...@@ -191,28 +191,11 @@ static struct dentry *get_xa_file_dentry(const struct inode *inode,
dput(xadir); dput(xadir);
if (err) if (err)
xafile = ERR_PTR(err); xafile = ERR_PTR(err);
return xafile;
}
/* Opens a file pointer to the attribute associated with inode */
static struct file *open_xa_file(const struct inode *inode, const char *name,
int flags)
{
struct dentry *xafile;
struct file *fp;
xafile = get_xa_file_dentry(inode, name, flags);
if (IS_ERR(xafile))
return ERR_PTR(PTR_ERR(xafile));
else if (!xafile->d_inode) { else if (!xafile->d_inode) {
dput(xafile); dput(xafile);
return ERR_PTR(-ENODATA); xafile = ERR_PTR(-ENODATA);
} }
return xafile;
fp = dentry_open(xafile, NULL, O_RDWR);
/* dentry_open dputs the dentry if it fails */
return fp;
} }
/* /*
...@@ -228,9 +211,8 @@ static struct file *open_xa_file(const struct inode *inode, const char *name, ...@@ -228,9 +211,8 @@ static struct file *open_xa_file(const struct inode *inode, const char *name,
* we're called with i_mutex held, so there are no worries about the directory * we're called with i_mutex held, so there are no worries about the directory
* changing underneath us. * changing underneath us.
*/ */
static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir) static int __xattr_readdir(struct inode *inode, void *dirent, filldir_t filldir)
{ {
struct inode *inode = filp->f_path.dentry->d_inode;
struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */ struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */
INITIALIZE_PATH(path_to_entry); INITIALIZE_PATH(path_to_entry);
struct buffer_head *bh; struct buffer_head *bh;
...@@ -374,23 +356,16 @@ static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -374,23 +356,16 @@ static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir)
* *
*/ */
static static
int xattr_readdir(struct file *file, filldir_t filler, void *buf) int xattr_readdir(struct inode *inode, filldir_t filler, void *buf)
{ {
struct inode *inode = file->f_path.dentry->d_inode; int res = -ENOENT;
int res = -ENOTDIR;
if (!file->f_op || !file->f_op->readdir)
goto out;
mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR); mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR);
// down(&inode->i_zombie);
res = -ENOENT;
if (!IS_DEADDIR(inode)) { if (!IS_DEADDIR(inode)) {
lock_kernel(); lock_kernel();
res = __xattr_readdir(file, buf, filler); res = __xattr_readdir(inode, buf, filler);
unlock_kernel(); unlock_kernel();
} }
// up(&inode->i_zombie);
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
out:
return res; return res;
} }
...@@ -442,7 +417,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, ...@@ -442,7 +417,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
size_t buffer_size, int flags) size_t buffer_size, int flags)
{ {
int err = 0; int err = 0;
struct file *fp; struct dentry *dentry;
struct page *page; struct page *page;
char *data; char *data;
struct address_space *mapping; struct address_space *mapping;
...@@ -460,18 +435,18 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, ...@@ -460,18 +435,18 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
xahash = xattr_hash(buffer, buffer_size); xahash = xattr_hash(buffer, buffer_size);
open_file: open_file:
fp = open_xa_file(inode, name, flags); dentry = get_xa_file_dentry(inode, name, flags);
if (IS_ERR(fp)) { if (IS_ERR(dentry)) {
err = PTR_ERR(fp); err = PTR_ERR(dentry);
goto out; goto out;
} }
xinode = fp->f_path.dentry->d_inode; xinode = dentry->d_inode;
REISERFS_I(inode)->i_flags |= i_has_xattr_dir; REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
/* we need to copy it off.. */ /* we need to copy it off.. */
if (xinode->i_nlink > 1) { if (xinode->i_nlink > 1) {
fput(fp); dput(dentry);
err = reiserfs_xattr_del(inode, name); err = reiserfs_xattr_del(inode, name);
if (err < 0) if (err < 0)
goto out; goto out;
...@@ -485,7 +460,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, ...@@ -485,7 +460,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
newattrs.ia_size = buffer_size; newattrs.ia_size = buffer_size;
newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
mutex_lock_nested(&xinode->i_mutex, I_MUTEX_XATTR); mutex_lock_nested(&xinode->i_mutex, I_MUTEX_XATTR);
err = notify_change(fp->f_path.dentry, &newattrs); err = notify_change(dentry, &newattrs);
if (err) if (err)
goto out_filp; goto out_filp;
...@@ -518,13 +493,12 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, ...@@ -518,13 +493,12 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
rxh->h_hash = cpu_to_le32(xahash); rxh->h_hash = cpu_to_le32(xahash);
} }
err = reiserfs_prepare_write(fp, page, page_offset, err = reiserfs_prepare_write(NULL, page, page_offset,
page_offset + chunk + skip); page_offset + chunk + skip);
if (!err) { if (!err) {
if (buffer) if (buffer)
memcpy(data + skip, buffer + buffer_pos, chunk); memcpy(data + skip, buffer + buffer_pos, chunk);
err = err = reiserfs_commit_write(NULL, page, page_offset,
reiserfs_commit_write(fp, page, page_offset,
page_offset + chunk + page_offset + chunk +
skip); skip);
} }
...@@ -548,7 +522,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer, ...@@ -548,7 +522,7 @@ reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
out_filp: out_filp:
mutex_unlock(&xinode->i_mutex); mutex_unlock(&xinode->i_mutex);
fput(fp); dput(dentry);
out: out:
return err; return err;
...@@ -562,7 +536,7 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer, ...@@ -562,7 +536,7 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer,
size_t buffer_size) size_t buffer_size)
{ {
ssize_t err = 0; ssize_t err = 0;
struct file *fp; struct dentry *dentry;
size_t isize; size_t isize;
size_t file_pos = 0; size_t file_pos = 0;
size_t buffer_pos = 0; size_t buffer_pos = 0;
...@@ -578,13 +552,13 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer, ...@@ -578,13 +552,13 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer,
if (get_inode_sd_version(inode) == STAT_DATA_V1) if (get_inode_sd_version(inode) == STAT_DATA_V1)
return -EOPNOTSUPP; return -EOPNOTSUPP;
fp = open_xa_file(inode, name, FL_READONLY); dentry = get_xa_file_dentry(inode, name, FL_READONLY);
if (IS_ERR(fp)) { if (IS_ERR(dentry)) {
err = PTR_ERR(fp); err = PTR_ERR(dentry);
goto out; goto out;
} }
xinode = fp->f_path.dentry->d_inode; xinode = dentry->d_inode;
isize = xinode->i_size; isize = xinode->i_size;
REISERFS_I(inode)->i_flags |= i_has_xattr_dir; REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
...@@ -652,7 +626,7 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer, ...@@ -652,7 +626,7 @@ reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer,
} }
out_dput: out_dput:
fput(fp); dput(dentry);
out: out:
return err; return err;
...@@ -742,7 +716,6 @@ reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen, ...@@ -742,7 +716,6 @@ reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen,
/* This is called w/ inode->i_mutex downed */ /* This is called w/ inode->i_mutex downed */
int reiserfs_delete_xattrs(struct inode *inode) int reiserfs_delete_xattrs(struct inode *inode)
{ {
struct file *fp;
struct dentry *dir, *root; struct dentry *dir, *root;
int err = 0; int err = 0;
...@@ -763,15 +736,8 @@ int reiserfs_delete_xattrs(struct inode *inode) ...@@ -763,15 +736,8 @@ int reiserfs_delete_xattrs(struct inode *inode)
return 0; return 0;
} }
fp = dentry_open(dir, NULL, O_RDWR);
if (IS_ERR(fp)) {
err = PTR_ERR(fp);
/* dentry_open dputs the dentry if it fails */
goto out;
}
lock_kernel(); lock_kernel();
err = xattr_readdir(fp, reiserfs_delete_xattrs_filler, dir); err = xattr_readdir(dir->d_inode, reiserfs_delete_xattrs_filler, dir);
if (err) { if (err) {
unlock_kernel(); unlock_kernel();
goto out_dir; goto out_dir;
...@@ -791,7 +757,7 @@ int reiserfs_delete_xattrs(struct inode *inode) ...@@ -791,7 +757,7 @@ int reiserfs_delete_xattrs(struct inode *inode)
unlock_kernel(); unlock_kernel();
out_dir: out_dir:
fput(fp); dput(dir);
out: out:
if (!err) if (!err)
...@@ -833,7 +799,6 @@ reiserfs_chown_xattrs_filler(void *buf, const char *name, int namelen, ...@@ -833,7 +799,6 @@ reiserfs_chown_xattrs_filler(void *buf, const char *name, int namelen,
int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
{ {
struct file *fp;
struct dentry *dir; struct dentry *dir;
int err = 0; int err = 0;
struct reiserfs_chown_buf buf; struct reiserfs_chown_buf buf;
...@@ -857,13 +822,6 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) ...@@ -857,13 +822,6 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
goto out; goto out;
} }
fp = dentry_open(dir, NULL, O_RDWR);
if (IS_ERR(fp)) {
err = PTR_ERR(fp);
/* dentry_open dputs the dentry if it fails */
goto out;
}
lock_kernel(); lock_kernel();
attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME); attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME);
...@@ -871,7 +829,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) ...@@ -871,7 +829,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
buf.attrs = attrs; buf.attrs = attrs;
buf.inode = inode; buf.inode = inode;
err = xattr_readdir(fp, reiserfs_chown_xattrs_filler, &buf); err = xattr_readdir(dir->d_inode, reiserfs_chown_xattrs_filler, &buf);
if (err) { if (err) {
unlock_kernel(); unlock_kernel();
goto out_dir; goto out_dir;
...@@ -881,7 +839,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs) ...@@ -881,7 +839,7 @@ int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
unlock_kernel(); unlock_kernel();
out_dir: out_dir:
fput(fp); dput(dir);
out: out:
attrs->ia_valid = ia_valid; attrs->ia_valid = ia_valid;
...@@ -1029,7 +987,6 @@ reiserfs_listxattr_filler(void *buf, const char *name, int namelen, ...@@ -1029,7 +987,6 @@ reiserfs_listxattr_filler(void *buf, const char *name, int namelen,
*/ */
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 *fp;
struct dentry *dir; struct dentry *dir;
int err = 0; int err = 0;
struct reiserfs_listxattr_buf buf; struct reiserfs_listxattr_buf buf;
...@@ -1052,13 +1009,6 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) ...@@ -1052,13 +1009,6 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
goto out; goto out;
} }
fp = dentry_open(dir, NULL, O_RDWR);
if (IS_ERR(fp)) {
err = PTR_ERR(fp);
/* dentry_open dputs the dentry if it fails */
goto out;
}
buf.r_buf = buffer; buf.r_buf = buffer;
buf.r_size = buffer ? size : 0; buf.r_size = buffer ? size : 0;
buf.r_pos = 0; buf.r_pos = 0;
...@@ -1066,7 +1016,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) ...@@ -1066,7 +1016,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir; REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir;
err = xattr_readdir(fp, reiserfs_listxattr_filler, &buf); err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf);
if (err) if (err)
goto out_dir; goto out_dir;
...@@ -1076,7 +1026,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size) ...@@ -1076,7 +1026,7 @@ ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
err = buf.r_pos; err = buf.r_pos;
out_dir: out_dir:
fput(fp); dput(dir);
out: out:
reiserfs_read_unlock_xattr_i(dentry->d_inode); reiserfs_read_unlock_xattr_i(dentry->d_inode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment