|
@@ -8,35 +8,6 @@
|
|
|
#include <linux/compat.h>
|
|
|
#include <asm/unistd.h>
|
|
|
|
|
|
-#ifdef __ARCH_WANT_SYS_UTIME
|
|
|
-
|
|
|
-/*
|
|
|
- * sys_utime() can be implemented in user-level using sys_utimes().
|
|
|
- * Is this for backwards compatibility? If so, why not move it
|
|
|
- * into the appropriate arch directory (for those architectures that
|
|
|
- * need it).
|
|
|
- */
|
|
|
-
|
|
|
-/* If times==NULL, set access and modification to current time,
|
|
|
- * must be owner or have write permission.
|
|
|
- * Else, update from *times, must be owner or super user.
|
|
|
- */
|
|
|
-SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
|
|
|
-{
|
|
|
- struct timespec64 tv[2];
|
|
|
-
|
|
|
- if (times) {
|
|
|
- if (get_user(tv[0].tv_sec, ×->actime) ||
|
|
|
- get_user(tv[1].tv_sec, ×->modtime))
|
|
|
- return -EFAULT;
|
|
|
- tv[0].tv_nsec = 0;
|
|
|
- tv[1].tv_nsec = 0;
|
|
|
- }
|
|
|
- return do_utimes(AT_FDCWD, filename, times ? tv : NULL, 0);
|
|
|
-}
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
static bool nsec_valid(long nsec)
|
|
|
{
|
|
|
if (nsec == UTIME_OMIT || nsec == UTIME_NOW)
|
|
@@ -184,6 +155,13 @@ SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
|
|
|
return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
|
|
|
}
|
|
|
|
|
|
+#ifdef __ARCH_WANT_SYS_UTIME
|
|
|
+/*
|
|
|
+ * futimesat(), utimes() and utime() are older versions of utimensat()
|
|
|
+ * that are provided for compatibility with traditional C libraries.
|
|
|
+ * On modern architectures, we always use libc wrappers around
|
|
|
+ * utimensat() instead.
|
|
|
+ */
|
|
|
static long do_futimesat(int dfd, const char __user *filename,
|
|
|
struct timeval __user *utimes)
|
|
|
{
|
|
@@ -225,6 +203,21 @@ SYSCALL_DEFINE2(utimes, char __user *, filename,
|
|
|
return do_futimesat(AT_FDCWD, filename, utimes);
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
|
|
|
+{
|
|
|
+ struct timespec64 tv[2];
|
|
|
+
|
|
|
+ if (times) {
|
|
|
+ if (get_user(tv[0].tv_sec, ×->actime) ||
|
|
|
+ get_user(tv[1].tv_sec, ×->modtime))
|
|
|
+ return -EFAULT;
|
|
|
+ tv[0].tv_nsec = 0;
|
|
|
+ tv[1].tv_nsec = 0;
|
|
|
+ }
|
|
|
+ return do_utimes(AT_FDCWD, filename, times ? tv : NULL, 0);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
/*
|
|
|
* Not all architectures have sys_utime, so implement this in terms
|