vfs: mostly undo glibc turning 'fstat()' into 'fstatat(AT_EMPTY_PATH)'
[linux-2.6-microblaze.git] / fs / stat.c
index 136711a..6822ac7 100644 (file)
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -311,6 +311,23 @@ int vfs_fstatat(int dfd, const char __user *filename,
        int statx_flags = flags | AT_NO_AUTOMOUNT;
        struct filename *name;
 
+       /*
+        * Work around glibc turning fstat() into fstatat(AT_EMPTY_PATH)
+        *
+        * If AT_EMPTY_PATH is set, we expect the common case to be that
+        * empty path, and avoid doing all the extra pathname work.
+        */
+       if (dfd >= 0 && flags == AT_EMPTY_PATH) {
+               char c;
+
+               ret = get_user(c, filename);
+               if (unlikely(ret))
+                       return ret;
+
+               if (likely(!c))
+                       return vfs_fstat(dfd, stat);
+       }
+
        name = getname_flags(filename, getname_statx_lookup_flags(statx_flags), NULL);
        ret = vfs_statx(dfd, name, statx_flags, stat, STATX_BASIC_STATS);
        putname(name);