* [PATCH v5 0/2] Add support for using liburing xattr
@ 2021-12-20 18:15 Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 1/2] fstress: add suport for using liburing setxattr Stefan Roesch
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Stefan Roesch @ 2021-12-20 18:15 UTC (permalink / raw)
To: fstests, kernel-team; +Cc: shr
This adds support for using the xattr implementation in liburing.
Patch 1: fstress: add suport for using liburing setxattr
Uses the liburing setxattr implementation in fsstress.
Patch 2: fstress: add suport for using liburing getxattr
Uses the liburing getxattr implementation in fsstress.
There are two additional patch series related to this:
- io_uring: add xattr support
- liburing: add xattr support
---
V5: - fix some whitespace issues, order enum definition in correct
position and rebase
V4: - fix a whitespace/tab issue
V3: - Rebased patch series.
V2: - Introduce dedicated functions for uring getxattr and
uring setxattr, so they are not automatically linked
in if liburing is available.
Stefan Roesch (2):
fstress: add suport for using liburing setxattr
fstress: add suport for using liburing getxattr
ltp/fsstress.c | 244 +++++++++++++++++++++++++++++++++++--------------
1 file changed, 177 insertions(+), 67 deletions(-)
base-commit: 58e358032ac1f50acdb66615c04875d5375a6053
--
2.30.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v5 1/2] fstress: add suport for using liburing setxattr
2021-12-20 18:15 [PATCH v5 0/2] Add support for using liburing xattr Stefan Roesch
@ 2021-12-20 18:15 ` Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 2/2] fstress: add suport for using liburing getxattr Stefan Roesch
2021-12-25 13:40 ` [PATCH v5 0/2] Add support for using liburing xattr Eryu Guan
2 siblings, 0 replies; 4+ messages in thread
From: Stefan Roesch @ 2021-12-20 18:15 UTC (permalink / raw)
To: fstests, kernel-team; +Cc: shr
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@fb.com>
---
ltp/fsstress.c | 181 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 118 insertions(+), 63 deletions(-)
diff --git a/ltp/fsstress.c b/ltp/fsstress.c
index 5f3126e6..bc4db73a 100644
--- a/ltp/fsstress.c
+++ b/ltp/fsstress.c
@@ -142,6 +142,7 @@ typedef enum {
OP_UNLINK,
OP_UNRESVSP,
OP_URING_READ,
+ OP_URING_SETXATTR,
OP_URING_WRITE,
OP_WRITE,
OP_WRITEV,
@@ -151,6 +152,7 @@ typedef enum {
typedef long long opnum_t;
typedef void (*opfnc_t)(opnum_t, long);
+typedef int (*setxattr_cbk)(const char *, const char *, const void *, size_t, int);
typedef struct opdesc {
char *name;
@@ -273,79 +275,81 @@ void truncate_f(opnum_t, long);
void unlink_f(opnum_t, long);
void unresvsp_f(opnum_t, long);
void uring_read_f(opnum_t, long);
+void uring_setxattr_f(opnum_t, long);
void uring_write_f(opnum_t, long);
void write_f(opnum_t, long);
void writev_f(opnum_t, long);
char *xattr_flag_to_string(int);
struct opdesc ops[OP_LAST] = {
- /* [OP_ENUM] = {"name", function, freq, iswrite }, */
- [OP_AFSYNC] = {"afsync", afsync_f, 0, 1 },
- [OP_ALLOCSP] = {"allocsp", allocsp_f, 1, 1 },
- [OP_AREAD] = {"aread", aread_f, 1, 0 },
- [OP_ATTR_REMOVE] = {"attr_remove", attr_remove_f, 0, 1 },
- [OP_ATTR_SET] = {"attr_set", attr_set_f, 0, 1 },
- [OP_AWRITE] = {"awrite", awrite_f, 1, 1 },
- [OP_BULKSTAT] = {"bulkstat", bulkstat_f, 1, 0 },
- [OP_BULKSTAT1] = {"bulkstat1", bulkstat1_f, 1, 0 },
- [OP_CHOWN] = {"chown", chown_f, 3, 1 },
- [OP_CLONERANGE] = {"clonerange", clonerange_f, 4, 1 },
- [OP_COPYRANGE] = {"copyrange", copyrange_f, 4, 1 },
- [OP_CREAT] = {"creat", creat_f, 4, 1 },
- [OP_DEDUPERANGE] = {"deduperange", deduperange_f, 4, 1 },
- [OP_DREAD] = {"dread", dread_f, 4, 0 },
- [OP_DWRITE] = {"dwrite", dwrite_f, 4, 1 },
- [OP_FALLOCATE] = {"fallocate", fallocate_f, 1, 1 },
- [OP_FDATASYNC] = {"fdatasync", fdatasync_f, 1, 1 },
- [OP_FIEMAP] = {"fiemap", fiemap_f, 1, 1 },
- [OP_FREESP] = {"freesp", freesp_f, 1, 1 },
- [OP_FSYNC] = {"fsync", fsync_f, 1, 1 },
- [OP_GETATTR] = {"getattr", getattr_f, 1, 0 },
- [OP_GETDENTS] = {"getdents", getdents_f, 1, 0 },
+ /* [OP_ENUM] = {"name", function, freq, iswrite }, */
+ [OP_AFSYNC] = {"afsync", afsync_f, 0, 1 },
+ [OP_ALLOCSP] = {"allocsp", allocsp_f, 1, 1 },
+ [OP_AREAD] = {"aread", aread_f, 1, 0 },
+ [OP_ATTR_REMOVE] = {"attr_remove", attr_remove_f, 0, 1 },
+ [OP_ATTR_SET] = {"attr_set", attr_set_f, 0, 1 },
+ [OP_AWRITE] = {"awrite", awrite_f, 1, 1 },
+ [OP_BULKSTAT] = {"bulkstat", bulkstat_f, 1, 0 },
+ [OP_BULKSTAT1] = {"bulkstat1", bulkstat1_f, 1, 0 },
+ [OP_CHOWN] = {"chown", chown_f, 3, 1 },
+ [OP_CLONERANGE] = {"clonerange", clonerange_f, 4, 1 },
+ [OP_COPYRANGE] = {"copyrange", copyrange_f, 4, 1 },
+ [OP_CREAT] = {"creat", creat_f, 4, 1 },
+ [OP_DEDUPERANGE] = {"deduperange", deduperange_f, 4, 1 },
+ [OP_DREAD] = {"dread", dread_f, 4, 0 },
+ [OP_DWRITE] = {"dwrite", dwrite_f, 4, 1 },
+ [OP_FALLOCATE] = {"fallocate", fallocate_f, 1, 1 },
+ [OP_FDATASYNC] = {"fdatasync", fdatasync_f, 1, 1 },
+ [OP_FIEMAP] = {"fiemap", fiemap_f, 1, 1 },
+ [OP_FREESP] = {"freesp", freesp_f, 1, 1 },
+ [OP_FSYNC] = {"fsync", fsync_f, 1, 1 },
+ [OP_GETATTR] = {"getattr", getattr_f, 1, 0 },
+ [OP_GETDENTS] = {"getdents", getdents_f, 1, 0 },
/* get extended attribute */
- [OP_GETFATTR] = {"getfattr", getfattr_f, 1, 0 },
- [OP_LINK] = {"link", link_f, 1, 1 },
+ [OP_GETFATTR] = {"getfattr", getfattr_f, 1, 0 },
+ [OP_LINK] = {"link", link_f, 1, 1 },
/* list extent attributes */
- [OP_LISTFATTR] = {"listfattr", listfattr_f, 1, 0 },
- [OP_MKDIR] = {"mkdir", mkdir_f, 2, 1 },
- [OP_MKNOD] = {"mknod", mknod_f, 2, 1 },
- [OP_MREAD] = {"mread", mread_f, 2, 0 },
- [OP_MWRITE] = {"mwrite", mwrite_f, 2, 1 },
- [OP_PUNCH] = {"punch", punch_f, 1, 1 },
- [OP_ZERO] = {"zero", zero_f, 1, 1 },
- [OP_COLLAPSE] = {"collapse", collapse_f, 1, 1 },
- [OP_INSERT] = {"insert", insert_f, 1, 1 },
- [OP_READ] = {"read", read_f, 1, 0 },
- [OP_READLINK] = {"readlink", readlink_f, 1, 0 },
- [OP_READV] = {"readv", readv_f, 1, 0 },
+ [OP_LISTFATTR] = {"listfattr", listfattr_f, 1, 0 },
+ [OP_MKDIR] = {"mkdir", mkdir_f, 2, 1 },
+ [OP_MKNOD] = {"mknod", mknod_f, 2, 1 },
+ [OP_MREAD] = {"mread", mread_f, 2, 0 },
+ [OP_MWRITE] = {"mwrite", mwrite_f, 2, 1 },
+ [OP_PUNCH] = {"punch", punch_f, 1, 1 },
+ [OP_ZERO] = {"zero", zero_f, 1, 1 },
+ [OP_COLLAPSE] = {"collapse", collapse_f, 1, 1 },
+ [OP_INSERT] = {"insert", insert_f, 1, 1 },
+ [OP_READ] = {"read", read_f, 1, 0 },
+ [OP_READLINK] = {"readlink", readlink_f, 1, 0 },
+ [OP_READV] = {"readv", readv_f, 1, 0 },
/* remove (delete) extended attribute */
- [OP_REMOVEFATTR] = {"removefattr", removefattr_f, 1, 1 },
- [OP_RENAME] = {"rename", rename_f, 2, 1 },
- [OP_RNOREPLACE] = {"rnoreplace", rnoreplace_f, 2, 1 },
- [OP_REXCHANGE] = {"rexchange", rexchange_f, 2, 1 },
- [OP_RWHITEOUT] = {"rwhiteout", rwhiteout_f, 2, 1 },
- [OP_RESVSP] = {"resvsp", resvsp_f, 1, 1 },
- [OP_RMDIR] = {"rmdir", rmdir_f, 1, 1 },
+ [OP_REMOVEFATTR] = {"removefattr", removefattr_f, 1, 1 },
+ [OP_RENAME] = {"rename", rename_f, 2, 1 },
+ [OP_RNOREPLACE] = {"rnoreplace", rnoreplace_f, 2, 1 },
+ [OP_REXCHANGE] = {"rexchange", rexchange_f, 2, 1 },
+ [OP_RWHITEOUT] = {"rwhiteout", rwhiteout_f, 2, 1 },
+ [OP_RESVSP] = {"resvsp", resvsp_f, 1, 1 },
+ [OP_RMDIR] = {"rmdir", rmdir_f, 1, 1 },
/* set attribute flag (FS_IOC_SETFLAGS ioctl) */
- [OP_SETATTR] = {"setattr", setattr_f, 0, 1 },
+ [OP_SETATTR] = {"setattr", setattr_f, 0, 1 },
/* set extended attribute */
- [OP_SETFATTR] = {"setfattr", setfattr_f, 2, 1 },
+ [OP_SETFATTR] = {"setfattr", setfattr_f, 2, 1 },
/* set project id (XFS_IOC_FSSETXATTR ioctl) */
- [OP_SETXATTR] = {"setxattr", setxattr_f, 1, 1 },
- [OP_SNAPSHOT] = {"snapshot", snapshot_f, 1, 1 },
- [OP_SPLICE] = {"splice", splice_f, 1, 1 },
- [OP_STAT] = {"stat", stat_f, 1, 0 },
- [OP_SUBVOL_CREATE] = {"subvol_create", subvol_create_f, 1, 1 },
- [OP_SUBVOL_DELETE] = {"subvol_delete", subvol_delete_f, 1, 1 },
- [OP_SYMLINK] = {"symlink", symlink_f, 2, 1 },
- [OP_SYNC] = {"sync", sync_f, 1, 1 },
- [OP_TRUNCATE] = {"truncate", truncate_f, 2, 1 },
- [OP_UNLINK] = {"unlink", unlink_f, 1, 1 },
- [OP_UNRESVSP] = {"unresvsp", unresvsp_f, 1, 1 },
- [OP_URING_READ] = {"uring_read", uring_read_f, 1, 0 },
- [OP_URING_WRITE] = {"uring_write", uring_write_f, 1, 1 },
- [OP_WRITE] = {"write", write_f, 4, 1 },
- [OP_WRITEV] = {"writev", writev_f, 4, 1 },
+ [OP_SETXATTR] = {"setxattr", setxattr_f, 1, 1 },
+ [OP_SNAPSHOT] = {"snapshot", snapshot_f, 1, 1 },
+ [OP_SPLICE] = {"splice", splice_f, 1, 1 },
+ [OP_STAT] = {"stat", stat_f, 1, 0 },
+ [OP_SUBVOL_CREATE] = {"subvol_create", subvol_create_f, 1, 1 },
+ [OP_SUBVOL_DELETE] = {"subvol_delete", subvol_delete_f, 1, 1 },
+ [OP_SYMLINK] = {"symlink", symlink_f, 2, 1 },
+ [OP_SYNC] = {"sync", sync_f, 1, 1 },
+ [OP_TRUNCATE] = {"truncate", truncate_f, 2, 1 },
+ [OP_UNLINK] = {"unlink", unlink_f, 1, 1 },
+ [OP_UNRESVSP] = {"unresvsp", unresvsp_f, 1, 1 },
+ [OP_URING_READ] = {"uring_read", uring_read_f, 1, 0 },
+ [OP_URING_SETXATTR] = {"uring_setxattr", uring_setxattr_f, 1, 1 },
+ [OP_URING_WRITE] = {"uring_write", uring_write_f, 1, 1 },
+ [OP_WRITE] = {"write", write_f, 4, 1 },
+ [OP_WRITEV] = {"writev", writev_f, 4, 1 },
}, *ops_end;
flist_t flist[FT_nft] = {
@@ -4771,8 +4775,45 @@ 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)
+setfattr_f_cbk(opnum_t opno, long r, setxattr_cbk cbk)
{
int e;
pathname_t f;
@@ -4834,7 +4875,7 @@ setfattr_f(opnum_t opno, long r)
goto out;
}
- e = setxattr(f.path, name, value, value_len, flag) < 0 ? errno : 0;
+ e = cbk(f.path, name, value, value_len, flag) < 0 ? errno : 0;
if (e == 0)
fep->xattr_counter++;
if (v)
@@ -4846,6 +4887,20 @@ out:
free_pathname(&f);
}
+void
+uring_setxattr_f(opnum_t opno, long r)
+{
+#ifdef URING
+ setfattr_f_cbk(opno, r, io_uring_setxattr);
+#endif
+}
+
+void
+setfattr_f(opnum_t opno, long r)
+{
+ setfattr_f_cbk(opno, r, setxattr);
+}
+
void
snapshot_f(opnum_t opno, long r)
{
--
2.30.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v5 2/2] fstress: add suport for using liburing getxattr
2021-12-20 18:15 [PATCH v5 0/2] Add support for using liburing xattr Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 1/2] fstress: add suport for using liburing setxattr Stefan Roesch
@ 2021-12-20 18:15 ` Stefan Roesch
2021-12-25 13:40 ` [PATCH v5 0/2] Add support for using liburing xattr Eryu Guan
2 siblings, 0 replies; 4+ messages in thread
From: Stefan Roesch @ 2021-12-20 18:15 UTC (permalink / raw)
To: fstests, kernel-team; +Cc: shr
Liburing added support for getxattr. This change adds
support for this this in fsstress when fsstress is built
with liburing support.
Signed-off-by: Stefan Roesch <shr@fb.com>
---
ltp/fsstress.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 59 insertions(+), 4 deletions(-)
diff --git a/ltp/fsstress.c b/ltp/fsstress.c
index bc4db73a..efd154a6 100644
--- a/ltp/fsstress.c
+++ b/ltp/fsstress.c
@@ -141,6 +141,7 @@ typedef enum {
OP_TRUNCATE,
OP_UNLINK,
OP_UNRESVSP,
+ OP_URING_GETXATTR,
OP_URING_READ,
OP_URING_SETXATTR,
OP_URING_WRITE,
@@ -152,6 +153,7 @@ typedef enum {
typedef long long opnum_t;
typedef void (*opfnc_t)(opnum_t, long);
+typedef ssize_t (*getxattr_cbk)(const char *, const char *, void *, size_t);
typedef int (*setxattr_cbk)(const char *, const char *, const void *, size_t, int);
typedef struct opdesc {
@@ -274,6 +276,7 @@ void sync_f(opnum_t, long);
void truncate_f(opnum_t, long);
void unlink_f(opnum_t, long);
void unresvsp_f(opnum_t, long);
+void uring_getxattr_f(opnum_t, long);
void uring_read_f(opnum_t, long);
void uring_setxattr_f(opnum_t, long);
void uring_write_f(opnum_t, long);
@@ -345,6 +348,7 @@ struct opdesc ops[OP_LAST] = {
[OP_TRUNCATE] = {"truncate", truncate_f, 2, 1 },
[OP_UNLINK] = {"unlink", unlink_f, 1, 1 },
[OP_UNRESVSP] = {"unresvsp", unresvsp_f, 1, 1 },
+ [OP_URING_GETXATTR] = {"uring_getxattr", uring_getxattr_f, 1, 0 },
[OP_URING_READ] = {"uring_read", uring_read_f, 1, 0 },
[OP_URING_SETXATTR] = {"uring_setxattr", uring_setxattr_f, 1, 1 },
[OP_URING_WRITE] = {"uring_write", uring_write_f, 1, 1 },
@@ -3891,8 +3895,44 @@ getdents_f(opnum_t opno, long r)
closedir(dir);
}
-void
-getfattr_f(opnum_t opno, long r)
+static ssize_t
+io_uring_getxattr(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) {
+ printf("io_uring_get_sqe failed\n");
+ ret = -1;
+ goto out;
+ }
+
+ io_uring_prep_getxattr(sqe, name, value, path, 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;
+}
+
+static void
+getfattr_f_cbk(opnum_t opno, long r, getxattr_cbk cbk)
{
fent_t *fep;
int e;
@@ -3928,7 +3968,7 @@ getfattr_f(opnum_t opno, long r)
goto out;
}
- value_len = getxattr(f.path, name, NULL, 0);
+ value_len = cbk(f.path, name, NULL, 0);
if (value_len < 0) {
if (v)
printf("%d/%lld: getfattr file %s name %s failed %d\n",
@@ -3950,7 +3990,8 @@ getfattr_f(opnum_t opno, long r)
goto out;
}
- e = getxattr(f.path, name, value, value_len) < 0 ? errno : 0;
+ e = cbk(f.path, name, value, value_len) < 0 ? errno : 0;
+
out_log:
if (v)
printf("%d/%lld: getfattr file %s name %s value length %d %d\n",
@@ -3960,6 +4001,20 @@ out:
free_pathname(&f);
}
+void
+uring_getxattr_f(opnum_t opno, long r)
+{
+#ifdef URING
+ getfattr_f_cbk(opno, r, io_uring_getxattr);
+#endif
+}
+
+void
+getfattr_f(opnum_t opno, long r)
+{
+ getfattr_f_cbk(opno, r, getxattr);
+}
+
void
link_f(opnum_t opno, long r)
{
--
2.30.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v5 0/2] Add support for using liburing xattr
2021-12-20 18:15 [PATCH v5 0/2] Add support for using liburing xattr Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 1/2] fstress: add suport for using liburing setxattr Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 2/2] fstress: add suport for using liburing getxattr Stefan Roesch
@ 2021-12-25 13:40 ` Eryu Guan
2 siblings, 0 replies; 4+ messages in thread
From: Eryu Guan @ 2021-12-25 13:40 UTC (permalink / raw)
To: Stefan Roesch; +Cc: fstests, kernel-team
On Mon, Dec 20, 2021 at 10:15:38AM -0800, Stefan Roesch wrote:
> This adds support for using the xattr implementation in liburing.
>
> Patch 1: fstress: add suport for using liburing setxattr
> Uses the liburing setxattr implementation in fsstress.
>
> Patch 2: fstress: add suport for using liburing getxattr
> Uses the liburing getxattr implementation in fsstress.
>
> There are two additional patch series related to this:
> - io_uring: add xattr support
> - liburing: add xattr support
I think it may take some time for distributions to pick up this liburing
xattr support, and before that we fail to compile fsstress due to
undefined functions as io_uring_prep_setxattr(). Maybe we should check
if current liburing supports xattr and otherwise use our local
implementation? So this patchset won't be blocked.
Thanks,
Eryu
>
> ---
> V5: - fix some whitespace issues, order enum definition in correct
> position and rebase
> V4: - fix a whitespace/tab issue
> V3: - Rebased patch series.
> V2: - Introduce dedicated functions for uring getxattr and
> uring setxattr, so they are not automatically linked
> in if liburing is available.
>
> Stefan Roesch (2):
> fstress: add suport for using liburing setxattr
> fstress: add suport for using liburing getxattr
>
> ltp/fsstress.c | 244 +++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 177 insertions(+), 67 deletions(-)
>
>
> base-commit: 58e358032ac1f50acdb66615c04875d5375a6053
> --
> 2.30.2
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-12-25 13:40 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-12-20 18:15 [PATCH v5 0/2] Add support for using liburing xattr Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 1/2] fstress: add suport for using liburing setxattr Stefan Roesch
2021-12-20 18:15 ` [PATCH v5 2/2] fstress: add suport for using liburing getxattr Stefan Roesch
2021-12-25 13:40 ` [PATCH v5 0/2] Add support for using liburing xattr Eryu Guan
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.