Revision e4027caf hw/9pfs/virtio-9p.c
b/hw/9pfs/virtio-9p.c | ||
---|---|---|
1293 | 1293 |
complete_pdu(s, pdu, retval); |
1294 | 1294 |
} |
1295 | 1295 |
|
1296 |
/* From Linux kernel code */ |
|
1297 |
#define ATTR_MODE (1 << 0) |
|
1298 |
#define ATTR_UID (1 << 1) |
|
1299 |
#define ATTR_GID (1 << 2) |
|
1300 |
#define ATTR_SIZE (1 << 3) |
|
1301 |
#define ATTR_ATIME (1 << 4) |
|
1302 |
#define ATTR_MTIME (1 << 5) |
|
1303 |
#define ATTR_CTIME (1 << 6) |
|
1304 |
#define ATTR_MASK 127 |
|
1305 |
#define ATTR_ATIME_SET (1 << 7) |
|
1306 |
#define ATTR_MTIME_SET (1 << 8) |
|
1296 |
/* Attribute flags */ |
|
1297 |
#define P9_ATTR_MODE (1 << 0) |
|
1298 |
#define P9_ATTR_UID (1 << 1) |
|
1299 |
#define P9_ATTR_GID (1 << 2) |
|
1300 |
#define P9_ATTR_SIZE (1 << 3) |
|
1301 |
#define P9_ATTR_ATIME (1 << 4) |
|
1302 |
#define P9_ATTR_MTIME (1 << 5) |
|
1303 |
#define P9_ATTR_CTIME (1 << 6) |
|
1304 |
#define P9_ATTR_ATIME_SET (1 << 7) |
|
1305 |
#define P9_ATTR_MTIME_SET (1 << 8) |
|
1306 |
|
|
1307 |
#define P9_ATTR_MASK 127 |
|
1307 | 1308 |
|
1308 | 1309 |
static void v9fs_setattr(void *opaque) |
1309 | 1310 |
{ |
... | ... | |
1322 | 1323 |
err = -EINVAL; |
1323 | 1324 |
goto out_nofid; |
1324 | 1325 |
} |
1325 |
if (v9iattr.valid & ATTR_MODE) { |
|
1326 |
if (v9iattr.valid & P9_ATTR_MODE) {
|
|
1326 | 1327 |
err = v9fs_co_chmod(pdu, &fidp->path, v9iattr.mode); |
1327 | 1328 |
if (err < 0) { |
1328 | 1329 |
goto out; |
1329 | 1330 |
} |
1330 | 1331 |
} |
1331 |
if (v9iattr.valid & (ATTR_ATIME | ATTR_MTIME)) {
|
|
1332 |
if (v9iattr.valid & (P9_ATTR_ATIME | P9_ATTR_MTIME)) {
|
|
1332 | 1333 |
struct timespec times[2]; |
1333 |
if (v9iattr.valid & ATTR_ATIME) { |
|
1334 |
if (v9iattr.valid & ATTR_ATIME_SET) { |
|
1334 |
if (v9iattr.valid & P9_ATTR_ATIME) {
|
|
1335 |
if (v9iattr.valid & P9_ATTR_ATIME_SET) {
|
|
1335 | 1336 |
times[0].tv_sec = v9iattr.atime_sec; |
1336 | 1337 |
times[0].tv_nsec = v9iattr.atime_nsec; |
1337 | 1338 |
} else { |
... | ... | |
1340 | 1341 |
} else { |
1341 | 1342 |
times[0].tv_nsec = UTIME_OMIT; |
1342 | 1343 |
} |
1343 |
if (v9iattr.valid & ATTR_MTIME) { |
|
1344 |
if (v9iattr.valid & ATTR_MTIME_SET) { |
|
1344 |
if (v9iattr.valid & P9_ATTR_MTIME) {
|
|
1345 |
if (v9iattr.valid & P9_ATTR_MTIME_SET) {
|
|
1345 | 1346 |
times[1].tv_sec = v9iattr.mtime_sec; |
1346 | 1347 |
times[1].tv_nsec = v9iattr.mtime_nsec; |
1347 | 1348 |
} else { |
... | ... | |
1359 | 1360 |
* If the only valid entry in iattr is ctime we can call |
1360 | 1361 |
* chown(-1,-1) to update the ctime of the file |
1361 | 1362 |
*/ |
1362 |
if ((v9iattr.valid & (ATTR_UID | ATTR_GID)) ||
|
|
1363 |
((v9iattr.valid & ATTR_CTIME) |
|
1364 |
&& !((v9iattr.valid & ATTR_MASK) & ~ATTR_CTIME))) {
|
|
1365 |
if (!(v9iattr.valid & ATTR_UID)) { |
|
1363 |
if ((v9iattr.valid & (P9_ATTR_UID | P9_ATTR_GID)) ||
|
|
1364 |
((v9iattr.valid & P9_ATTR_CTIME)
|
|
1365 |
&& !((v9iattr.valid & P9_ATTR_MASK) & ~P9_ATTR_CTIME))) {
|
|
1366 |
if (!(v9iattr.valid & P9_ATTR_UID)) {
|
|
1366 | 1367 |
v9iattr.uid = -1; |
1367 | 1368 |
} |
1368 |
if (!(v9iattr.valid & ATTR_GID)) { |
|
1369 |
if (!(v9iattr.valid & P9_ATTR_GID)) {
|
|
1369 | 1370 |
v9iattr.gid = -1; |
1370 | 1371 |
} |
1371 | 1372 |
err = v9fs_co_chown(pdu, &fidp->path, v9iattr.uid, |
... | ... | |
1374 | 1375 |
goto out; |
1375 | 1376 |
} |
1376 | 1377 |
} |
1377 |
if (v9iattr.valid & (ATTR_SIZE)) { |
|
1378 |
if (v9iattr.valid & (P9_ATTR_SIZE)) {
|
|
1378 | 1379 |
err = v9fs_co_truncate(pdu, &fidp->path, v9iattr.size); |
1379 | 1380 |
if (err < 0) { |
1380 | 1381 |
goto out; |
Also available in: Unified diff