fs: dcache fix LRU ordering
[safe/jmp/linux-2.6] / fs / dlm / dlm_internal.h
index da75099..d01ca0a 100644 (file)
@@ -2,7 +2,7 @@
 *******************************************************************************
 **
 **  Copyright (C) Sistina Software, Inc.  1997-2003  All rights reserved.
-**  Copyright (C) 2004-2005 Red Hat, Inc.  All rights reserved.
+**  Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
 **
 **  This copyrighted material is made available to anyone wishing to use,
 **  modify, copy, or redistribute it subject to the terms and conditions
 #include <linux/jhash.h>
 #include <linux/miscdevice.h>
 #include <linux/mutex.h>
-#include <asm/semaphore.h>
 #include <asm/uaccess.h>
 
 #include <linux/dlm.h>
-
-#define DLM_LOCKSPACE_LEN      64
+#include "config.h"
 
 /* Size of the temp buffer midcomms allocates on the stack.
    We try to make this large enough so most messages fit.
@@ -69,12 +67,12 @@ struct dlm_mhandle;
 #define log_error(ls, fmt, args...) \
        printk(KERN_ERR "dlm: %s: " fmt "\n", (ls)->ls_name , ##args)
 
-#define DLM_LOG_DEBUG
-#ifdef DLM_LOG_DEBUG
-#define log_debug(ls, fmt, args...) log_error(ls, fmt, ##args)
-#else
-#define log_debug(ls, fmt, args...)
-#endif
+#define log_debug(ls, fmt, args...) \
+do { \
+       if (dlm_config.ci_log_debug) \
+               printk(KERN_DEBUG "dlm: %s: " fmt "\n", \
+                      (ls)->ls_name , ##args); \
+} while (0)
 
 #define DLM_ASSERT(x, do) \
 { \
@@ -101,13 +99,13 @@ struct dlm_direntry {
 
 struct dlm_dirtable {
        struct list_head        list;
-       rwlock_t                lock;
+       spinlock_t              lock;
 };
 
 struct dlm_rsbtable {
        struct list_head        list;
        struct list_head        toss;
-       rwlock_t                lock;
+       spinlock_t              lock;
 };
 
 struct dlm_lkbtable {
@@ -132,8 +130,10 @@ struct dlm_member {
 
 struct dlm_recover {
        struct list_head        list;
-       int                     *nodeids;
+       int                     *nodeids;   /* nodeids of all members */
        int                     node_count;
+       int                     *new;       /* nodeids of new members */
+       int                     new_count;
        uint64_t                seq;
 };
 
@@ -143,11 +143,12 @@ struct dlm_recover {
 
 struct dlm_args {
        uint32_t                flags;
-       void                    *astaddr;
-       long                    astparam;
-       void                    *bastaddr;
+       void                    (*astfn) (void *astparam);
+       void                    *astparam;
+       void                    (*bastfn) (void *astparam, int mode);
        int                     mode;
        struct dlm_lksb         *lksb;
+       unsigned long           timeout;
 };
 
 
@@ -207,6 +208,12 @@ struct dlm_args {
 #define DLM_IFL_MSTCPY         0x00010000
 #define DLM_IFL_RESEND         0x00020000
 #define DLM_IFL_DEAD           0x00040000
+#define DLM_IFL_OVERLAP_UNLOCK  0x00080000
+#define DLM_IFL_OVERLAP_CANCEL  0x00100000
+#define DLM_IFL_ENDOFLIFE      0x00200000
+#define DLM_IFL_WATCH_TIMEWARN 0x00400000
+#define DLM_IFL_TIMEOUT_CANCEL 0x00800000
+#define DLM_IFL_DEADLOCK_CANCEL        0x01000000
 #define DLM_IFL_USER           0x00000001
 #define DLM_IFL_ORPHAN         0x00000002
 
@@ -227,8 +234,8 @@ struct dlm_lkb {
        int8_t                  lkb_grmode;     /* granted lock mode */
        int8_t                  lkb_bastmode;   /* requested mode */
        int8_t                  lkb_highbast;   /* highest mode bast sent for */
-
        int8_t                  lkb_wait_type;  /* type of reply waiting for */
+       int8_t                  lkb_wait_count;
        int8_t                  lkb_ast_type;   /* type of ast queued for */
 
        struct list_head        lkb_idtbl_list; /* lockspace lkbtbl */
@@ -237,12 +244,19 @@ struct dlm_lkb {
        struct list_head        lkb_wait_reply; /* waiting for remote reply */
        struct list_head        lkb_astqueue;   /* need ast to be sent */
        struct list_head        lkb_ownqueue;   /* list of locks for a process */
+       struct list_head        lkb_time_list;
+       ktime_t                 lkb_time_bast;  /* for debugging */
+       ktime_t                 lkb_timestamp;
+       unsigned long           lkb_timeout_cs;
 
        char                    *lkb_lvbptr;
        struct dlm_lksb         *lkb_lksb;      /* caller's status block */
-       void                    *lkb_astaddr;   /* caller's ast function */
-       void                    *lkb_bastaddr;  /* caller's bast function */
-       long                    lkb_astparam;   /* caller's ast arg */
+       void                    (*lkb_astfn) (void *astparam);
+       void                    (*lkb_bastfn) (void *astparam, int mode);
+       union {
+               void                    *lkb_astparam;  /* caller's ast arg */
+               struct dlm_user_args    *lkb_ua;
+       };
 };
 
 
@@ -307,8 +321,8 @@ static inline int rsb_flag(struct dlm_rsb *r, enum rsb_flags flag)
 
 /* dlm_header is first element of all structs sent between nodes */
 
-#define DLM_HEADER_MAJOR       0x00020000
-#define DLM_HEADER_MINOR       0x00000001
+#define DLM_HEADER_MAJOR       0x00030000
+#define DLM_HEADER_MINOR       0x00000000
 
 #define DLM_MSG                        1
 #define DLM_RCOM               2
@@ -336,6 +350,7 @@ struct dlm_header {
 #define DLM_MSG_LOOKUP         11
 #define DLM_MSG_REMOVE         12
 #define DLM_MSG_LOOKUP_REPLY   13
+#define DLM_MSG_PURGE          14
 
 struct dlm_message {
        struct dlm_header       m_header;
@@ -384,31 +399,39 @@ struct dlm_rcom {
        uint32_t                rc_type;        /* DLM_RCOM_ */
        int                     rc_result;      /* multi-purpose */
        uint64_t                rc_id;          /* match reply with request */
+       uint64_t                rc_seq;         /* sender's ls_recover_seq */
+       uint64_t                rc_seq_reply;   /* remote ls_recover_seq */
        char                    rc_buf[0];
 };
 
+union dlm_packet {
+       struct dlm_header       header;         /* common to other two */
+       struct dlm_message      message;
+       struct dlm_rcom         rcom;
+};
+
 struct rcom_config {
-       uint32_t                rf_lvblen;
-       uint32_t                rf_lsflags;
-       uint64_t                rf_unused;
+       __le32                  rf_lvblen;
+       __le32                  rf_lsflags;
+       __le64                  rf_unused;
 };
 
 struct rcom_lock {
-       uint32_t                rl_ownpid;
-       uint32_t                rl_lkid;
-       uint32_t                rl_remid;
-       uint32_t                rl_parent_lkid;
-       uint32_t                rl_parent_remid;
-       uint32_t                rl_exflags;
-       uint32_t                rl_flags;
-       uint32_t                rl_lvbseq;
-       int                     rl_result;
+       __le32                  rl_ownpid;
+       __le32                  rl_lkid;
+       __le32                  rl_remid;
+       __le32                  rl_parent_lkid;
+       __le32                  rl_parent_remid;
+       __le32                  rl_exflags;
+       __le32                  rl_flags;
+       __le32                  rl_lvbseq;
+       __le32                  rl_result;
        int8_t                  rl_rqmode;
        int8_t                  rl_grmode;
        int8_t                  rl_status;
        int8_t                  rl_asts;
-       uint16_t                rl_wait_type;
-       uint16_t                rl_namelen;
+       __le16                  rl_wait_type;
+       __le16                  rl_namelen;
        char                    rl_name[DLM_RESNAME_MAXLEN];
        char                    rl_lvb[0];
 };
@@ -419,8 +442,11 @@ struct dlm_ls {
        uint32_t                ls_global_id;   /* global unique lockspace ID */
        uint32_t                ls_exflags;
        int                     ls_lvblen;
-       int                     ls_count;       /* reference count */
+       int                     ls_count;       /* refcount of processes in
+                                                  the dlm using this ls */
+       int                     ls_create_count; /* create/release refcount */
        unsigned long           ls_flags;       /* LSFL_ */
+       unsigned long           ls_scan_time;
        struct kobject          ls_kobj;
 
        struct dlm_rsbtable     *ls_rsbtbl;
@@ -435,12 +461,19 @@ struct dlm_ls {
        struct mutex            ls_waiters_mutex;
        struct list_head        ls_waiters;     /* lkbs needing a reply */
 
+       struct mutex            ls_orphans_mutex;
+       struct list_head        ls_orphans;
+
+       struct mutex            ls_timeout_mutex;
+       struct list_head        ls_timeout;
+
        struct list_head        ls_nodes;       /* current nodes in ls */
        struct list_head        ls_nodes_gone;  /* dead node list, recovery */
        int                     ls_num_nodes;   /* number of nodes in ls */
        int                     ls_low_nodeid;
        int                     ls_total_weight;
        int                     *ls_node_array;
+       gfp_t                   ls_allocation;
 
        struct dlm_rsb          ls_stub_rsb;    /* for returning errors */
        struct dlm_lkb          ls_stub_lkb;    /* for returning errors */
@@ -448,9 +481,13 @@ struct dlm_ls {
 
        struct dentry           *ls_debug_rsb_dentry; /* debugfs */
        struct dentry           *ls_debug_waiters_dentry; /* debugfs */
+       struct dentry           *ls_debug_locks_dentry; /* debugfs */
+       struct dentry           *ls_debug_all_dentry; /* debugfs */
 
        wait_queue_head_t       ls_uevent_wait; /* user part of join/leave */
        int                     ls_uevent_result;
+       struct completion       ls_members_done;
+       int                     ls_members_result;
 
        struct miscdevice       ls_device;
 
@@ -460,15 +497,18 @@ struct dlm_ls {
        struct task_struct      *ls_recoverd_task;
        struct mutex            ls_recoverd_active;
        spinlock_t              ls_recover_lock;
+       unsigned long           ls_recover_begin; /* jiffies timestamp */
        uint32_t                ls_recover_status; /* DLM_RS_ */
        uint64_t                ls_recover_seq;
        struct dlm_recover      *ls_recover_args;
        struct rw_semaphore     ls_in_recovery; /* block local requests */
+       struct rw_semaphore     ls_recv_active; /* block dlm_recv */
        struct list_head        ls_requestqueue;/* queue remote requests */
        struct mutex            ls_requestqueue_mutex;
-       char                    *ls_recover_buf;
+       struct dlm_rcom         *ls_recover_buf;
        int                     ls_recover_nodeid; /* for debugging */
        uint64_t                ls_rcom_seq;
+       spinlock_t              ls_rcom_spin;
        struct list_head        ls_recover_list;
        spinlock_t              ls_recover_list_lock;
        int                     ls_recover_list_count;
@@ -486,7 +526,9 @@ struct dlm_ls {
 #define LSFL_RUNNING           1
 #define LSFL_RECOVERY_STOP     2
 #define LSFL_RCOM_READY                3
-#define LSFL_UEVENT_WAIT       4
+#define LSFL_RCOM_WAIT         4
+#define LSFL_UEVENT_WAIT       5
+#define LSFL_TIMEWARN          6
 
 /* much of this is just saving user space pointers associated with the
    lock that we pass back to the user lib with an ast */
@@ -504,6 +546,7 @@ struct dlm_user_args {
        void __user             *castaddr;
        void __user             *bastparam;
        void __user             *bastaddr;
+       uint64_t                xid;
 };
 
 #define DLM_PROC_FLAGS_CLOSING 1
@@ -519,6 +562,7 @@ struct dlm_user_proc {
        spinlock_t              asts_spin;
        struct list_head        locks;
        spinlock_t              locks_spin;
+       struct list_head        unlocking;
        wait_queue_head_t       wait;
 };
 
@@ -537,5 +581,23 @@ static inline int dlm_no_directory(struct dlm_ls *ls)
        return (ls->ls_exflags & DLM_LSFL_NODIR) ? 1 : 0;
 }
 
+int dlm_netlink_init(void);
+void dlm_netlink_exit(void);
+void dlm_timeout_warn(struct dlm_lkb *lkb);
+int dlm_plock_init(void);
+void dlm_plock_exit(void);
+
+#ifdef CONFIG_DLM_DEBUG
+int dlm_register_debugfs(void);
+void dlm_unregister_debugfs(void);
+int dlm_create_debug_file(struct dlm_ls *ls);
+void dlm_delete_debug_file(struct dlm_ls *ls);
+#else
+static inline int dlm_register_debugfs(void) { return 0; }
+static inline void dlm_unregister_debugfs(void) { }
+static inline int dlm_create_debug_file(struct dlm_ls *ls) { return 0; }
+static inline void dlm_delete_debug_file(struct dlm_ls *ls) { }
+#endif
+
 #endif                         /* __DLM_INTERNAL_DOT_H__ */