Revision e4027caf

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