On 6/3/21 6:18 AM, Dmitry Kadashev wrote: > IORING_OP_LINKAT behaves like linkat(2) and takes the same flags and > arguments. > > In some internal places 'hardlink' is used instead of 'link' to avoid > confusion with the SQE links. Name 'link' conflicts with the existing > 'link' member of io_kiocb. > > Suggested-by: Christian Brauner <christian.brauner@xxxxxxxxxx> > Link: https://lore.kernel.org/io-uring/20210514145259.wtl4xcsp52woi6ab@wittgenstein/ > Signed-off-by: Dmitry Kadashev <dkadashev@xxxxxxxxx> > --- > fs/internal.h | 2 ++ > fs/io_uring.c | 67 +++++++++++++++++++++++++++++++++++ > fs/namei.c | 2 +- > include/uapi/linux/io_uring.h | 2 ++ > 4 files changed, 72 insertions(+), 1 deletion(-) > > diff --git a/fs/internal.h b/fs/internal.h > index 3b3954214385..15a7d210cc67 100644 > --- a/fs/internal.h > +++ b/fs/internal.h [...] > + > +static int io_linkat(struct io_kiocb *req, int issue_flags) > +{ > + struct io_hardlink *lnk = &req->hardlink; > + int ret; > + > + if (issue_flags & IO_URING_F_NONBLOCK) > + return -EAGAIN; > + > + ret = do_linkat(lnk->old_dfd, lnk->oldpath, lnk->new_dfd, > + lnk->newpath, lnk->flags); I'm curious, what's difference b/w SYMLINK and just LINK that one doesn't use old_dfd and another does? Can it be supported/wished by someone in the future? In that case I'd rather reserve and verify a field for old_dfd for both, even if one won't really support it for now. > + > + req->flags &= ~REQ_F_NEED_CLEANUP; > + if (ret < 0) > + req_set_fail(req); > + io_req_complete(req, ret); > + return 0; > +} > + -- Pavel Begunkov