From: Stefan Roesch <shr@fb.com>
To: <fstests@vger.kernel.org>, <kernel-team@fb.com>
Cc: <shr@fb.com>
Subject: [PATCH v5 1/2] fstress: add suport for using liburing setxattr
Date: Mon, 20 Dec 2021 10:15:39 -0800 [thread overview]
Message-ID: <20211220181540.1557109-2-shr@fb.com> (raw)
In-Reply-To: <20211220181540.1557109-1-shr@fb.com>
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
next prev parent reply other threads:[~2021-12-20 18:16 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-20 18:15 [PATCH v5 0/2] Add support for using liburing xattr Stefan Roesch
2021-12-20 18:15 ` Stefan Roesch [this message]
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
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=20211220181540.1557109-2-shr@fb.com \
--to=shr@fb.com \
--cc=fstests@vger.kernel.org \
--cc=kernel-team@fb.com \
/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.