Make ->drop_inode() just return whether inode needs to be dropped
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / cifs / cifsfs.c
index 2cb1a70214d7298070266840bb97ad7bf2c98a57..20914f5627ddfb2a9a4142a54e0972f9834aa092 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/key-type.h>
 #include "dns_resolve.h"
 #include "cifs_spnego.h"
+#include "fscache.h"
 #define CIFS_MAGIC_NUMBER 0xFF534D42   /* the first four bytes of SMB PDUs */
 
 int cifsFYI = 0;
@@ -328,6 +329,12 @@ cifs_destroy_inode(struct inode *inode)
        kmem_cache_free(cifs_inode_cachep, CIFS_I(inode));
 }
 
+static void
+cifs_clear_inode(struct inode *inode)
+{
+       cifs_fscache_release_inode_cookie(inode);
+}
+
 static void
 cifs_show_address(struct seq_file *s, struct TCP_Server_Info *server)
 {
@@ -473,14 +480,13 @@ static int cifs_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-void cifs_drop_inode(struct inode *inode)
+static int cifs_drop_inode(struct inode *inode)
 {
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 
-       if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
-               return generic_drop_inode(inode);
-
-       return generic_delete_inode(inode);
+       /* no serverino => unconditional eviction */
+       return !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) ||
+               generic_drop_inode(inode);
 }
 
 static const struct super_operations cifs_super_ops = {
@@ -489,6 +495,7 @@ static const struct super_operations cifs_super_ops = {
        .alloc_inode = cifs_alloc_inode,
        .destroy_inode = cifs_destroy_inode,
        .drop_inode     = cifs_drop_inode,
+       .clear_inode    = cifs_clear_inode,
 /*     .delete_inode   = cifs_delete_inode,  */  /* Do not need above
        function unless later we add lazy close of inodes or unless the
        kernel forgets to call us with the same number of releases (closes)
@@ -902,6 +909,10 @@ init_cifs(void)
                cFYI(1, "cifs_max_pending set to max of 256");
        }
 
+       rc = cifs_fscache_register();
+       if (rc)
+               goto out;
+
        rc = cifs_init_inodecache();
        if (rc)
                goto out_clean_proc;
@@ -951,6 +962,8 @@ init_cifs(void)
        cifs_destroy_inodecache();
  out_clean_proc:
        cifs_proc_clean();
+       cifs_fscache_unregister();
+ out:
        return rc;
 }
 
@@ -959,6 +972,7 @@ exit_cifs(void)
 {
        cFYI(DBG2, "exit_cifs");
        cifs_proc_clean();
+       cifs_fscache_unregister();
 #ifdef CONFIG_CIFS_DFS_UPCALL
        cifs_dfs_release_automount_timer();
        cifs_exit_dns_resolver();