net: ipa: fix modem LAN RX endpoint id
[linux-2.6-microblaze.git] / fs / stat.c
index 0300087..44f8ad3 100644 (file)
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -22,6 +22,7 @@
 #include <asm/unistd.h>
 
 #include "internal.h"
+#include "mount.h"
 
 /**
  * generic_fillattr - Fill in the basic attributes from the inode struct
@@ -70,15 +71,18 @@ int vfs_getattr_nosec(const struct path *path, struct kstat *stat,
 
        memset(stat, 0, sizeof(*stat));
        stat->result_mask |= STATX_BASIC_STATS;
-       request_mask &= STATX_ALL;
        query_flags &= KSTAT_QUERY_FLAGS;
 
        /* allow the fs to override these if it really wants to */
-       if (IS_NOATIME(inode))
+       /* SB_NOATIME means filesystem supplies dummy atime value */
+       if (inode->i_sb->s_flags & SB_NOATIME)
                stat->result_mask &= ~STATX_ATIME;
        if (IS_AUTOMOUNT(inode))
                stat->attributes |= STATX_ATTR_AUTOMOUNT;
 
+       if (IS_DAX(inode))
+               stat->attributes |= STATX_ATTR_DAX;
+
        if (inode->i_op->getattr)
                return inode->i_op->getattr(path, stat, request_mask,
                                            query_flags);
@@ -152,7 +156,8 @@ int vfs_statx_fd(unsigned int fd, struct kstat *stat,
 }
 EXPORT_SYMBOL(vfs_statx_fd);
 
-inline unsigned vfs_stat_set_lookup_flags(unsigned *lookup_flags, int flags)
+static inline unsigned vfs_stat_set_lookup_flags(unsigned *lookup_flags,
+                                                int flags)
 {
        if ((flags & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT |
                       AT_EMPTY_PATH | KSTAT_QUERY_FLAGS)) != 0)
@@ -199,6 +204,11 @@ retry:
                goto out;
 
        error = vfs_getattr(&path, stat, request_mask, flags);
+       stat->mnt_id = real_mount(path.mnt)->mnt_id;
+       stat->result_mask |= STATX_MNT_ID;
+       if (path.mnt->mnt_root == path.dentry)
+               stat->attributes |= STATX_ATTR_MOUNT_ROOT;
+       stat->attributes_mask |= STATX_ATTR_MOUNT_ROOT;
        path_put(&path);
        if (retry_estale(error, lookup_flags)) {
                lookup_flags |= LOOKUP_REVAL;
@@ -533,7 +543,7 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, const char __user *, filename,
 }
 #endif /* __ARCH_WANT_STAT64 || __ARCH_WANT_COMPAT_STAT64 */
 
-noinline_for_stack int
+static noinline_for_stack int
 cp_statx(const struct kstat *stat, struct statx __user *buffer)
 {
        struct statx tmp;
@@ -563,10 +573,29 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer)
        tmp.stx_rdev_minor = MINOR(stat->rdev);
        tmp.stx_dev_major = MAJOR(stat->dev);
        tmp.stx_dev_minor = MINOR(stat->dev);
+       tmp.stx_mnt_id = stat->mnt_id;
 
        return copy_to_user(buffer, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 }
 
+int do_statx(int dfd, const char __user *filename, unsigned flags,
+            unsigned int mask, struct statx __user *buffer)
+{
+       struct kstat stat;
+       int error;
+
+       if (mask & STATX__RESERVED)
+               return -EINVAL;
+       if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE)
+               return -EINVAL;
+
+       error = vfs_statx(dfd, filename, flags, &stat, mask);
+       if (error)
+               return error;
+
+       return cp_statx(&stat, buffer);
+}
+
 /**
  * sys_statx - System call to get enhanced stats
  * @dfd: Base directory to pathwalk from *or* fd to stat.
@@ -583,19 +612,7 @@ SYSCALL_DEFINE5(statx,
                unsigned int, mask,
                struct statx __user *, buffer)
 {
-       struct kstat stat;
-       int error;
-
-       if (mask & STATX__RESERVED)
-               return -EINVAL;
-       if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE)
-               return -EINVAL;
-
-       error = vfs_statx(dfd, filename, flags, &stat, mask);
-       if (error)
-               return error;
-
-       return cp_statx(&stat, buffer);
+       return do_statx(dfd, filename, flags, mask, buffer);
 }
 
 #ifdef CONFIG_COMPAT