summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPino Toscano <toscano.pino@tiscali.it>2013-03-23 17:02:08 +0100
committerPino Toscano <toscano.pino@tiscali.it>2013-03-23 17:02:08 +0100
commit762ab7baa27067b82e374a9c53de216ca2cd6116 (patch)
tree2a15b9b923d73854a18c6fcbf1a7f9b4ac83f89e
parentcfd488b148cd05603141ccf1b14b56590b1f8e0b (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.c51
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);