NFS: Fix access to suid/sgid executables
[platform/adaptation/renesas_rcar/renesas_kernel.git] / fs / nfs / super.c
index 652d3f7..c25cadf 100644 (file)
@@ -64,6 +64,7 @@
 #include "iostat.h"
 #include "internal.h"
 #include "fscache.h"
+#include "nfs4session.h"
 #include "pnfs.h"
 #include "nfs.h"
 
@@ -307,6 +308,7 @@ const struct super_operations nfs_sops = {
        .alloc_inode    = nfs_alloc_inode,
        .destroy_inode  = nfs_destroy_inode,
        .write_inode    = nfs_write_inode,
+       .drop_inode     = nfs_drop_inode,
        .put_super      = nfs_put_super,
        .statfs         = nfs_statfs,
        .evict_inode    = nfs_evict_inode,
@@ -2373,19 +2375,30 @@ static void nfs_get_cache_cookie(struct super_block *sb,
                                 struct nfs_parsed_mount_data *parsed,
                                 struct nfs_clone_mount *cloned)
 {
+       struct nfs_server *nfss = NFS_SB(sb);
        char *uniq = NULL;
        int ulen = 0;
 
-       if (parsed && parsed->fscache_uniq) {
-               uniq = parsed->fscache_uniq;
-               ulen = strlen(parsed->fscache_uniq);
+       nfss->fscache_key = NULL;
+       nfss->fscache = NULL;
+
+       if (parsed) {
+               if (!(parsed->options & NFS_OPTION_FSCACHE))
+                       return;
+               if (parsed->fscache_uniq) {
+                       uniq = parsed->fscache_uniq;
+                       ulen = strlen(parsed->fscache_uniq);
+               }
        } else if (cloned) {
                struct nfs_server *mnt_s = NFS_SB(cloned->sb);
+               if (!(mnt_s->options & NFS_OPTION_FSCACHE))
+                       return;
                if (mnt_s->fscache_key) {
                        uniq = mnt_s->fscache_key->key.uniquifier;
                        ulen = mnt_s->fscache_key->key.uniq_len;
                };
-       }
+       } else
+               return;
 
        nfs_fscache_get_super_cookie(sb, uniq, ulen);
 }