summaryrefslogtreecommitdiff
path: root/libnetfs
diff options
context:
space:
mode:
authorFlávio Cruz <flaviocruz@gmail.com>2018-03-05 02:58:41 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-03-05 02:58:41 +0100
commit82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba (patch)
tree2170bfb251afe6f2173c4424efa18e0b3fc0b46f /libnetfs
parent2ed669b5b1da77e80fff6dc2f72f11e266479a8c (diff)
Add file_utimens RPC to use a struct timespec
and update the servers to use UTIME_NOW and UTIME_OMIT. * console-client/trans.c (netfs_attempt_utimes): Do not set current time ourself. * console/console.c (netfs_attempt_utimes): Likewise. * ftpfs/netfs.c (netfs_attempt_utimes): Likewise. * hostmux/node.c (netfs_attempt_utimes): Likewise. * usermux/node.c (netfs_attempt_utimes): Likewise. * nfs/ops.c (netfs_attempt_utimes): Likewise. * doc/hurd.texi (file_utimens): Add documentation. * hurd/fs.defs (file_utimens): Add RPC. * libdiskfs/file-utimes.c (diskfs_S_file_utimes): Move implementation and replace with translation layer with... (diskfs_S_file_utimens): ... new function. * libnetfs/file-utimes.c (netfs_S_file_utimes): Likewise with... (netfs_S_file_utimens): ... new function. * libnetfs/init-init.c: Include <error.h>. (netfs_mtime): New variable. (netfs_init): New function. * libnetfs/netfs.h (netfs_attempt_utimes): Update documentation. * libnetfs/priv.h (netfs_mtime): Declare variable. * libtreefs/s-file.c (treefs_S_file_utimes): Convert time values and call treefs_s_file_utimens instead of treefs_s_file_utimes. * libtreefs/treefs-hooks.h: Replace TREEFS_HOOK_S_FILE_UTIMES with TREEFS_HOOK_S_FILE_UTIMENS. * libtreefs/treefs-s-hooks.h: Replace s_file_utimes with s_file_utimens. * libtrivfs/file-utimes.c (trivfs_S_file_utimens): New function. * libtrivfs/times.c (trivfs_set_atime): Try to use file_utimens before using file_utimes. (trivfs_set_mtime): Likewise. * nfsd/ops.c (complete_setattr): Likewise. * trans/fakeroot.c (netfs_attempt_utimes): Likewise. * nfs/nfs.c (xdr_encode_sattr_times): Do not set atime or mtime when they are NULL. * configure.ac: Look for file_futimens, and define UTIME_NOW/OMIT, for compatibility with old glibcs.
Diffstat (limited to 'libnetfs')
-rw-r--r--libnetfs/file-utimes.c52
-rw-r--r--libnetfs/init-init.c7
-rw-r--r--libnetfs/netfs.h2
-rw-r--r--libnetfs/priv.h2
4 files changed, 48 insertions, 15 deletions
diff --git a/libnetfs/file-utimes.c b/libnetfs/file-utimes.c
index 19156094..042c43e8 100644
--- a/libnetfs/file-utimes.c
+++ b/libnetfs/file-utimes.c
@@ -26,28 +26,52 @@ netfs_S_file_utimes (struct protid *user,
time_value_t atimein,
time_value_t mtimein)
{
- struct timespec atime, mtime;
- error_t err;
+ struct timespec atim, mtim;
- if (atimein.microseconds != -1)
+ if (atimein.microseconds == -1)
{
- atime.tv_sec = atimein.seconds;
- atime.tv_nsec = atimein.microseconds * 1000;
+ atim.tv_sec = 0;
+ atim.tv_nsec = UTIME_NOW;
}
-
- if (mtimein.microseconds != -1)
+ else
+ TIME_VALUE_TO_TIMESPEC (&atimein, &atim);
+
+ if (mtimein.microseconds == -1)
{
- mtime.tv_sec = mtimein.seconds;
- mtime.tv_nsec = mtimein.microseconds * 1000;
+ mtim.tv_sec = 0;
+ mtim.tv_nsec = UTIME_NOW;
}
-
+ else
+ TIME_VALUE_TO_TIMESPEC (&mtimein, &mtim);
+
+ return netfs_S_file_utimens (user, atim, mtim);
+}
+
+error_t
+netfs_S_file_utimens (struct protid *user,
+ struct timespec atimein,
+ struct timespec mtimein)
+{
+ error_t err;
+ struct timeval t;
+
if (!user)
return EOPNOTSUPP;
-
+
+ if (atimein.tv_nsec == UTIME_NOW || mtimein.tv_nsec == UTIME_NOW)
+ {
+ maptime_read (netfs_mtime, &t);
+
+ if (atimein.tv_nsec == UTIME_NOW)
+ TIMEVAL_TO_TIMESPEC (&t, &atimein);
+ if (mtimein.tv_nsec == UTIME_NOW)
+ TIMEVAL_TO_TIMESPEC (&t, &mtimein);
+ }
+
pthread_mutex_lock (&user->po->np->lock);
- err = netfs_attempt_utimes (user->user, user->po->np,
- atimein.microseconds != -1 ? &atime : 0,
- mtimein.microseconds != -1 ? &mtime : 0);
+ err = netfs_attempt_utimes (user->user, user->po->np,
+ (atimein.tv_nsec == UTIME_OMIT) ? 0 : &atimein,
+ (mtimein.tv_nsec == UTIME_OMIT) ? 0 : &mtimein);
pthread_mutex_unlock (&user->po->np->lock);
return err;
}
diff --git a/libnetfs/init-init.c b/libnetfs/init-init.c
index 9ca1aacf..984a5e71 100644
--- a/libnetfs/init-init.c
+++ b/libnetfs/init-init.c
@@ -20,6 +20,7 @@
#include "netfs.h"
+#include <error.h>
/* For safe inlining of netfs_node_netnode and netfs_netnode_node. */
size_t const _netfs_sizeof_struct_node = sizeof (struct node);
@@ -30,11 +31,17 @@ struct port_class *netfs_protid_class = 0;
struct port_class *netfs_control_class = 0;
auth_t netfs_auth_server_port = 0;
mach_port_t netfs_fsys_identity;
+volatile struct mapped_time_value *netfs_mtime;
void
netfs_init ()
{
+ error_t err;
+ err = maptime_map (0, 0, &netfs_mtime);
+ if (err)
+ error (2, err, "mapping time");
+
netfs_protid_class = ports_create_class (netfs_release_protid, 0);
netfs_control_class = ports_create_class (0, 0);
netfs_port_bucket = ports_create_bucket ();
diff --git a/libnetfs/netfs.h b/libnetfs/netfs.h
index 5b5ca93b..3d51b74b 100644
--- a/libnetfs/netfs.h
+++ b/libnetfs/netfs.h
@@ -173,7 +173,7 @@ error_t netfs_attempt_chflags (struct iouser *cred, struct node *np,
/* The user must define this function. This should attempt a utimes
call for the user specified by CRED on locked node NP, to change
the atime to ATIME and the mtime to MTIME. If ATIME or MTIME is
- null, then set to the current time. */
+ null, then do not change it. */
error_t netfs_attempt_utimes (struct iouser *cred, struct node *np,
struct timespec *atime, struct timespec *mtime);
diff --git a/libnetfs/priv.h b/libnetfs/priv.h
index 3c5bcd4f..3871da8d 100644
--- a/libnetfs/priv.h
+++ b/libnetfs/priv.h
@@ -25,6 +25,8 @@
#include "netfs.h"
+volatile struct mapped_time_value *netfs_mtime;
+
static inline struct protid * __attribute__ ((unused))
begin_using_protid_port (file_t port)
{