Merge branch 'master' into next
[safe/jmp/linux-2.6] / fs / ocfs2 / dlm / dlmfs.c
index 7273d9f..6f7a77d 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/highmem.h>
 #include <linux/init.h>
 #include <linux/string.h>
-#include <linux/smp_lock.h>
 #include <linux/backing-dev.h>
 
 #include <asm/uaccess.h>
 #define MLOG_MASK_PREFIX ML_DLMFS
 #include "cluster/masklog.h"
 
-static struct super_operations dlmfs_ops;
-static struct file_operations dlmfs_file_operations;
-static struct inode_operations dlmfs_dir_inode_operations;
-static struct inode_operations dlmfs_root_inode_operations;
-static struct inode_operations dlmfs_file_inode_operations;
-static kmem_cache_t *dlmfs_inode_cache;
+#include "ocfs2_lockingver.h"
+
+static const struct super_operations dlmfs_ops;
+static const struct file_operations dlmfs_file_operations;
+static const struct inode_operations dlmfs_dir_inode_operations;
+static const struct inode_operations dlmfs_root_inode_operations;
+static const struct inode_operations dlmfs_file_inode_operations;
+static struct kmem_cache *dlmfs_inode_cache;
 
 struct workqueue_struct *user_dlm_worker;
 
 /*
+ * This is the userdlmfs locking protocol version.
+ *
+ * See fs/ocfs2/dlmglue.c for more details on locking versions.
+ */
+static const struct dlm_protocol_version user_locking_protocol = {
+       .pv_major = OCFS2_LOCKING_PROTOCOL_MAJOR,
+       .pv_minor = OCFS2_LOCKING_PROTOCOL_MINOR,
+};
+
+/*
  * decodes a set of open flags into a valid lock level and a set of flags.
  * returns < 0 if we have invalid flags
  * flags which mean something to us:
@@ -116,7 +127,7 @@ static int dlmfs_file_open(struct inode *inode,
         * doesn't make sense for LVB writes. */
        file->f_flags &= ~O_APPEND;
 
-       fp = kmalloc(sizeof(*fp), GFP_KERNEL);
+       fp = kmalloc(sizeof(*fp), GFP_NOFS);
        if (!fp) {
                status = -ENOMEM;
                goto bail;
@@ -176,7 +187,7 @@ static ssize_t dlmfs_file_read(struct file *filp,
        int bytes_left;
        ssize_t readlen;
        char *lvb_buf;
-       struct inode *inode = filp->f_dentry->d_inode;
+       struct inode *inode = filp->f_path.dentry->d_inode;
 
        mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
                inode->i_ino, count, *ppos);
@@ -196,7 +207,7 @@ static ssize_t dlmfs_file_read(struct file *filp,
        else
                readlen = count - *ppos;
 
-       lvb_buf = kmalloc(readlen, GFP_KERNEL);
+       lvb_buf = kmalloc(readlen, GFP_NOFS);
        if (!lvb_buf)
                return -ENOMEM;
 
@@ -220,7 +231,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
        int bytes_left;
        ssize_t writelen;
        char *lvb_buf;
-       struct inode *inode = filp->f_dentry->d_inode;
+       struct inode *inode = filp->f_path.dentry->d_inode;
 
        mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",
                inode->i_ino, count, *ppos);
@@ -240,7 +251,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
        else
                writelen = count - *ppos;
 
-       lvb_buf = kmalloc(writelen, GFP_KERNEL);
+       lvb_buf = kmalloc(writelen, GFP_NOFS);
        if (!lvb_buf)
                return -ENOMEM;
 
@@ -256,27 +267,22 @@ static ssize_t dlmfs_file_write(struct file *filp,
        return writelen;
 }
 
-static void dlmfs_init_once(void *foo,
-                           kmem_cache_t *cachep,
-                           unsigned long flags)
+static void dlmfs_init_once(void *foo)
 {
        struct dlmfs_inode_private *ip =
                (struct dlmfs_inode_private *) foo;
 
-       if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
-           SLAB_CTOR_CONSTRUCTOR) {
-               ip->ip_dlm = NULL;
-               ip->ip_parent = NULL;
+       ip->ip_dlm = NULL;
+       ip->ip_parent = NULL;
 
-               inode_init_once(&ip->ip_vfs_inode);
-       }
+       inode_init_once(&ip->ip_vfs_inode);
 }
 
 static struct inode *dlmfs_alloc_inode(struct super_block *sb)
 {
        struct dlmfs_inode_private *ip;
 
-       ip = kmem_cache_alloc(dlmfs_inode_cache, SLAB_NOFS);
+       ip = kmem_cache_alloc(dlmfs_inode_cache, GFP_NOFS);
        if (!ip)
                return NULL;
 
@@ -320,7 +326,7 @@ clear_fields:
 
 static struct backing_dev_info dlmfs_backing_dev_info = {
        .ra_pages       = 0,    /* No readahead */
-       .capabilities   = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
+       .capabilities   = BDI_CAP_NO_ACCT_AND_WRITEBACK,
 };
 
 static struct inode *dlmfs_get_root_inode(struct super_block *sb)
@@ -333,13 +339,12 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb)
                ip = DLMFS_I(inode);
 
                inode->i_mode = mode;
-               inode->i_uid = current->fsuid;
-               inode->i_gid = current->fsgid;
-               inode->i_blksize = PAGE_CACHE_SIZE;
+               inode->i_uid = current_fsuid();
+               inode->i_gid = current_fsgid();
                inode->i_blocks = 0;
                inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info;
                inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-               inode->i_nlink++;
+               inc_nlink(inode);
 
                inode->i_fop = &simple_dir_operations;
                inode->i_op = &dlmfs_root_inode_operations;
@@ -360,9 +365,8 @@ static struct inode *dlmfs_get_inode(struct inode *parent,
                return NULL;
 
        inode->i_mode = mode;
-       inode->i_uid = current->fsuid;
-       inode->i_gid = current->fsgid;
-       inode->i_blksize = PAGE_CACHE_SIZE;
+       inode->i_uid = current_fsuid();
+       inode->i_gid = current_fsgid();
        inode->i_blocks = 0;
        inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info;
        inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
@@ -397,7 +401,7 @@ static struct inode *dlmfs_get_inode(struct inode *parent,
 
                /* directory inodes start off with i_nlink ==
                 * 2 (for "." entry) */
-               inode->i_nlink++;
+               inc_nlink(inode);
                break;
        }
 
@@ -423,6 +427,7 @@ static int dlmfs_mkdir(struct inode * dir,
        struct qstr *domain = &dentry->d_name;
        struct dlmfs_inode_private *ip;
        struct dlm_ctxt *dlm;
+       struct dlm_protocol_version proto = user_locking_protocol;
 
        mlog(0, "mkdir %.*s\n", domain->len, domain->name);
 
@@ -442,7 +447,7 @@ static int dlmfs_mkdir(struct inode * dir,
 
        ip = DLMFS_I(inode);
 
-       dlm = user_dlm_register_context(domain);
+       dlm = user_dlm_register_context(domain, &proto);
        if (IS_ERR(dlm)) {
                status = PTR_ERR(dlm);
                mlog(ML_ERROR, "Error %d could not register domain \"%.*s\"\n",
@@ -451,7 +456,7 @@ static int dlmfs_mkdir(struct inode * dir,
        }
        ip->ip_dlm = dlm;
 
-       dir->i_nlink++;
+       inc_nlink(dir);
        d_instantiate(dentry, inode);
        dget(dentry);   /* Extra count - pin the dentry in core */
 
@@ -542,27 +547,27 @@ static int dlmfs_fill_super(struct super_block * sb,
        return 0;
 }
 
-static struct file_operations dlmfs_file_operations = {
+static const struct file_operations dlmfs_file_operations = {
        .open           = dlmfs_file_open,
        .release        = dlmfs_file_release,
        .read           = dlmfs_file_read,
        .write          = dlmfs_file_write,
 };
 
-static struct inode_operations dlmfs_dir_inode_operations = {
+static const struct inode_operations dlmfs_dir_inode_operations = {
        .create         = dlmfs_create,
        .lookup         = simple_lookup,
        .unlink         = dlmfs_unlink,
 };
 
 /* this way we can restrict mkdir to only the toplevel of the fs. */
-static struct inode_operations dlmfs_root_inode_operations = {
+static const struct inode_operations dlmfs_root_inode_operations = {
        .lookup         = simple_lookup,
        .mkdir          = dlmfs_mkdir,
        .rmdir          = simple_rmdir,
 };
 
-static struct super_operations dlmfs_ops = {
+static const struct super_operations dlmfs_ops = {
        .statfs         = simple_statfs,
        .alloc_inode    = dlmfs_alloc_inode,
        .destroy_inode  = dlmfs_destroy_inode,
@@ -570,7 +575,7 @@ static struct super_operations dlmfs_ops = {
        .drop_inode     = generic_delete_inode,
 };
 
-static struct inode_operations dlmfs_file_inode_operations = {
+static const struct inode_operations dlmfs_file_inode_operations = {
        .getattr        = simple_getattr,
 };
 
@@ -594,13 +599,19 @@ static int __init init_dlmfs_fs(void)
 
        dlmfs_print_version();
 
+       status = bdi_init(&dlmfs_backing_dev_info);
+       if (status)
+               return status;
+
        dlmfs_inode_cache = kmem_cache_create("dlmfs_inode_cache",
                                sizeof(struct dlmfs_inode_private),
                                0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
                                        SLAB_MEM_SPREAD),
-                               dlmfs_init_once, NULL);
-       if (!dlmfs_inode_cache)
-               return -ENOMEM;
+                               dlmfs_init_once);
+       if (!dlmfs_inode_cache) {
+               status = -ENOMEM;
+               goto bail;
+       }
        cleanup_inode = 1;
 
        user_dlm_worker = create_singlethread_workqueue("user_dlm");
@@ -617,6 +628,7 @@ bail:
                        kmem_cache_destroy(dlmfs_inode_cache);
                if (cleanup_worker)
                        destroy_workqueue(user_dlm_worker);
+               bdi_destroy(&dlmfs_backing_dev_info);
        } else
                printk("OCFS2 User DLM kernel interface loaded\n");
        return status;
@@ -629,9 +641,9 @@ static void __exit exit_dlmfs_fs(void)
        flush_workqueue(user_dlm_worker);
        destroy_workqueue(user_dlm_worker);
 
-       if (kmem_cache_destroy(dlmfs_inode_cache))
-               printk(KERN_INFO "dlmfs_inode_cache: not all structures "
-                      "were freed\n");
+       kmem_cache_destroy(dlmfs_inode_cache);
+
+       bdi_destroy(&dlmfs_backing_dev_info);
 }
 
 MODULE_AUTHOR("Oracle");