On 11/30/21 12:33 PM, Dave Chinner wrote: > On Mon, Nov 29, 2021 at 02:15:41PM -0800, Stefan Roesch wrote: >> Summary: >> >> Liburing added support for setxattr. This change adds >> support for this this in fsstress when fsstress is built >> with liburing support. >> >> Signed-off-by: Stefan Roesch <shr@xxxxxx> >> --- >> ltp/fsstress.c | 43 ++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 42 insertions(+), 1 deletion(-) >> >> diff --git a/ltp/fsstress.c b/ltp/fsstress.c >> index 003e0e49..4a5c4afe 100644 >> --- a/ltp/fsstress.c >> +++ b/ltp/fsstress.c >> @@ -4779,6 +4779,43 @@ setattr_f(opnum_t opno, long r) >> close(fd); >> } >> >> +static int >> +io_uring_setxattr(const char *path, const char *name, const void *value, size_t size, >> + int flags) >> +{ >> + struct io_uring_sqe *sqe; >> + struct io_uring_cqe *cqe; >> + int ret; >> + >> + sqe = io_uring_get_sqe(&ring); >> + if (!sqe) { >> + printf("io_uring_get_sqe failed\n"); >> + ret = -1; >> + goto out; >> + } >> + >> + io_uring_prep_setxattr(sqe, name, value, path, flags, size); >> + >> + ret = io_uring_submit_and_wait(&ring, 1); >> + if (ret != 1) { >> + printf("io_uring_submit_and_wait failed, ret=%d\n", ret); >> + ret = -1; >> + goto out; >> + } >> + >> + ret = io_uring_wait_cqe(&ring, &cqe); >> + if (ret < 0) { >> + printf("io_uring_wait_cqe failed, ret=%d\n", ret); >> + goto out; >> + } >> + >> + ret = cqe->res; >> + io_uring_cqe_seen(&ring, cqe); >> + >> +out: >> + return ret; >> +} >> + >> void >> setfattr_f(opnum_t opno, long r) >> { >> @@ -4842,7 +4879,11 @@ setfattr_f(opnum_t opno, long r) >> goto out; >> } >> >> - e = setxattr(f.path, name, value, value_len, flag) < 0 ? errno : 0; >> + if (have_io_uring) >> + e = io_uring_setxattr(f.path, name, value, value_len, flag); >> + else >> + e = setxattr(f.path, name, value, value_len, flag) < 0 ? errno : 0; > > While this is technically correct, it is architecturally wrong. > This replaces testing of the existing setxattr() syscall path on > systems that have io_uring enabled (which is most modern, upstream > test instances). That's a significant regression in test coverage, > especially given that most applications using xattrs do not use > io_uring... > > The io_uring functionality should be added in the same way that > OP_URING_READ/OP_URING_WRITE were added. That is, new > operations were added in addition to the existing syscall based > OP_READ/OP_WRITE, OP_READV/OP_WRITEV and the AIO based versions > OP_AREAD/OP_AWRITE. > > This way fsstress adds the io_uring mechanisms in addition to all > the normal syscall methods it already uses rather than replacing > them. This also allow io_uring operations to race with existing > syscall operations running the same operations on the same files > concurrently... > Dave, thanks for the review. I sent out an updated version (v2) of the patch series that implements the changes as dedicated operations where the user can select what type of operation is preferred. > Cheers, > > Dave. >