From: Filipe Manana <fdmanana@xxxxxxxx> The previous patches added support for operations to set and get xattrs on regular files and directories, this patch just adds one operation to remove xattrs on files and directories. Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx> --- ltp/fsstress.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index d7ea1da0..ffe78ef7 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -83,6 +83,7 @@ typedef enum { OP_READ, OP_READLINK, OP_READV, + OP_REMOVEXATTR, OP_RENAME, OP_RESVSP, OP_RMDIR, @@ -196,6 +197,7 @@ void insert_f(int, long); void read_f(int, long); void readlink_f(int, long); void readv_f(int, long); +void removexattr_f(int, long); void rename_f(int, long); void resvsp_f(int, long); void rmdir_f(int, long); @@ -249,6 +251,7 @@ opdesc_t ops[] = { { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_READV, "readv", readv_f, 1, 0 }, + { OP_REMOVEXATTR, "removexattr", removexattr_f, 2, 1 }, { OP_RENAME, "rename", rename_f, 2, 1 }, { OP_RESVSP, "resvsp", resvsp_f, 1, 1 }, { OP_RMDIR, "rmdir", rmdir_f, 1, 1 }, @@ -4054,6 +4057,67 @@ readv_f(int opno, long r) } void +removexattr_f(int opno, long r) +{ + int fd; + fent_t *fep; + int e; + pathname_t f; + int v; + char name[18]; + int xattr_num; + DIR *dir = NULL; + + init_pathname(&f); + if (!get_fname(FT_REGFILE | FT_DIRm, r, &f, NULL, &fep, &v)) { + if (v) + printf("%d/%d: removexattr - no filename\n", procid, opno); + free_pathname(&f); + return; + } + fd = open_path(&f, O_WRONLY); + if (fd < 0 && errno == EISDIR) { + dir = opendir_path(&f); + if (dir) + fd = dirfd(dir); + } + e = fd < 0 ? errno : 0; + if (fd < 0) { + if (v) + printf("%d/%d: removexattr - open %s failed %d\n", + procid, opno, f.path, e); + free_pathname(&f); + if (dir) + closedir(dir); + return; + } + check_cwd(); + + /* + * If the file/dir has xattrs, pick one randomly, otherwise attempt to + * remove a xattr that doesn't exist (fremovexattr should fail with + * errno set to ENOATTR (61) in this case). + */ + if (fep->xattr_counter > 0) + xattr_num = (random() % fep->xattr_counter) + 1; + else + xattr_num = 0; + + memcpy(name, "user.x", 6); + sprintf(name + 6, "%d", xattr_num); + + e = fremovexattr(fd, name) < 0 ? errno : 0; + if (v) + printf("%d/%d: removexattr file %s name %s %d\n", + procid, opno, f.path, name, e); + free_pathname(&f); + if (dir) + closedir(dir); + else + close(fd); +} + +void rename_f(int opno, long r) { fent_t *dfep; -- 2.11.0