diff options
author | Pino Toscano <toscano.pino@tiscali.it> | 2013-03-23 17:02:08 +0100 |
---|---|---|
committer | Pino Toscano <toscano.pino@tiscali.it> | 2013-03-23 17:02:08 +0100 |
commit | 762ab7baa27067b82e374a9c53de216ca2cd6116 (patch) | |
tree | 2a15b9b923d73854a18c6fcbf1a7f9b4ac83f89e | |
parent | cfd488b148cd05603141ccf1b14b56590b1f8e0b (diff) |
netfs utimes: use the utimens operation if present
Use the utimens fuse operation if present, otherwise fall back on utime.
* src/netfs.c (netfs_attempt_utimes): Use the utimes op.
-rw-r--r-- | src/netfs.c | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/src/netfs.c b/src/netfs.c index d708b6254..0511b0569 100644 --- a/src/netfs.c +++ b/src/netfs.c @@ -1128,29 +1128,46 @@ netfs_attempt_utimes (struct iouser *cred, struct node *node, && (err = fshelp_isowner(&node->nn_stat, cred)))) goto out; - if(! FUSE_OP_HAVE(utime)) + if(FUSE_OP_HAVE(utimens)) { - err = EOPNOTSUPP; - goto out; - } + /* Prepare TS for FUSE_OP_HAVE(utimens) call. */ + struct timespec ts[2]; + ts[0] = atime ? *atime : node->nn_stat.st_atim; + ts[1] = mtime ? *mtime : node->nn_stat.st_mtim; + + err = -FUSE_OP_CALL(utimens, node->nn->path, ts); - /* prepare utimebuf for FUSE_OP_HAVE(utime) call */ - struct utimbuf utb; - utb.actime = atime ? atime->tv_sec : node->nn_stat.st_atime; - utb.modtime = mtime ? mtime->tv_sec : node->nn_stat.st_mtime; + if (!err) + { + node->nn_stat.st_mtim = ts[1]; - err = -FUSE_OP_CALL(utime, node->nn->path, &utb); + node->nn_stat.st_atim = ts[0]; - if (! err) + node->nn->may_need_sync = 1; + } + } + else if(FUSE_OP_HAVE(utime)) { - node->nn_stat.st_mtim.tv_sec = utb.modtime; - node->nn_stat.st_mtim.tv_nsec = 0; - - node->nn_stat.st_atim.tv_sec = utb.actime; - node->nn_stat.st_atim.tv_nsec = 0; - - node->nn->may_need_sync = 1; + /* Prepare UTB for FUSE_OP_HAVE(utime) call. */ + struct utimbuf utb; + utb.actime = atime ? atime->tv_sec : node->nn_stat.st_atime; + utb.modtime = mtime ? mtime->tv_sec : node->nn_stat.st_mtime; + + err = -FUSE_OP_CALL(utime, node->nn->path, &utb); + + if (!err) + { + node->nn_stat.st_mtim.tv_sec = utb.modtime; + node->nn_stat.st_mtim.tv_nsec = 0; + + node->nn_stat.st_atim.tv_sec = utb.actime; + node->nn_stat.st_atim.tv_nsec = 0; + + node->nn->may_need_sync = 1; + } } + else + err = EOPNOTSUPP; out: FUNC_EPILOGUE(err); |