1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) 2021 FUJITSU LIMITED. All rights reserved.
4*49cdfc7eSAndroid Build Coastguard Worker * Author: Yang Xu <[email protected]>
5*49cdfc7eSAndroid Build Coastguard Worker */
6*49cdfc7eSAndroid Build Coastguard Worker
7*49cdfc7eSAndroid Build Coastguard Worker /*\
8*49cdfc7eSAndroid Build Coastguard Worker * [Description]
9*49cdfc7eSAndroid Build Coastguard Worker *
10*49cdfc7eSAndroid Build Coastguard Worker * This case tests whether the attributes field of statx received expected value
11*49cdfc7eSAndroid Build Coastguard Worker * by using flags in the stx_attributes_mask field of statx.
12*49cdfc7eSAndroid Build Coastguard Worker * File set with following flags by using SAFE_IOCTL:
13*49cdfc7eSAndroid Build Coastguard Worker *
14*49cdfc7eSAndroid Build Coastguard Worker * - STATX_ATTR_COMPRESSED: The file is compressed by the filesystem.
15*49cdfc7eSAndroid Build Coastguard Worker * - STATX_ATTR_IMMUTABLE: The file cannot be modified.
16*49cdfc7eSAndroid Build Coastguard Worker * - STATX_ATTR_APPEND: The file can only be opened in append mode for writing.
17*49cdfc7eSAndroid Build Coastguard Worker * - STATX_ATTR_NODUMP: File is not a candidate for backup when a backup
18*49cdfc7eSAndroid Build Coastguard Worker * program such as dump(8) is run.
19*49cdfc7eSAndroid Build Coastguard Worker *
20*49cdfc7eSAndroid Build Coastguard Worker * Two directories are tested.
21*49cdfc7eSAndroid Build Coastguard Worker * First directory has all flags set. Second directory has no flags set.
22*49cdfc7eSAndroid Build Coastguard Worker */
23*49cdfc7eSAndroid Build Coastguard Worker
24*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
25*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
26*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/fs.h"
27*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
28*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/stat.h"
29*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/fcntl.h"
30*49cdfc7eSAndroid Build Coastguard Worker
31*49cdfc7eSAndroid Build Coastguard Worker #define MOUNT_POINT "mntpoint"
32*49cdfc7eSAndroid Build Coastguard Worker #define TESTDIR_FLAGGED MOUNT_POINT"/test_dir1"
33*49cdfc7eSAndroid Build Coastguard Worker #define TESTDIR_UNFLAGGED MOUNT_POINT"/test_dir2"
34*49cdfc7eSAndroid Build Coastguard Worker
35*49cdfc7eSAndroid Build Coastguard Worker static int fd, clear_flags;
36*49cdfc7eSAndroid Build Coastguard Worker static int supp_compr = 1, supp_append = 1, supp_immutable = 1, supp_nodump = 1;
37*49cdfc7eSAndroid Build Coastguard Worker
run(unsigned int flag)38*49cdfc7eSAndroid Build Coastguard Worker static void run(unsigned int flag)
39*49cdfc7eSAndroid Build Coastguard Worker {
40*49cdfc7eSAndroid Build Coastguard Worker struct statx buf;
41*49cdfc7eSAndroid Build Coastguard Worker
42*49cdfc7eSAndroid Build Coastguard Worker TEST(statx(AT_FDCWD, flag ? TESTDIR_FLAGGED : TESTDIR_UNFLAGGED, 0, 0, &buf));
43*49cdfc7eSAndroid Build Coastguard Worker if (TST_RET == 0)
44*49cdfc7eSAndroid Build Coastguard Worker tst_res(TPASS,
45*49cdfc7eSAndroid Build Coastguard Worker "sys_statx(AT_FDCWD, %s, 0, 0, &buf)",
46*49cdfc7eSAndroid Build Coastguard Worker flag ? TESTDIR_FLAGGED : TESTDIR_UNFLAGGED);
47*49cdfc7eSAndroid Build Coastguard Worker else
48*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TFAIL | TTERRNO,
49*49cdfc7eSAndroid Build Coastguard Worker "sys_statx(AT_FDCWD, %s, 0, 0, &buf)",
50*49cdfc7eSAndroid Build Coastguard Worker flag ? TESTDIR_FLAGGED : TESTDIR_UNFLAGGED);
51*49cdfc7eSAndroid Build Coastguard Worker
52*49cdfc7eSAndroid Build Coastguard Worker if (supp_compr) {
53*49cdfc7eSAndroid Build Coastguard Worker if (buf.stx_attributes & STATX_ATTR_COMPRESSED)
54*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TPASS : TFAIL,
55*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_COMPRESSED flag is set");
56*49cdfc7eSAndroid Build Coastguard Worker else
57*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TFAIL : TPASS,
58*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_COMPRESSED flag is not set");
59*49cdfc7eSAndroid Build Coastguard Worker }
60*49cdfc7eSAndroid Build Coastguard Worker if (supp_append) {
61*49cdfc7eSAndroid Build Coastguard Worker if (buf.stx_attributes & STATX_ATTR_APPEND)
62*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TPASS : TFAIL,
63*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_APPEND flag is set");
64*49cdfc7eSAndroid Build Coastguard Worker else
65*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TFAIL : TPASS,
66*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_APPEND flag is not set");
67*49cdfc7eSAndroid Build Coastguard Worker }
68*49cdfc7eSAndroid Build Coastguard Worker if (supp_immutable) {
69*49cdfc7eSAndroid Build Coastguard Worker if (buf.stx_attributes & STATX_ATTR_IMMUTABLE)
70*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TPASS : TFAIL,
71*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_IMMUTABLE flag is set");
72*49cdfc7eSAndroid Build Coastguard Worker else
73*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TFAIL : TPASS,
74*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_IMMUTABLE flag is not set");
75*49cdfc7eSAndroid Build Coastguard Worker }
76*49cdfc7eSAndroid Build Coastguard Worker if (supp_nodump) {
77*49cdfc7eSAndroid Build Coastguard Worker if (buf.stx_attributes & STATX_ATTR_NODUMP)
78*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TPASS : TFAIL,
79*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_NODUMP flag is set");
80*49cdfc7eSAndroid Build Coastguard Worker else
81*49cdfc7eSAndroid Build Coastguard Worker tst_res(flag ? TFAIL : TPASS,
82*49cdfc7eSAndroid Build Coastguard Worker "STATX_ATTR_NODUMP flag is not set");
83*49cdfc7eSAndroid Build Coastguard Worker }
84*49cdfc7eSAndroid Build Coastguard Worker }
85*49cdfc7eSAndroid Build Coastguard Worker
caid_flags_setup(void)86*49cdfc7eSAndroid Build Coastguard Worker static void caid_flags_setup(void)
87*49cdfc7eSAndroid Build Coastguard Worker {
88*49cdfc7eSAndroid Build Coastguard Worker int attr, ret;
89*49cdfc7eSAndroid Build Coastguard Worker
90*49cdfc7eSAndroid Build Coastguard Worker fd = SAFE_OPEN(TESTDIR_FLAGGED, O_RDONLY | O_DIRECTORY);
91*49cdfc7eSAndroid Build Coastguard Worker
92*49cdfc7eSAndroid Build Coastguard Worker ret = ioctl(fd, FS_IOC_GETFLAGS, &attr);
93*49cdfc7eSAndroid Build Coastguard Worker if (ret < 0) {
94*49cdfc7eSAndroid Build Coastguard Worker if (errno == ENOTTY)
95*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TCONF | TERRNO, "FS_IOC_GETFLAGS not supported");
96*49cdfc7eSAndroid Build Coastguard Worker
97*49cdfc7eSAndroid Build Coastguard Worker /* ntfs3g fuse fs returns wrong errno for unimplemented ioctls */
98*49cdfc7eSAndroid Build Coastguard Worker if (!strcmp(tst_device->fs_type, "ntfs")) {
99*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TCONF | TERRNO,
100*49cdfc7eSAndroid Build Coastguard Worker "ntfs3g does not support FS_IOC_GETFLAGS");
101*49cdfc7eSAndroid Build Coastguard Worker }
102*49cdfc7eSAndroid Build Coastguard Worker
103*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TBROK | TERRNO, "ioctl(%i, FS_IOC_GETFLAGS, ...)", fd);
104*49cdfc7eSAndroid Build Coastguard Worker }
105*49cdfc7eSAndroid Build Coastguard Worker
106*49cdfc7eSAndroid Build Coastguard Worker if (supp_compr)
107*49cdfc7eSAndroid Build Coastguard Worker attr |= FS_COMPR_FL;
108*49cdfc7eSAndroid Build Coastguard Worker if (supp_append)
109*49cdfc7eSAndroid Build Coastguard Worker attr |= FS_APPEND_FL;
110*49cdfc7eSAndroid Build Coastguard Worker if (supp_immutable)
111*49cdfc7eSAndroid Build Coastguard Worker attr |= FS_IMMUTABLE_FL;
112*49cdfc7eSAndroid Build Coastguard Worker if (supp_nodump)
113*49cdfc7eSAndroid Build Coastguard Worker attr |= FS_NODUMP_FL;
114*49cdfc7eSAndroid Build Coastguard Worker
115*49cdfc7eSAndroid Build Coastguard Worker ret = ioctl(fd, FS_IOC_SETFLAGS, &attr);
116*49cdfc7eSAndroid Build Coastguard Worker if (ret < 0)
117*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TBROK | TERRNO, "ioctl(%i, FS_IOC_SETFLAGS, %i)", fd, attr);
118*49cdfc7eSAndroid Build Coastguard Worker
119*49cdfc7eSAndroid Build Coastguard Worker clear_flags = 1;
120*49cdfc7eSAndroid Build Coastguard Worker }
121*49cdfc7eSAndroid Build Coastguard Worker
setup(void)122*49cdfc7eSAndroid Build Coastguard Worker static void setup(void)
123*49cdfc7eSAndroid Build Coastguard Worker {
124*49cdfc7eSAndroid Build Coastguard Worker struct statx buf;
125*49cdfc7eSAndroid Build Coastguard Worker
126*49cdfc7eSAndroid Build Coastguard Worker SAFE_MKDIR(TESTDIR_FLAGGED, 0777);
127*49cdfc7eSAndroid Build Coastguard Worker SAFE_MKDIR(TESTDIR_UNFLAGGED, 0777);
128*49cdfc7eSAndroid Build Coastguard Worker
129*49cdfc7eSAndroid Build Coastguard Worker TEST(statx(AT_FDCWD, TESTDIR_FLAGGED, 0, 0, &buf));
130*49cdfc7eSAndroid Build Coastguard Worker if (TST_RET == -1)
131*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TFAIL | TTERRNO,
132*49cdfc7eSAndroid Build Coastguard Worker "sys_statx(AT_FDCWD, %s, 0, 0, &buf)", TESTDIR_FLAGGED);
133*49cdfc7eSAndroid Build Coastguard Worker
134*49cdfc7eSAndroid Build Coastguard Worker if ((buf.stx_attributes_mask & FS_COMPR_FL) == 0) {
135*49cdfc7eSAndroid Build Coastguard Worker supp_compr = 0;
136*49cdfc7eSAndroid Build Coastguard Worker tst_res(TCONF, "filesystem doesn't support FS_COMPR_FL");
137*49cdfc7eSAndroid Build Coastguard Worker }
138*49cdfc7eSAndroid Build Coastguard Worker if ((buf.stx_attributes_mask & FS_APPEND_FL) == 0) {
139*49cdfc7eSAndroid Build Coastguard Worker supp_append = 0;
140*49cdfc7eSAndroid Build Coastguard Worker tst_res(TCONF, "filesystem doesn't support FS_APPEND_FL");
141*49cdfc7eSAndroid Build Coastguard Worker }
142*49cdfc7eSAndroid Build Coastguard Worker if ((buf.stx_attributes_mask & FS_IMMUTABLE_FL) == 0) {
143*49cdfc7eSAndroid Build Coastguard Worker supp_immutable = 0;
144*49cdfc7eSAndroid Build Coastguard Worker tst_res(TCONF, "filesystem doesn't support FS_IMMUTABLE_FL");
145*49cdfc7eSAndroid Build Coastguard Worker }
146*49cdfc7eSAndroid Build Coastguard Worker if ((buf.stx_attributes_mask & FS_NODUMP_FL) == 0) {
147*49cdfc7eSAndroid Build Coastguard Worker supp_nodump = 0;
148*49cdfc7eSAndroid Build Coastguard Worker tst_res(TCONF, "filesystem doesn't support FS_NODUMP_FL");
149*49cdfc7eSAndroid Build Coastguard Worker }
150*49cdfc7eSAndroid Build Coastguard Worker if (!(supp_compr || supp_append || supp_immutable || supp_nodump))
151*49cdfc7eSAndroid Build Coastguard Worker tst_brk(TCONF,
152*49cdfc7eSAndroid Build Coastguard Worker "filesystem doesn't support the above any attr, skip it");
153*49cdfc7eSAndroid Build Coastguard Worker
154*49cdfc7eSAndroid Build Coastguard Worker caid_flags_setup();
155*49cdfc7eSAndroid Build Coastguard Worker }
156*49cdfc7eSAndroid Build Coastguard Worker
cleanup(void)157*49cdfc7eSAndroid Build Coastguard Worker static void cleanup(void)
158*49cdfc7eSAndroid Build Coastguard Worker {
159*49cdfc7eSAndroid Build Coastguard Worker int attr;
160*49cdfc7eSAndroid Build Coastguard Worker
161*49cdfc7eSAndroid Build Coastguard Worker if (clear_flags) {
162*49cdfc7eSAndroid Build Coastguard Worker SAFE_IOCTL(fd, FS_IOC_GETFLAGS, &attr);
163*49cdfc7eSAndroid Build Coastguard Worker attr &= ~(FS_COMPR_FL | FS_APPEND_FL | FS_IMMUTABLE_FL | FS_NODUMP_FL);
164*49cdfc7eSAndroid Build Coastguard Worker SAFE_IOCTL(fd, FS_IOC_SETFLAGS, &attr);
165*49cdfc7eSAndroid Build Coastguard Worker }
166*49cdfc7eSAndroid Build Coastguard Worker
167*49cdfc7eSAndroid Build Coastguard Worker if (fd > 0)
168*49cdfc7eSAndroid Build Coastguard Worker SAFE_CLOSE(fd);
169*49cdfc7eSAndroid Build Coastguard Worker }
170*49cdfc7eSAndroid Build Coastguard Worker
171*49cdfc7eSAndroid Build Coastguard Worker static struct tst_test test = {
172*49cdfc7eSAndroid Build Coastguard Worker .test = run,
173*49cdfc7eSAndroid Build Coastguard Worker .tcnt = 2,
174*49cdfc7eSAndroid Build Coastguard Worker .setup = setup,
175*49cdfc7eSAndroid Build Coastguard Worker .cleanup = cleanup,
176*49cdfc7eSAndroid Build Coastguard Worker .needs_root = 1,
177*49cdfc7eSAndroid Build Coastguard Worker .all_filesystems = 1,
178*49cdfc7eSAndroid Build Coastguard Worker .mount_device = 1,
179*49cdfc7eSAndroid Build Coastguard Worker .mntpoint = MOUNT_POINT,
180*49cdfc7eSAndroid Build Coastguard Worker .min_kver = "4.11",
181*49cdfc7eSAndroid Build Coastguard Worker };
182