* [PATCH v1 0/4] liburing: support xattr functions
@ 2021-11-29 22:14 Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 1/4] liburing: Update io_uring in liburing Stefan Roesch
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Stefan Roesch @ 2021-11-29 22:14 UTC (permalink / raw)
To: io-uring, kernel-team; +Cc: shr
Add xattr support and testing to liburing
Patch 1: liburing: update io_uring
Update io_uring.h with io_uring kernel changes.
Patch 2: liburing: add fsetxattr and setxattr
Add new helper functions for fsetxattr and setxattr support
in liburing.
Patch 3: liburing: add fgetxattr and getxattr
Add new helper functions for fgetxattr and getxattr support
in liburing.
Patch 4: liburing: add new tests for xattr
Adds a new test program to test the xattr support.
There are also patches for io_uring and xfstests:
- Adds xattr support for io_uring
- Add xattr support to fsstress
Stefan Roesch (4):
liburing: Update io_uring in liburing
liburing: add helper functions for setxattr and fsetxattr
liburing: Add helper functions for fgetxattr and getxattr
liburing: Add new test program to verify xattr support
src/include/liburing.h | 47 +++-
src/include/liburing/io_uring.h | 10 +-
test/Makefile | 1 +
test/xattr.c | 425 ++++++++++++++++++++++++++++++++
4 files changed, 480 insertions(+), 3 deletions(-)
create mode 100644 test/xattr.c
Signed-off-by: Stefan Roesch <[email protected]>
base-commit: 509873c4454012c5810c728695c21911c82acdc4
--
2.30.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v1 1/4] liburing: Update io_uring in liburing
2021-11-29 22:14 [PATCH v1 0/4] liburing: support xattr functions Stefan Roesch
@ 2021-11-29 22:14 ` Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 2/4] liburing: add helper functions for setxattr and fsetxattr Stefan Roesch
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Stefan Roesch @ 2021-11-29 22:14 UTC (permalink / raw)
To: io-uring, kernel-team; +Cc: shr
Summary:
Update liburing with the kernel changes in io_uring.
Signed-off-by: Stefan Roesch <[email protected]>
---
src/include/liburing.h | 3 ++-
src/include/liburing/io_uring.h | 10 ++++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/include/liburing.h b/src/include/liburing.h
index 169e098..1c978db 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -258,7 +258,8 @@ static inline void io_uring_prep_rw(int op, struct io_uring_sqe *sqe, int fd,
sqe->buf_index = 0;
sqe->personality = 0;
sqe->file_index = 0;
- sqe->__pad2[0] = sqe->__pad2[1] = 0;
+ sqe->addr3 = 0;
+ sqe->__pad2[0] = 0;
}
/**
diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h
index a7d193d..e5bb6ce 100644
--- a/src/include/liburing/io_uring.h
+++ b/src/include/liburing/io_uring.h
@@ -49,6 +49,7 @@ struct io_uring_sqe {
__u32 rename_flags;
__u32 unlink_flags;
__u32 hardlink_flags;
+ __u32 xattr_flags;
};
__u64 user_data; /* data to be passed back at completion time */
/* pack this to avoid bogus arm OABI complaints */
@@ -64,7 +65,8 @@ struct io_uring_sqe {
__s32 splice_fd_in;
__u32 file_index;
};
- __u64 __pad2[2];
+ __u64 addr3;
+ __u64 __pad2[1];
};
enum {
@@ -147,6 +149,10 @@ enum {
IORING_OP_MKDIRAT,
IORING_OP_SYMLINKAT,
IORING_OP_LINKAT,
+ IORING_OP_FGETXATTR,
+ IORING_OP_FSETXATTR,
+ IORING_OP_GETXATTR,
+ IORING_OP_SETXATTR,
/* this goes last, obviously */
IORING_OP_LAST,
@@ -386,7 +392,7 @@ struct io_uring_probe {
__u8 ops_len; /* length of ops[] array below */
__u16 resv;
__u32 resv2[3];
- struct io_uring_probe_op ops[];
+ struct io_uring_probe_op ops[0];
};
struct io_uring_restriction {
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 2/4] liburing: add helper functions for setxattr and fsetxattr
2021-11-29 22:14 [PATCH v1 0/4] liburing: support xattr functions Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 1/4] liburing: Update io_uring in liburing Stefan Roesch
@ 2021-11-29 22:14 ` Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 3/4] liburing: Add helper functions for fgetxattr and getxattr Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 4/4] liburing: Add new test program to verify xattr support Stefan Roesch
3 siblings, 0 replies; 5+ messages in thread
From: Stefan Roesch @ 2021-11-29 22:14 UTC (permalink / raw)
To: io-uring, kernel-team; +Cc: shr
Summary:
This adds the helper functions for:
- fsetxattr
- setxattr
Signed-off-by: Stefan Roesch <[email protected]>
---
src/include/liburing.h | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/include/liburing.h b/src/include/liburing.h
index 1c978db..38fcc53 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -673,6 +673,29 @@ static inline void io_uring_prep_linkat(struct io_uring_sqe *sqe, int olddfd,
sqe->hardlink_flags = (__u32) flags;
}
+static inline void io_uring_prep_setxattr(struct io_uring_sqe *sqe,
+ const char *name,
+ const char *value,
+ const char *path,
+ int flags,
+ size_t len)
+{
+ io_uring_prep_rw(IORING_OP_SETXATTR, sqe, 0, name, len, (__u64) value);
+ sqe->addr3 = (__u64) path;
+ sqe->xattr_flags = flags;
+}
+
+static inline void io_uring_prep_fsetxattr(struct io_uring_sqe *sqe,
+ int fd,
+ const char *name,
+ const char *value,
+ int flags,
+ size_t len)
+{
+ io_uring_prep_rw(IORING_OP_FSETXATTR, sqe, fd, name, len, (__u64) value);
+ sqe->xattr_flags = flags;
+}
+
/*
* Returns number of unconsumed (if SQPOLL) or unsubmitted entries exist in
* the SQ ring
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 3/4] liburing: Add helper functions for fgetxattr and getxattr
2021-11-29 22:14 [PATCH v1 0/4] liburing: support xattr functions Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 1/4] liburing: Update io_uring in liburing Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 2/4] liburing: add helper functions for setxattr and fsetxattr Stefan Roesch
@ 2021-11-29 22:14 ` Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 4/4] liburing: Add new test program to verify xattr support Stefan Roesch
3 siblings, 0 replies; 5+ messages in thread
From: Stefan Roesch @ 2021-11-29 22:14 UTC (permalink / raw)
To: io-uring, kernel-team; +Cc: shr
Summary:
This adds the helper functions for:
- fgetxattr
- getxattr
Signed-off-by: Stefan Roesch <[email protected]>
---
src/include/liburing.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/src/include/liburing.h b/src/include/liburing.h
index 38fcc53..2e2355f 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -673,6 +673,17 @@ static inline void io_uring_prep_linkat(struct io_uring_sqe *sqe, int olddfd,
sqe->hardlink_flags = (__u32) flags;
}
+static inline void io_uring_prep_getxattr(struct io_uring_sqe *sqe,
+ const char *name,
+ const char *value,
+ const char *path,
+ size_t len)
+{
+ io_uring_prep_rw(IORING_OP_GETXATTR, sqe, 0, name, len, (__u64) value);
+ sqe->addr3 = (__u64) path;
+ sqe->xattr_flags = 0;
+}
+
static inline void io_uring_prep_setxattr(struct io_uring_sqe *sqe,
const char *name,
const char *value,
@@ -685,6 +696,16 @@ static inline void io_uring_prep_setxattr(struct io_uring_sqe *sqe,
sqe->xattr_flags = flags;
}
+static inline void io_uring_prep_fgetxattr(struct io_uring_sqe *sqe,
+ int fd,
+ const char *name,
+ const char *value,
+ size_t len)
+{
+ io_uring_prep_rw(IORING_OP_FGETXATTR, sqe, fd, name, len, (__u64) value);
+ sqe->xattr_flags = 0;
+}
+
static inline void io_uring_prep_fsetxattr(struct io_uring_sqe *sqe,
int fd,
const char *name,
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 4/4] liburing: Add new test program to verify xattr support
2021-11-29 22:14 [PATCH v1 0/4] liburing: support xattr functions Stefan Roesch
` (2 preceding siblings ...)
2021-11-29 22:14 ` [PATCH v1 3/4] liburing: Add helper functions for fgetxattr and getxattr Stefan Roesch
@ 2021-11-29 22:14 ` Stefan Roesch
3 siblings, 0 replies; 5+ messages in thread
From: Stefan Roesch @ 2021-11-29 22:14 UTC (permalink / raw)
To: io-uring, kernel-team; +Cc: shr
Summary:
This adds a new test program to test the xattr support:
- fgetxattr
- fsetxattr
- getxattr
- setxattr
It also includes test cases for failure conditions and
for passing in an invalid sqe. The test case for checking
of invalid SQE, must be enabled by defining
DESTRUCTIVE_TESTING.
Signed-off-by: Stefan Roesch <[email protected]>
---
test/Makefile | 1 +
test/xattr.c | 425 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 426 insertions(+)
create mode 100644 test/xattr.c
diff --git a/test/Makefile b/test/Makefile
index c09078a..aa2da4e 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -147,6 +147,7 @@ test_srcs := \
timeout-overflow.c \
unlink.c \
wakeup-hang.c \
+ xattr.c \
skip-cqe.c \
# EOL
diff --git a/test/xattr.c b/test/xattr.c
new file mode 100644
index 0000000..017017e
--- /dev/null
+++ b/test/xattr.c
@@ -0,0 +1,425 @@
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/xattr.h>
+#include <unistd.h>
+
+#include "helpers.h"
+#include "liburing.h"
+
+/* Define constants. */
+#define XATTR_SIZE 255
+#define QUEUE_DEPTH 32
+
+#define FILENAME "xattr.test"
+#define KEY1 "user.val1"
+#define KEY2 "user.val2"
+#define VALUE1 "value1"
+#define VALUE2 "value2-a-lot-longer"
+
+
+/* Call fsetxattr. */
+int io_uring_fsetxattr(struct io_uring *ring,
+ int fd,
+ 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) {
+ fprintf(stderr, "Error cannot get sqe\n");
+ return -1;
+ }
+
+ io_uring_prep_fsetxattr(sqe, fd, name, value, flags, size);
+
+ ret = io_uring_submit(ring);
+ if (ret != 1) {
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = cqe->res;
+ io_uring_cqe_seen(ring, cqe);
+
+ return ret;
+}
+
+/* Submit fgetxattr request. */
+int io_uring_fgetxattr(struct io_uring *ring,
+ int fd,
+ const char *name,
+ void *value,
+ size_t size)
+{
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ int ret;
+
+ sqe = io_uring_get_sqe(ring);
+ if (!sqe) {
+ fprintf(stderr, "Error cannot get sqe\n");
+ return -1;
+ }
+
+ io_uring_prep_fgetxattr(sqe, fd, name, value, size);
+
+ ret = io_uring_submit(ring);
+ if (ret != 1) {
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = cqe->res;
+ if (ret == -1) {
+ fprintf(stderr, "Error couldn'tget value\n");
+ return -1;
+ }
+
+ io_uring_cqe_seen(ring, cqe);
+ return ret;
+}
+
+/* Call setxattr. */
+int io_uring_setxattr(struct io_uring *ring,
+ 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) {
+ fprintf(stderr, "Error cannot get sqe\n");
+ return -1;
+ }
+
+ io_uring_prep_setxattr(sqe, name, value, path, flags, size);
+
+ ret = io_uring_submit_and_wait(ring, 1);
+ if (ret != 1) {
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = cqe->res;
+ io_uring_cqe_seen(ring, cqe);
+
+ return ret;
+}
+
+/* Submit getxattr request. */
+int io_uring_getxattr(struct io_uring *ring,
+ const char *path,
+ const char *name,
+ void *value,
+ size_t size)
+{
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ int ret;
+
+ sqe = io_uring_get_sqe(ring);
+ if (!sqe) {
+ fprintf(stderr, "Error cannot get sqe\n");
+ return -1;
+ }
+
+ io_uring_prep_getxattr(sqe, name, value, path, size);
+
+ ret = io_uring_submit(ring);
+ if (ret != 1) {
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = cqe->res;
+ if (ret == -1) {
+ fprintf(stderr, "Error couldn'tget value\n");
+ return -1;
+ }
+
+ io_uring_cqe_seen(ring, cqe);
+ return ret;
+}
+
+/* Test driver for fsetxattr and fgetxattr. */
+int test_fxattr(void)
+{
+ int rc = 0;
+ size_t value_len;
+ struct io_uring ring;
+ char value[XATTR_SIZE];
+
+ /* Init io-uring queue. */
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
+ if (ret) {
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
+ return -1;
+ }
+
+ /* Create the test file. */
+ int fd = open(FILENAME, O_CREAT | O_RDWR);
+ if (fd < 0) {
+ fprintf(stderr, "Error: cannot open file: ret=%d\n", fd);
+ return -1;
+ }
+
+ /* Test writing attributes. */
+ if (io_uring_fsetxattr(&ring, fd, KEY1, VALUE1, strlen(VALUE1), 0) == -1) {
+ fprintf(stderr, "Error fsetxattr cannot write key1\n");
+ rc = -1;
+ goto Exit;
+ }
+
+ if (io_uring_fsetxattr(&ring, fd, KEY2, VALUE2, strlen(VALUE2), 0) == -1) {
+ fprintf(stderr, "Error fsetxattr cannot write key1\n");
+ rc = -1;
+ goto Exit;
+ }
+
+ /* Test reading attributes. */
+ value_len = io_uring_fgetxattr(&ring, fd, KEY1, value, XATTR_SIZE);
+ if (value_len != strlen(value) || strncmp(value, VALUE1, value_len)) {
+ fprintf(stderr, "Error: fgetxattr expectd value: %s, returned value: %s\n", VALUE1, value);
+ rc = -1;
+ goto Exit;
+ }
+
+ value_len = io_uring_fgetxattr(&ring, fd, KEY2, value, XATTR_SIZE);
+ if (value_len != strlen(value)|| strncmp(value, VALUE2, value_len)) {
+ fprintf(stderr, "Error: fgetxattr expectd value: %s, returned value: %s\n", VALUE2, value);
+ rc = -1;
+ goto Exit;
+ }
+
+ /* Cleanup. */
+Exit:
+ close(fd);
+ unlink(FILENAME);
+
+ io_uring_queue_exit(&ring);
+
+ return rc;
+}
+
+/* Test driver for setxattr and getxattr. */
+int test_xattr(void)
+{
+ int rc = 0;
+ int value_len;
+ struct io_uring ring;
+ char value[XATTR_SIZE];
+
+ /* Init io-uring queue. */
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
+ if (ret) {
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
+ return -1;
+ }
+
+ /* Create the test file. */
+ t_create_file(FILENAME, 0);
+
+ /* Test writing attributes. */
+ if (io_uring_setxattr(&ring, FILENAME, KEY1, VALUE1, strlen(VALUE1), 0) == -1) {
+ fprintf(stderr, "Error setxattr cannot write key1\n");
+ rc = -1;
+ goto Exit;
+ }
+
+ if (io_uring_setxattr(&ring, FILENAME, KEY2, VALUE2, strlen(VALUE2), 0) == -1) {
+ fprintf(stderr, "Error setxattr cannot write key1\n");
+ rc = -1;
+ goto Exit;
+ }
+
+ /* Test reading attributes. */
+ value_len = io_uring_getxattr(&ring, FILENAME, KEY1, value, XATTR_SIZE);
+ if (value_len != strlen(VALUE1) || strncmp(value, VALUE1, value_len)) {
+ fprintf(stderr, "Error: getxattr expectd value: %s, returned value: %s\n", VALUE1, value);
+ rc = -1;
+ goto Exit;
+ }
+
+ value_len = io_uring_getxattr(&ring, FILENAME, KEY2, value, XATTR_SIZE);
+ if (value_len != strlen(VALUE2) || strncmp(value, VALUE2, value_len)) {
+ fprintf(stderr, "Error: getxattr expectd value: %s, returned value: %s\n", VALUE2, value);
+ rc = -1;
+ goto Exit;
+ }
+
+ /* Cleanup. */
+Exit:
+ io_uring_queue_exit(&ring);
+ unlink(FILENAME);
+
+ return rc;
+}
+
+/* Test driver for failure cases of fsetxattr and fgetxattr. */
+int test_failure_fxattr(void)
+{
+ int rc = 0;
+ struct io_uring ring;
+ char value[XATTR_SIZE];
+
+ /* Init io-uring queue. */
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
+ if (ret) {
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
+ return -1;
+ }
+
+ /* Create the test file. */
+ int fd = open(FILENAME, O_CREAT | O_RDWR);
+ if (fd < 0) {
+ fprintf(stderr, "Error: cannot open file: ret=%d\n", fd);
+ return -1;
+ }
+
+ /* Test writing attributes. */
+ assert(io_uring_fsetxattr(&ring, -1, KEY1, VALUE1, strlen(VALUE1), 0) < 0);
+ assert(io_uring_fsetxattr(&ring, fd, NULL, VALUE1, strlen(VALUE1), 0) < 0);
+ assert(io_uring_fsetxattr(&ring, fd, KEY1, NULL, strlen(VALUE1), 0) < 0);
+ assert(io_uring_fsetxattr(&ring, fd, KEY1, VALUE1, 0, 0) == 0);
+ assert(io_uring_fsetxattr(&ring, fd, KEY1, VALUE1, -1, 0) < 0);
+
+ /* Test reading attributes. */
+ assert(io_uring_fgetxattr(&ring, -1, KEY1, value, XATTR_SIZE) < 0);
+ assert(io_uring_fgetxattr(&ring, fd, NULL, value, XATTR_SIZE) < 0);
+ assert(io_uring_fgetxattr(&ring, fd, KEY1, value, 0) == 0);
+
+ /* Cleanup. */
+ close(fd);
+ unlink(FILENAME);
+
+ io_uring_queue_exit(&ring);
+
+ return rc;
+}
+
+
+/* Test driver for failure cases for setxattr and getxattr. */
+int test_failure_xattr(void)
+{
+ int rc = 0;
+ struct io_uring ring;
+ char value[XATTR_SIZE];
+
+ /* Init io-uring queue. */
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
+ if (ret) {
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
+ return -1;
+ }
+
+ /* Create the test file. */
+ t_create_file(FILENAME, 0);
+
+ /* Test writing attributes. */
+ assert(io_uring_setxattr(&ring, "complete garbage", KEY1, VALUE1, strlen(VALUE1), 0) < 0);
+ assert(io_uring_setxattr(&ring, NULL, KEY1, VALUE1, strlen(VALUE1), 0) < 0);
+ assert(io_uring_setxattr(&ring, FILENAME, NULL, VALUE1, strlen(VALUE1), 0) < 0);
+ assert(io_uring_setxattr(&ring, FILENAME, KEY1, NULL, strlen(VALUE1), 0) < 0);
+ assert(io_uring_setxattr(&ring, FILENAME, KEY1, VALUE1, 0, 0) == 0);
+
+ /* Test reading attributes. */
+ assert(io_uring_getxattr(&ring, "complete garbage", KEY1, value, XATTR_SIZE) < 0);
+ assert(io_uring_getxattr(&ring, NULL, KEY1, value, XATTR_SIZE) < 0);
+ assert(io_uring_getxattr(&ring, FILENAME, NULL, value, XATTR_SIZE) < 0);
+ assert(io_uring_getxattr(&ring, FILENAME, KEY1, NULL, XATTR_SIZE) == 0);
+ assert(io_uring_getxattr(&ring, FILENAME, KEY1, value, 0) == 0);
+
+ /* Cleanup. */
+ io_uring_queue_exit(&ring);
+ unlink(FILENAME);
+
+ return rc;
+}
+
+/* Test for invalid SQE, this will cause a segmentation fault if enabled. */
+int test_invalid_sqe(void)
+{
+#ifdef DESTRUCTIVE_TEST
+ struct io_uring_sqe *sqe = NULL;
+ struct io_uring_cqe *cqe = NULL;
+ struct io_uring ring;
+
+ /* Init io-uring queue. */
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
+ if (ret) {
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
+ return -1;
+ }
+
+ /* Pass invalid SQE. */
+ io_uring_prep_setxattr(sqe, FILENAME, KEY1, VALUE1, strlen(VALUE1), 0);
+
+ ret = io_uring_submit(&ring);
+ if (ret != 1) {
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = io_uring_wait_cqe(&ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
+ return -1;
+ }
+
+ ret = cqe->res;
+ io_uring_cqe_seen(&ring, cqe);
+
+ return ret;
+#else
+ return 0;
+#endif
+}
+
+/* Test driver. */
+int main(int argc, char **argv) {
+ if (test_fxattr()
+ || test_xattr()
+ || test_failure_fxattr()
+ || test_failure_xattr()
+ || test_invalid_sqe())
+ return EXIT_FAILURE;
+
+ return EXIT_SUCCESS;
+}
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-11-29 22:17 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-29 22:14 [PATCH v1 0/4] liburing: support xattr functions Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 1/4] liburing: Update io_uring in liburing Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 2/4] liburing: add helper functions for setxattr and fsetxattr Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 3/4] liburing: Add helper functions for fgetxattr and getxattr Stefan Roesch
2021-11-29 22:14 ` [PATCH v1 4/4] liburing: Add new test program to verify xattr support Stefan Roesch
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox