@@ -68,10 +68,10 @@ asmlinkage long compat_sys_utime(char __user *filename, struct compat_utimbuf __
6868tv[0].tv_usec = 0;
6969tv[1].tv_usec = 0;
7070 }
71-return do_utimes(filename, t ? tv : NULL);
71+return do_utimes(AT_FDCWD, filename, t ? tv : NULL);
7272}
737374-asmlinkage long compat_sys_utimes(char __user *filename, struct compat_timeval __user *t)
74+asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, struct compat_timeval __user *t)
7575{
7676struct timeval tv[2];
7777@@ -82,14 +82,19 @@ asmlinkage long compat_sys_utimes(char __user *filename, struct compat_timeval _
8282get_user(tv[1].tv_usec, &t[1].tv_usec))
8383return -EFAULT;
8484 }
85-return do_utimes(filename, t ? tv : NULL);
85+return do_utimes(dfd, filename, t ? tv : NULL);
86+}
87+88+asmlinkage long compat_sys_utimes(char __user *filename, struct compat_timeval __user *t)
89+{
90+return compat_sys_futimesat(AT_FDCWD, filename, t);
8691}
87928893asmlinkage long compat_sys_newstat(char __user * filename,
8994struct compat_stat __user *statbuf)
9095{
9196struct kstat stat;
92-int error = vfs_stat(filename, &stat);
97+int error = vfs_stat_fd(AT_FDCWD, filename, &stat);
93989499if (!error)
95100error = cp_compat_stat(&stat, statbuf);
@@ -100,13 +105,34 @@ asmlinkage long compat_sys_newlstat(char __user * filename,
100105struct compat_stat __user *statbuf)
101106{
102107struct kstat stat;
103-int error = vfs_lstat(filename, &stat);
108+int error = vfs_lstat_fd(AT_FDCWD, filename, &stat);
104109105110if (!error)
106111error = cp_compat_stat(&stat, statbuf);
107112return error;
108113}
109114115+asmlinkage long compat_sys_newfstatat(int dfd, char __user *filename,
116+struct compat_stat __user *statbuf, int flag)
117+{
118+struct kstat stat;
119+int error = -EINVAL;
120+121+if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
122+ goto out;
123+124+if (flag & AT_SYMLINK_NOFOLLOW)
125+error = vfs_lstat_fd(dfd, filename, &stat);
126+else
127+error = vfs_stat_fd(dfd, filename, &stat);
128+129+if (!error)
130+error = cp_compat_stat(&stat, statbuf);
131+132+out:
133+return error;
134+}
135+110136asmlinkage long compat_sys_newfstat(unsigned int fd,
111137struct compat_stat __user * statbuf)
112138{
@@ -1290,7 +1316,17 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsig
12901316asmlinkage long
12911317compat_sys_open(const char __user *filename, int flags, int mode)
12921318{
1293-return do_sys_open(filename, flags, mode);
1319+return do_sys_open(AT_FDCWD, filename, flags, mode);
1320+}
1321+1322+/*
1323+ * Exactly like fs/open.c:sys_openat(), except that it doesn't set the
1324+ * O_LARGEFILE flag.
1325+ */
1326+asmlinkage long
1327+compat_sys_openat(int dfd, const char __user *filename, int flags, int mode)
1328+{
1329+return do_sys_open(dfd, filename, flags, mode);
12941330}
1295133112961332/*