From: Al Viro <viro@zeniv.linux.org.uk>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-fsdevel@vger.kernel.org, brauner@kernel.org,
io-uring@vger.kernel.org, cgzones@googlemail.com
Subject: Re: [PATCH 5/9] replace do_setxattr() with saner helpers.
Date: Wed, 2 Oct 2024 03:08:57 +0100 [thread overview]
Message-ID: <20241002020857.GC4017910@ZenIV> (raw)
In-Reply-To: <12334e67-80a6-4509-9826-90d16483835e@kernel.dk>
On Tue, Oct 01, 2024 at 07:34:12PM -0600, Jens Axboe wrote:
> > -retry:
> > - ret = filename_lookup(AT_FDCWD, ix->filename, lookup_flags, &path, NULL);
> > - if (!ret) {
> > - ret = __io_setxattr(req, issue_flags, &path);
> > - path_put(&path);
> > - if (retry_estale(ret, lookup_flags)) {
> > - lookup_flags |= LOOKUP_REVAL;
> > - goto retry;
> > - }
> > - }
> > -
> > + ret = filename_setxattr(AT_FDCWD, ix->filename, LOOKUP_FOLLOW, &ix->ctx);
> > io_xattr_finish(req, ret);
> > return IOU_OK;
>
> this looks like it needs an ix->filename = NULL, as
> filename_{s,g}xattr() drops the reference. The previous internal helper
> did not, and hence the cleanup always did it. But should work fine if
> ->filename is just zeroed.
>
> Otherwise looks good. I've skimmed the other patches and didn't see
> anything odd, I'll take a closer look tomorrow.
Hmm... I wonder if we would be better off with file{,name}_setxattr()
doing kvfree(cxt->kvalue) - it makes things easier both on the syscall
and on io_uring side.
I've added minimal fixes (zeroing ix->filename after filename_[sg]etxattr())
to 5/9 and 6/9 *and* added a followup calling conventions change at the end
of the branch. See #work.xattr2 in the same tree; FWIW, the followup
cleanup is below; note that putname(ERR_PTR(-Ewhatever)) is an explicit
no-op, so there's no need to zero on getname() failures.
commit 67896be9ac99b3fdef82708dd06e720332c13cdc
Author: Al Viro <viro@zeniv.linux.org.uk>
Date: Tue Oct 1 22:03:16 2024 -0400
saner calling conventions for file{,name}_setxattr()
Have them consume ctx->kvalue. That simplifies both the path_setxattrat()
and io_uring side of things - there io_xattr_finish() is just left to
free the xattr name and that's it.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
diff --git a/fs/xattr.c b/fs/xattr.c
index 59cdb524412e..6bb656941bce 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -672,6 +672,7 @@ int file_setxattr(struct file *f, struct kernel_xattr_ctx *ctx)
error = do_setxattr(file_mnt_idmap(f), f->f_path.dentry, ctx);
mnt_drop_write_file(f);
}
+ kvfree(ctx->kvalue);
return error;
}
@@ -697,6 +698,7 @@ int filename_setxattr(int dfd, struct filename *filename,
}
out:
+ kvfree(ctx->kvalue);
putname(filename);
return error;
}
@@ -731,14 +733,10 @@ static int path_setxattrat(int dfd, const char __user *pathname,
if (!filename) {
CLASS(fd, f)(dfd);
if (fd_empty(f))
- error = -EBADF;
- else
- error = file_setxattr(fd_file(f), &ctx);
- } else {
- error = filename_setxattr(dfd, filename, lookup_flags, &ctx);
+ return -EBADF;
+ return file_setxattr(fd_file(f), &ctx);
}
- kvfree(ctx.kvalue);
- return error;
+ return filename_setxattr(dfd, filename, lookup_flags, &ctx);
}
SYSCALL_DEFINE6(setxattrat, int, dfd, const char __user *, pathname, unsigned int, at_flags,
diff --git a/io_uring/xattr.c b/io_uring/xattr.c
index 90277246dbea..9f3ea12f628d 100644
--- a/io_uring/xattr.c
+++ b/io_uring/xattr.c
@@ -35,9 +35,10 @@ void io_xattr_cleanup(struct io_kiocb *req)
static void io_xattr_finish(struct io_kiocb *req, int ret)
{
- req->flags &= ~REQ_F_NEED_CLEANUP;
+ struct io_xattr *ix = io_kiocb_to_cmd(req, struct io_xattr);
- io_xattr_cleanup(req);
+ kfree(ix->ctx.kname);
+ req->flags &= ~REQ_F_NEED_CLEANUP;
io_req_set_res(req, ret, 0);
}
@@ -94,12 +95,9 @@ int io_getxattr_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
path = u64_to_user_ptr(READ_ONCE(sqe->addr3));
ix->filename = getname(path);
- if (IS_ERR(ix->filename)) {
- ret = PTR_ERR(ix->filename);
- ix->filename = NULL;
- }
-
- return ret;
+ if (IS_ERR(ix->filename))
+ return PTR_ERR(ix->filename);
+ return 0;
}
int io_fgetxattr(struct io_kiocb *req, unsigned int issue_flags)
@@ -122,7 +120,6 @@ int io_getxattr(struct io_kiocb *req, unsigned int issue_flags)
WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
ret = filename_getxattr(AT_FDCWD, ix->filename, LOOKUP_FOLLOW, &ix->ctx);
- ix->filename = NULL;
io_xattr_finish(req, ret);
return IOU_OK;
}
@@ -172,12 +169,9 @@ int io_setxattr_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
path = u64_to_user_ptr(READ_ONCE(sqe->addr3));
ix->filename = getname(path);
- if (IS_ERR(ix->filename)) {
- ret = PTR_ERR(ix->filename);
- ix->filename = NULL;
- }
-
- return ret;
+ if (IS_ERR(ix->filename))
+ return PTR_ERR(ix->filename);
+ return 0;
}
int io_fsetxattr_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
@@ -205,7 +199,6 @@ int io_setxattr(struct io_kiocb *req, unsigned int issue_flags)
WARN_ON_ONCE(issue_flags & IO_URING_F_NONBLOCK);
ret = filename_setxattr(AT_FDCWD, ix->filename, LOOKUP_FOLLOW, &ix->ctx);
- ix->filename = NULL;
io_xattr_finish(req, ret);
return IOU_OK;
}
next prev parent reply other threads:[~2024-10-02 2:08 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-02 1:10 [RFC][PATCHES] xattr stuff and interactions with io_uring Al Viro
2024-10-02 1:22 ` [PATCH 1/9] xattr: switch to CLASS(fd) Al Viro
2024-10-02 1:22 ` [PATCH 2/9] fs: rename struct xattr_ctx to kernel_xattr_ctx Al Viro
2024-10-02 5:56 ` Christian Brauner
2024-10-02 1:22 ` [PATCH 3/9] io_[gs]etxattr_prep(): just use getname() Al Viro
2024-10-02 5:57 ` Christian Brauner
2024-10-02 1:22 ` [PATCH 4/9] new helper: import_xattr_name() Al Viro
2024-10-02 5:57 ` Christian Brauner
2024-10-02 1:22 ` [PATCH 5/9] replace do_setxattr() with saner helpers Al Viro
2024-10-02 1:34 ` Jens Axboe
2024-10-02 2:08 ` Al Viro [this message]
2024-10-02 18:00 ` Jens Axboe
2024-10-02 21:19 ` Al Viro
2024-10-02 22:55 ` Jens Axboe
2024-10-06 5:28 ` Al Viro
2024-10-07 18:09 ` Jens Axboe
2024-10-07 18:20 ` Jens Axboe
2024-10-07 21:20 ` Al Viro
2024-10-07 22:29 ` Jens Axboe
2024-10-07 23:58 ` Al Viro
2024-10-08 1:58 ` Jens Axboe
2024-10-08 4:08 ` Al Viro
2024-10-02 1:22 ` [PATCH 6/9] replace do_getxattr() " Al Viro
2024-10-02 5:59 ` Christian Brauner
2024-10-02 1:22 ` [PATCH 7/9] new helpers: file_listxattr(), filename_listxattr() Al Viro
2024-10-02 6:00 ` Christian Brauner
2024-10-02 1:22 ` [PATCH 8/9] new helpers: file_removexattr(), filename_removexattr() Al Viro
2024-10-02 6:01 ` Christian Brauner
2024-10-02 1:22 ` [PATCH 9/9] fs/xattr: add *at family syscalls Al Viro
2024-10-02 6:03 ` Christian Brauner
2024-10-02 5:56 ` [PATCH 1/9] xattr: switch to CLASS(fd) Christian Brauner
2024-11-02 7:28 ` [RFC][PATCHES v2] xattr stuff and interactions with io_uring Al Viro
2024-11-02 7:31 ` [PATCH v2 01/13] teach filename_lookup() to treat NULL filename as "" Al Viro
2024-11-02 7:31 ` [PATCH v2 02/13] getname_maybe_null() - the third variant of pathname copy-in Al Viro
2024-11-02 7:31 ` [PATCH v2 03/13] io_uring: IORING_OP_F[GS]ETXATTR is fine with REQ_F_FIXED_FILE Al Viro
2024-11-02 7:31 ` [PATCH v2 04/13] io_[gs]etxattr_prep(): just use getname() Al Viro
2024-11-02 14:44 ` Jens Axboe
2024-11-02 7:31 ` [PATCH v2 05/13] xattr: switch to CLASS(fd) Al Viro
2024-11-02 7:31 ` [PATCH v2 06/13] fs: rename struct xattr_ctx to kernel_xattr_ctx Al Viro
2024-11-02 7:31 ` [PATCH v2 07/13] new helper: import_xattr_name() Al Viro
2024-11-02 7:31 ` [PATCH v2 08/13] replace do_setxattr() with saner helpers Al Viro
2024-11-02 7:31 ` [PATCH v2 09/13] replace do_getxattr() " Al Viro
2024-11-02 7:31 ` [PATCH v2 10/13] new helpers: file_listxattr(), filename_listxattr() Al Viro
2024-11-02 7:31 ` [PATCH v2 11/13] new helpers: file_removexattr(), filename_removexattr() Al Viro
2024-11-02 7:31 ` [PATCH v2 12/13] fs/xattr: add *at family syscalls Al Viro
2024-11-02 7:31 ` [PATCH v2 13/13] xattr: remove redundant check on variable err Al Viro
2024-11-02 14:43 ` [RFC][PATCHES v2] xattr stuff and interactions with io_uring Jens Axboe
2024-11-03 6:51 ` Al Viro
2024-11-03 13:57 ` Arnd Bergmann
2024-11-03 18:32 ` Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241002020857.GC4017910@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=cgzones@googlemail.com \
--cc=io-uring@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.