diff options
author | Flávio Cruz <flaviocruz@gmail.com> | 2018-03-05 02:58:41 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-03-05 02:58:41 +0100 |
commit | 82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba (patch) | |
tree | 2170bfb251afe6f2173c4424efa18e0b3fc0b46f /nfs | |
parent | 2ed669b5b1da77e80fff6dc2f72f11e266479a8c (diff) | |
download | hurd-82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba.tar.gz hurd-82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba.tar.bz2 hurd-82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba.zip |
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 'nfs')
-rw-r--r-- | nfs/nfs.c | 46 | ||||
-rw-r--r-- | nfs/ops.c | 15 |
2 files changed, 40 insertions, 21 deletions
@@ -273,10 +273,26 @@ xdr_encode_sattr_times (int *p, struct timespec *atime, struct timespec *mtime) *(p++) = -1; /* uid */ *(p++) = -1; /* gid */ *(p++) = -1; /* size */ - *(p++) = htonl (atime->tv_sec); - *(p++) = htonl (atime->tv_nsec / 1000); - *(p++) = htonl (mtime->tv_sec); - *(p++) = htonl (mtime->tv_nsec / 1000); + if (atime) + { + *(p++) = htonl (atime->tv_sec); + *(p++) = htonl (atime->tv_nsec / 1000); + } + else + { + *(p++) = -1; /* no atime */ + *(p++) = -1; + } + if (mtime) + { + *(p++) = htonl (mtime->tv_sec); + *(p++) = htonl (mtime->tv_nsec / 1000); + } + else + { + *(p++) = -1; /* no mtime */ + *(p++) = -1; + } } else { @@ -284,12 +300,22 @@ xdr_encode_sattr_times (int *p, struct timespec *atime, struct timespec *mtime) *(p++) = 0; /* no uid */ *(p++) = 0; /* no gid */ *(p++) = 0; /* no size */ - *(p++) = htonl (SET_TO_CLIENT_TIME); /* atime */ - *(p++) = htonl (atime->tv_sec); - *(p++) = htonl (atime->tv_nsec); - *(p++) = htonl (SET_TO_CLIENT_TIME); /* mtime */ - *(p++) = htonl (mtime->tv_sec); - *(p++) = htonl (mtime->tv_nsec); + if (atime) + { + *(p++) = htonl (SET_TO_CLIENT_TIME); /* atime */ + *(p++) = htonl (atime->tv_sec); + *(p++) = htonl (atime->tv_nsec); + } + else + *(p++) = DONT_CHANGE; /* no atime */ + if (mtime) + { + *(p++) = htonl (SET_TO_CLIENT_TIME); /* mtime */ + *(p++) = htonl (mtime->tv_sec); + *(p++) = htonl (mtime->tv_nsec); + } + else + *(p++) = DONT_CHANGE; /* no mtime */ } return p; } @@ -297,17 +297,12 @@ netfs_attempt_utimes (struct iouser *cred, struct node *np, int *p; void *rpcbuf; error_t err; - struct timeval tv; - struct timespec current; + + if (!atime && !mtime) + return 0; /* nothing to update */ /* XXX For version 3 we can actually do this right, but we don't just yet. */ - if (!atime || !mtime) - { - maptime_read (mapped_time, &tv); - current.tv_sec = tv.tv_sec; - current.tv_nsec = tv.tv_usec * 1000; - } p = nfs_initialize_rpc (NFSPROC_SETATTR (protocol_version), cred, 0, &rpcbuf, np, -1); @@ -315,9 +310,7 @@ netfs_attempt_utimes (struct iouser *cred, struct node *np, return errno; p = xdr_encode_fhandle (p, &np->nn->handle); - p = xdr_encode_sattr_times (p, - atime ?: ¤t, - mtime ?: ¤t); + p = xdr_encode_sattr_times (p, atime, mtime); if (protocol_version == 3) *(p++) = 0; /* guard check == 0 */ |