Commit b10298d5 authored by Jann Horn's avatar Jann Horn Committed by Linus Torvalds

reiserfs: propagate errors from fill_with_dentries() properly

fill_with_dentries() failed to propagate errors up to
reiserfs_for_each_xattr() properly.  Plumb them through.

Note that reiserfs_for_each_xattr() is only used by
reiserfs_delete_xattrs() and reiserfs_chown_xattrs().  The result of
reiserfs_delete_xattrs() is discarded anyway, the only difference there is
whether a warning is printed to dmesg.  The result of
reiserfs_chown_xattrs() does matter because it can block chowning of the
file to which the xattrs belong; but either way, the resulting state can
have misaligned ownership, so my patch doesn't improve things greatly.

Credit for making me look at this code goes to Al Viro, who pointed out
that the ->actor calling convention is suboptimal and should be changed.

Link: http://lkml.kernel.org/r/20180802163335.83312-1-jannh@google.comSigned-off-by: default avatarJann Horn <jannh@google.com>
Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Cc: Jeff Mahoney <jeffm@suse.com>
Cc: Eric Biggers <ebiggers@google.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6c9a3f84
...@@ -185,6 +185,7 @@ struct reiserfs_dentry_buf { ...@@ -185,6 +185,7 @@ struct reiserfs_dentry_buf {
struct dir_context ctx; struct dir_context ctx;
struct dentry *xadir; struct dentry *xadir;
int count; int count;
int err;
struct dentry *dentries[8]; struct dentry *dentries[8];
}; };
...@@ -207,6 +208,7 @@ fill_with_dentries(struct dir_context *ctx, const char *name, int namelen, ...@@ -207,6 +208,7 @@ fill_with_dentries(struct dir_context *ctx, const char *name, int namelen,
dentry = lookup_one_len(name, dbuf->xadir, namelen); dentry = lookup_one_len(name, dbuf->xadir, namelen);
if (IS_ERR(dentry)) { if (IS_ERR(dentry)) {
dbuf->err = PTR_ERR(dentry);
return PTR_ERR(dentry); return PTR_ERR(dentry);
} else if (d_really_is_negative(dentry)) { } else if (d_really_is_negative(dentry)) {
/* A directory entry exists, but no file? */ /* A directory entry exists, but no file? */
...@@ -215,6 +217,7 @@ fill_with_dentries(struct dir_context *ctx, const char *name, int namelen, ...@@ -215,6 +217,7 @@ fill_with_dentries(struct dir_context *ctx, const char *name, int namelen,
"not found for file %pd.\n", "not found for file %pd.\n",
dentry, dbuf->xadir); dentry, dbuf->xadir);
dput(dentry); dput(dentry);
dbuf->err = -EIO;
return -EIO; return -EIO;
} }
...@@ -262,6 +265,10 @@ static int reiserfs_for_each_xattr(struct inode *inode, ...@@ -262,6 +265,10 @@ static int reiserfs_for_each_xattr(struct inode *inode,
err = reiserfs_readdir_inode(d_inode(dir), &buf.ctx); err = reiserfs_readdir_inode(d_inode(dir), &buf.ctx);
if (err) if (err)
break; break;
if (buf.err) {
err = buf.err;
break;
}
if (!buf.count) if (!buf.count)
break; break;
for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) { for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) {
......
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