vfs: use __getname/__putname for getcwd() system call
[linux-2.6-microblaze.git] / fs / ceph / super.c
index 6627b26..6a0951e 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "super.h"
 #include "mds_client.h"
+#include "cache.h"
 
 #include <linux/ceph/ceph_features.h>
 #include <linux/ceph/decode.h>
@@ -142,6 +143,8 @@ enum {
        Opt_nodcache,
        Opt_ino32,
        Opt_noino32,
+       Opt_fscache,
+       Opt_nofscache
 };
 
 static match_table_t fsopt_tokens = {
@@ -167,6 +170,8 @@ static match_table_t fsopt_tokens = {
        {Opt_nodcache, "nodcache"},
        {Opt_ino32, "ino32"},
        {Opt_noino32, "noino32"},
+       {Opt_fscache, "fsc"},
+       {Opt_nofscache, "nofsc"},
        {-1, NULL}
 };
 
@@ -260,6 +265,12 @@ static int parse_fsopt_token(char *c, void *private)
        case Opt_noino32:
                fsopt->flags &= ~CEPH_MOUNT_OPT_INO32;
                break;
+       case Opt_fscache:
+               fsopt->flags |= CEPH_MOUNT_OPT_FSCACHE;
+               break;
+       case Opt_nofscache:
+               fsopt->flags &= ~CEPH_MOUNT_OPT_FSCACHE;
+               break;
        default:
                BUG_ON(token);
        }
@@ -422,6 +433,10 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root)
                seq_puts(m, ",dcache");
        else
                seq_puts(m, ",nodcache");
+       if (fsopt->flags & CEPH_MOUNT_OPT_FSCACHE)
+               seq_puts(m, ",fsc");
+       else
+               seq_puts(m, ",nofsc");
 
        if (fsopt->wsize)
                seq_printf(m, ",wsize=%d", fsopt->wsize);
@@ -530,11 +545,18 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
        if (!fsc->wb_pagevec_pool)
                goto fail_trunc_wq;
 
+       /* setup fscache */
+       if ((fsopt->flags & CEPH_MOUNT_OPT_FSCACHE) &&
+           (ceph_fscache_register_fs(fsc) != 0))
+               goto fail_fscache;
+
        /* caps */
        fsc->min_caps = fsopt->max_readdir;
 
        return fsc;
 
+fail_fscache:
+       ceph_fscache_unregister_fs(fsc);
 fail_trunc_wq:
        destroy_workqueue(fsc->trunc_wq);
 fail_pg_inv_wq:
@@ -554,6 +576,8 @@ static void destroy_fs_client(struct ceph_fs_client *fsc)
 {
        dout("destroy_fs_client %p\n", fsc);
 
+       ceph_fscache_unregister_fs(fsc);
+
        destroy_workqueue(fsc->wb_wq);
        destroy_workqueue(fsc->pg_inv_wq);
        destroy_workqueue(fsc->trunc_wq);
@@ -588,6 +612,8 @@ static void ceph_inode_init_once(void *foo)
 
 static int __init init_caches(void)
 {
+       int error = -ENOMEM;
+
        ceph_inode_cachep = kmem_cache_create("ceph_inode_info",
                                      sizeof(struct ceph_inode_info),
                                      __alignof__(struct ceph_inode_info),
@@ -611,15 +637,17 @@ static int __init init_caches(void)
        if (ceph_file_cachep == NULL)
                goto bad_file;
 
-       return 0;
+       if ((error = ceph_fscache_register()))
+               goto bad_file;
 
+       return 0;
 bad_file:
        kmem_cache_destroy(ceph_dentry_cachep);
 bad_dentry:
        kmem_cache_destroy(ceph_cap_cachep);
 bad_cap:
        kmem_cache_destroy(ceph_inode_cachep);
-       return -ENOMEM;
+       return error;
 }
 
 static void destroy_caches(void)
@@ -629,10 +657,13 @@ static void destroy_caches(void)
         * destroy cache.
         */
        rcu_barrier();
+
        kmem_cache_destroy(ceph_inode_cachep);
        kmem_cache_destroy(ceph_cap_cachep);
        kmem_cache_destroy(ceph_dentry_cachep);
        kmem_cache_destroy(ceph_file_cachep);
+
+       ceph_fscache_unregister();
 }