fsstress: add operation for listing xattrs from files and directories

The previous patches added support for operations to set, get and delete
xattrs on regular files and directories, this patch just adds an operation
to list the xattrs of a file/directory.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Filipe Manana
2019-04-19 11:55:00 +01:00
committed by Eryu Guan
parent 0babbf1604
commit 378722046a
+54
View File
@@ -71,6 +71,7 @@ typedef enum {
OP_GETDENTS,
OP_GETFATTR,
OP_LINK,
OP_LISTFATTR,
OP_MKDIR,
OP_MKNOD,
OP_MREAD,
@@ -188,6 +189,7 @@ void getattr_f(int, long);
void getdents_f(int, long);
void getfattr_f(int, long);
void link_f(int, long);
void listfattr_f(int, long);
void mkdir_f(int, long);
void mknod_f(int, long);
void mread_f(int, long);
@@ -244,6 +246,8 @@ opdesc_t ops[] = {
/* get extended attribute */
{ 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 },
@@ -3722,6 +3726,56 @@ link_f(int opno, long r)
free_pathname(&f);
}
void
listfattr_f(int opno, long r)
{
fent_t *fep;
int e;
pathname_t f;
int v;
char *buffer = NULL;
int buffer_len;
init_pathname(&f);
if (!get_fname(FT_REGFILE | FT_DIRm, r, &f, NULL, &fep, &v)) {
if (v)
printf("%d/%d: listfattr - no filename\n", procid, opno);
goto out;
}
check_cwd();
e = listxattr(f.path, NULL, 0);
if (e < 0) {
if (v)
printf("%d/%d: listfattr %s failed %d\n",
procid, opno, f.path, errno);
goto out;
}
buffer_len = e;
if (buffer_len == 0) {
if (v)
printf("%d/%d: listfattr %s - has no extended attributes\n",
procid, opno, f.path);
goto out;
}
buffer = malloc(buffer_len);
if (!buffer) {
if (v)
printf("%d/%d: listfattr %s failed to allocate buffer with %d bytes\n",
procid, opno, f.path, buffer_len);
goto out;
}
e = listxattr(f.path, buffer, buffer_len) < 0 ? errno : 0;
if (v)
printf("%d/%d: listfattr %s buffer length %d %d\n",
procid, opno, f.path, buffer_len, e);
out:
free(buffer);
free_pathname(&f);
}
void
mkdir_f(int opno, long r)
{