mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
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:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user