sysv: Add forgotten superblock lock init for v7 fs
[linux-3.10.git] / fs / utimes.c
index dad679d..f4fb7ec 100644 (file)
@@ -24,7 +24,7 @@
  * must be owner or have write permission.
  * Else, update from *times, must be owner or super user.
  */
-asmlinkage long sys_utime(char __user *filename, struct utimbuf __user *times)
+SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
 {
        struct timespec tv[2];
 
@@ -95,8 +95,8 @@ static int utimes_common(struct path *path, struct timespec *times)
                 if (IS_IMMUTABLE(inode))
                        goto mnt_drop_write_and_out;
 
-               if (!is_owner_or_cap(inode)) {
-                       error = permission(inode, MAY_WRITE, NULL);
+               if (!inode_owner_or_capable(inode)) {
+                       error = inode_permission(inode, MAY_WRITE);
                        if (error)
                                goto mnt_drop_write_and_out;
                }
@@ -126,7 +126,8 @@ out:
  * must be owner or have write permission.
  * Else, update from *times, must be owner or super user.
  */
-long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags)
+long do_utimes(int dfd, const char __user *filename, struct timespec *times,
+              int flags)
 {
        int error = -EINVAL;
 
@@ -139,38 +140,43 @@ long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags
                goto out;
 
        if (filename == NULL && dfd != AT_FDCWD) {
-               struct file *file;
+               struct fd f;
 
                if (flags & AT_SYMLINK_NOFOLLOW)
                        goto out;
 
-               file = fget(dfd);
+               f = fdget(dfd);
                error = -EBADF;
-               if (!file)
+               if (!f.file)
                        goto out;
 
-               error = utimes_common(&file->f_path, times);
-               fput(file);
+               error = utimes_common(&f.file->f_path, times);
+               fdput(f);
        } else {
-               struct nameidata nd;
+               struct path path;
                int lookup_flags = 0;
 
                if (!(flags & AT_SYMLINK_NOFOLLOW))
                        lookup_flags |= LOOKUP_FOLLOW;
-
-               error = __user_walk_fd(dfd, filename, lookup_flags, &nd);
+retry:
+               error = user_path_at(dfd, filename, lookup_flags, &path);
                if (error)
                        goto out;
 
-               error = utimes_common(&nd.path, times);
-               path_put(&nd.path);
+               error = utimes_common(&path, times);
+               path_put(&path);
+               if (retry_estale(error, lookup_flags)) {
+                       lookup_flags |= LOOKUP_REVAL;
+                       goto retry;
+               }
        }
 
 out:
        return error;
 }
 
-asmlinkage long sys_utimensat(int dfd, char __user *filename, struct timespec __user *utimes, int flags)
+SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
+               struct timespec __user *, utimes, int, flags)
 {
        struct timespec tstimes[2];
 
@@ -187,7 +193,8 @@ asmlinkage long sys_utimensat(int dfd, char __user *filename, struct timespec __
        return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
 }
 
-asmlinkage long sys_futimesat(int dfd, char __user *filename, struct timeval __user *utimes)
+SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
+               struct timeval __user *, utimes)
 {
        struct timeval times[2];
        struct timespec tstimes[2];
@@ -214,7 +221,8 @@ asmlinkage long sys_futimesat(int dfd, char __user *filename, struct timeval __u
        return do_utimes(dfd, filename, utimes ? tstimes : NULL, 0);
 }
 
-asmlinkage long sys_utimes(char __user *filename, struct timeval __user *utimes)
+SYSCALL_DEFINE2(utimes, char __user *, filename,
+               struct timeval __user *, utimes)
 {
        return sys_futimesat(AT_FDCWD, filename, utimes);
 }