[DLM] Remove range locks from the DLM
authorDavid Teigland <teigland@redhat.com>
Thu, 23 Feb 2006 09:56:38 +0000 (09:56 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Thu, 23 Feb 2006 09:56:38 +0000 (09:56 +0000)
This patch removes support for range locking from the DLM

Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/dlm/debug_fs.c
fs/dlm/device.c
fs/dlm/dlm_internal.h
fs/dlm/lock.c
fs/dlm/memory.c
fs/dlm/memory.h
fs/dlm/rcom.c
fs/dlm/util.c
include/linux/dlm.h
include/linux/dlm_device.h

index 5080bbf..49deca8 100644 (file)
@@ -59,20 +59,6 @@ static void print_lock(struct seq_file *s, struct dlm_lkb *lkb,
            || lkb->lkb_status == DLM_LKSTS_WAITING)
                seq_printf(s, " (%s)", print_lockmode(lkb->lkb_rqmode));
 
-       if (lkb->lkb_range) {
-               /* FIXME: this warns on Alpha */
-               if (lkb->lkb_status == DLM_LKSTS_CONVERT
-                   || lkb->lkb_status == DLM_LKSTS_GRANTED)
-                       seq_printf(s, " %llx-%llx",
-                                  lkb->lkb_range[GR_RANGE_START],
-                                  lkb->lkb_range[GR_RANGE_END]);
-               if (lkb->lkb_status == DLM_LKSTS_CONVERT
-                   || lkb->lkb_status == DLM_LKSTS_WAITING)
-                       seq_printf(s, " (%llx-%llx)",
-                                  lkb->lkb_range[RQ_RANGE_START],
-                                  lkb->lkb_range[RQ_RANGE_END]);
-       }
-
        if (lkb->lkb_nodeid) {
                if (lkb->lkb_nodeid != res->res_nodeid)
                        seq_printf(s, " Remote: %3d %08x", lkb->lkb_nodeid,
index 899d4f9..99d8b6b 100644 (file)
@@ -532,8 +532,7 @@ static int dlm_close(struct inode *inode, struct file *file)
                        status = dlm_lock(f->fi_ls->ls_lockspace,
                                          old_li->li_grmode, &li.li_lksb,
                                          DLM_LKF_CONVERT|DLM_LKF_ORPHAN,
-                                         NULL, 0, 0, ast_routine, NULL,
-                                         NULL, NULL);
+                                         NULL, 0, 0, ast_routine, NULL, NULL);
                        if (status != 0)
                                printk("dlm: Error orphaning lock %x: %d\n",
                                       old_li->li_lksb.sb_lkid, status);
@@ -878,8 +877,7 @@ static int do_user_lock(struct file_info *fi, uint8_t cmd,
                          ast_routine,
                          li,
                          (li->li_pend_bastaddr || li->li_bastaddr) ?
-                          bast_routine : NULL,
-                         kparams->range.ra_end ? &kparams->range : NULL);
+                          bast_routine : NULL);
        if (status)
                goto out_err;
 
index 16f20cf..c329902 100644 (file)
@@ -146,7 +146,6 @@ struct dlm_args {
        void                    *bastaddr;
        int                     mode;
        struct dlm_lksb         *lksb;
-       struct dlm_range        *range;
 };
 
 
@@ -195,13 +194,6 @@ struct dlm_args {
 #define AST_COMP               1
 #define AST_BAST               2
 
-/* lkb_range[] */
-
-#define GR_RANGE_START         0
-#define GR_RANGE_END           1
-#define RQ_RANGE_START         2
-#define RQ_RANGE_END           3
-
 /* lkb_status */
 
 #define DLM_LKSTS_WAITING      1
@@ -212,7 +204,6 @@ struct dlm_args {
 
 #define DLM_IFL_MSTCPY         0x00010000
 #define DLM_IFL_RESEND         0x00020000
-#define DLM_IFL_RANGE          0x00000001
 
 struct dlm_lkb {
        struct dlm_rsb          *lkb_resource;  /* the rsb */
@@ -241,7 +232,6 @@ struct dlm_lkb {
        struct list_head        lkb_wait_reply; /* waiting for remote reply */
        struct list_head        lkb_astqueue;   /* need ast to be sent */
 
-       uint64_t                *lkb_range;     /* array of gr/rq ranges */
        char                    *lkb_lvbptr;
        struct dlm_lksb         *lkb_lksb;      /* caller's status block */
        void                    *lkb_astaddr;   /* caller's ast function */
@@ -360,7 +350,6 @@ struct dlm_message {
        int                     m_bastmode;
        int                     m_asts;
        int                     m_result;       /* 0 or -EXXX */
-       uint64_t                m_range[2];
        char                    m_extra[0];     /* name or lvb */
 };
 
@@ -413,7 +402,6 @@ struct rcom_lock {
        int8_t                  rl_asts;
        uint16_t                rl_wait_type;
        uint16_t                rl_namelen;
-       uint64_t                rl_range[4];
        char                    rl_name[DLM_RESNAME_MAXLEN];
        char                    rl_lvb[0];
 };
index 29d3b95..8048770 100644 (file)
@@ -606,8 +606,6 @@ static int put_lkb(struct dlm_lkb *lkb)
                /* for local/process lkbs, lvbptr points to caller's lksb */
                if (lkb->lkb_lvbptr && is_master_copy(lkb))
                        free_lvb(lkb->lkb_lvbptr);
-               if (lkb->lkb_range)
-                       free_range(lkb->lkb_range);
                free_lkb(lkb);
                return 1;
        } else {
@@ -988,11 +986,6 @@ static void _grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
        }
 
        lkb->lkb_rqmode = DLM_LOCK_IV;
-
-       if (lkb->lkb_range) {
-               lkb->lkb_range[GR_RANGE_START] = lkb->lkb_range[RQ_RANGE_START];
-               lkb->lkb_range[GR_RANGE_END] = lkb->lkb_range[RQ_RANGE_END];
-       }
 }
 
 static void grant_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
@@ -1032,21 +1025,6 @@ static inline int first_in_list(struct dlm_lkb *lkb, struct list_head *head)
        return 0;
 }
 
-/* Return 1 if the locks' ranges overlap.  If the lkb has no range then it is
-   assumed to cover 0-ffffffff.ffffffff */
-
-static inline int ranges_overlap(struct dlm_lkb *lkb1, struct dlm_lkb *lkb2)
-{
-       if (!lkb1->lkb_range || !lkb2->lkb_range)
-               return 1;
-
-       if (lkb1->lkb_range[RQ_RANGE_END] < lkb2->lkb_range[GR_RANGE_START] ||
-           lkb1->lkb_range[RQ_RANGE_START] > lkb2->lkb_range[GR_RANGE_END])
-               return 0;
-
-       return 1;
-}
-
 /* Check if the given lkb conflicts with another lkb on the queue. */
 
 static int queue_conflict(struct list_head *head, struct dlm_lkb *lkb)
@@ -1056,7 +1034,7 @@ static int queue_conflict(struct list_head *head, struct dlm_lkb *lkb)
        list_for_each_entry(this, head, lkb_statequeue) {
                if (this == lkb)
                        continue;
-               if (ranges_overlap(lkb, this) && !modes_compat(this, lkb))
+               if (!modes_compat(this, lkb))
                        return 1;
        }
        return 0;
@@ -1099,9 +1077,6 @@ static int conversion_deadlock_detect(struct dlm_rsb *rsb, struct dlm_lkb *lkb)
                        continue;
                }
 
-               if (!ranges_overlap(lkb, this))
-                       continue;
-
                if (!modes_compat(this, lkb) && !modes_compat(lkb, this))
                        return 1;
        }
@@ -1203,8 +1178,8 @@ static int _can_be_granted(struct dlm_rsb *r, struct dlm_lkb *lkb, int now)
                return 1;
 
        /*
-        * When using range locks the NOORDER flag is set to avoid the standard
-        * vms rules on grant order.
+        * The NOORDER flag is set to avoid the standard vms rules on grant
+        * order.
         */
 
        if (lkb->lkb_exflags & DLM_LKF_NOORDER)
@@ -1358,8 +1333,7 @@ static void grant_pending_locks(struct dlm_rsb *r)
        /*
         * If there are locks left on the wait/convert queue then send blocking
         * ASTs to granted locks based on the largest requested mode (high)
-        * found above.  This can generate spurious blocking ASTs for range
-        * locks. FIXME: highbast < high comparison not valid for PR/CW.
+        * found above. FIXME: highbast < high comparison not valid for PR/CW.
         */
 
        list_for_each_entry_safe(lkb, s, &r->res_grantqueue, lkb_statequeue) {
@@ -1379,7 +1353,7 @@ static void send_bast_queue(struct dlm_rsb *r, struct list_head *head,
        list_for_each_entry(gr, head, lkb_statequeue) {
                if (gr->lkb_bastaddr &&
                    gr->lkb_highbast < lkb->lkb_rqmode &&
-                   ranges_overlap(lkb, gr) && !modes_compat(gr, lkb)) {
+                   !modes_compat(gr, lkb)) {
                        queue_bast(r, gr, lkb->lkb_rqmode);
                        gr->lkb_highbast = lkb->lkb_rqmode;
                }
@@ -1530,8 +1504,7 @@ static void confirm_master(struct dlm_rsb *r, int error)
 
 static int set_lock_args(int mode, struct dlm_lksb *lksb, uint32_t flags,
                         int namelen, uint32_t parent_lkid, void *ast,
-                        void *astarg, void *bast, struct dlm_range *range,
-                        struct dlm_args *args)
+                        void *astarg, void *bast, struct dlm_args *args)
 {
        int rv = -EINVAL;
 
@@ -1590,7 +1563,6 @@ static int set_lock_args(int mode, struct dlm_lksb *lksb, uint32_t flags,
        args->bastaddr = bast;
        args->mode = mode;
        args->lksb = lksb;
-       args->range = range;
        rv = 0;
  out:
        return rv;
@@ -1637,26 +1609,6 @@ static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
        lkb->lkb_lksb = args->lksb;
        lkb->lkb_lvbptr = args->lksb->sb_lvbptr;
        lkb->lkb_ownpid = (int) current->pid;
-
-       rv = 0;
-       if (!args->range)
-               goto out;
-
-       if (!lkb->lkb_range) {
-               rv = -ENOMEM;
-               lkb->lkb_range = allocate_range(ls);
-               if (!lkb->lkb_range)
-                       goto out;
-               /* This is needed for conversions that contain ranges
-                  where the original lock didn't but it's harmless for
-                  new locks too. */
-               lkb->lkb_range[GR_RANGE_START] = 0LL;
-               lkb->lkb_range[GR_RANGE_END] = 0xffffffffffffffffULL;
-       }
-
-       lkb->lkb_range[RQ_RANGE_START] = args->range->ra_start;
-       lkb->lkb_range[RQ_RANGE_END] = args->range->ra_end;
-       lkb->lkb_flags |= DLM_IFL_RANGE;
        rv = 0;
  out:
        return rv;
@@ -1805,7 +1757,7 @@ static int _request_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
        return error;
 }
 
-/* change some property of an existing lkb, e.g. mode, range */
+/* change some property of an existing lkb, e.g. mode */
 
 static int _convert_lock(struct dlm_rsb *r, struct dlm_lkb *lkb)
 {
@@ -1962,8 +1914,7 @@ int dlm_lock(dlm_lockspace_t *lockspace,
             uint32_t parent_lkid,
             void (*ast) (void *astarg),
             void *astarg,
-            void (*bast) (void *astarg, int mode),
-            struct dlm_range *range)
+            void (*bast) (void *astarg, int mode))
 {
        struct dlm_ls *ls;
        struct dlm_lkb *lkb;
@@ -1985,7 +1936,7 @@ int dlm_lock(dlm_lockspace_t *lockspace,
                goto out;
 
        error = set_lock_args(mode, lksb, flags, namelen, parent_lkid, ast,
-                             astarg, bast, range, &args);
+                             astarg, bast, &args);
        if (error)
                goto out_put;
 
@@ -2154,11 +2105,6 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb,
        if (lkb->lkb_astaddr)
                ms->m_asts |= AST_COMP;
 
-       if (lkb->lkb_range) {
-               ms->m_range[0] = lkb->lkb_range[RQ_RANGE_START];
-               ms->m_range[1] = lkb->lkb_range[RQ_RANGE_END];
-       }
-
        if (ms->m_type == DLM_MSG_REQUEST || ms->m_type == DLM_MSG_LOOKUP)
                memcpy(ms->m_extra, r->res_name, r->res_length);
 
@@ -2402,20 +2348,6 @@ static int receive_extralen(struct dlm_message *ms)
        return (ms->m_header.h_length - sizeof(struct dlm_message));
 }
 
-static int receive_range(struct dlm_ls *ls, struct dlm_lkb *lkb,
-                        struct dlm_message *ms)
-{
-       if (lkb->lkb_flags & DLM_IFL_RANGE) {
-               if (!lkb->lkb_range)
-                       lkb->lkb_range = allocate_range(ls);
-               if (!lkb->lkb_range)
-                       return -ENOMEM;
-               lkb->lkb_range[RQ_RANGE_START] = ms->m_range[0];
-               lkb->lkb_range[RQ_RANGE_END] = ms->m_range[1];
-       }
-       return 0;
-}
-
 static int receive_lvb(struct dlm_ls *ls, struct dlm_lkb *lkb,
                       struct dlm_message *ms)
 {
@@ -2445,9 +2377,6 @@ static int receive_request_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
 
        DLM_ASSERT(is_master_copy(lkb), dlm_print_lkb(lkb););
 
-       if (receive_range(ls, lkb, ms))
-               return -ENOMEM;
-
        if (receive_lvb(ls, lkb, ms))
                return -ENOMEM;
 
@@ -2470,13 +2399,6 @@ static int receive_convert_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
        if (lkb->lkb_status != DLM_LKSTS_GRANTED)
                return -EBUSY;
 
-       if (receive_range(ls, lkb, ms))
-               return -ENOMEM;
-       if (lkb->lkb_range) {
-               lkb->lkb_range[GR_RANGE_START] = 0LL;
-               lkb->lkb_range[GR_RANGE_END] = 0xffffffffffffffffULL;
-       }
-
        if (receive_lvb(ls, lkb, ms))
                return -ENOMEM;
 
@@ -3476,13 +3398,6 @@ static int receive_rcom_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb,
        lkb->lkb_bastaddr = (void *) (long) (rl->rl_asts & AST_BAST);
        lkb->lkb_astaddr = (void *) (long) (rl->rl_asts & AST_COMP);
 
-       if (lkb->lkb_flags & DLM_IFL_RANGE) {
-               lkb->lkb_range = allocate_range(ls);
-               if (!lkb->lkb_range)
-                       return -ENOMEM;
-               memcpy(lkb->lkb_range, rl->rl_range, 4*sizeof(uint64_t));
-       }
-
        if (lkb->lkb_exflags & DLM_LKF_VALBLK) {
                lkb->lkb_lvbptr = allocate_lvb(ls);
                if (!lkb->lkb_lvbptr)
index 0b9851d..f7cf458 100644 (file)
@@ -50,22 +50,6 @@ void free_lvb(char *p)
        kfree(p);
 }
 
-uint64_t *allocate_range(struct dlm_ls *ls)
-{
-       int ralen = 4*sizeof(uint64_t);
-       uint64_t *p;
-
-       p = kmalloc(ralen, GFP_KERNEL);
-       if (p)
-               memset(p, 0, ralen);
-       return p;
-}
-
-void free_range(uint64_t *p)
-{
-       kfree(p);
-}
-
 /* FIXME: have some minimal space built-in to rsb for the name and
    kmalloc a separate name if needed, like dentries are done */
 
index 7b23513..6ead158 100644 (file)
@@ -24,8 +24,6 @@ struct dlm_direntry *allocate_direntry(struct dlm_ls *ls, int namelen);
 void free_direntry(struct dlm_direntry *de);
 char *allocate_lvb(struct dlm_ls *ls);
 void free_lvb(char *l);
-uint64_t *allocate_range(struct dlm_ls *ls);
-void free_range(uint64_t *l);
 
 #endif         /* __MEMORY_DOT_H__ */
 
index 4c5c08a..55fbe31 100644 (file)
@@ -284,9 +284,6 @@ static void pack_rcom_lock(struct dlm_rsb *r, struct dlm_lkb *lkb,
        if (lkb->lkb_astaddr)
                rl->rl_asts |= AST_COMP;
 
-       if (lkb->lkb_range)
-               memcpy(rl->rl_range, lkb->lkb_range, 4*sizeof(uint64_t));
-
        rl->rl_namelen = r->res_length;
        memcpy(rl->rl_name, r->res_name, r->res_length);
 
index 826d122..767197d 100644 (file)
@@ -54,8 +54,6 @@ void dlm_message_out(struct dlm_message *ms)
        ms->m_bastmode          = cpu_to_le32(ms->m_bastmode);
        ms->m_asts              = cpu_to_le32(ms->m_asts);
        ms->m_result            = cpu_to_le32(ms->m_result);
-       ms->m_range[0]          = cpu_to_le64(ms->m_range[0]);
-       ms->m_range[1]          = cpu_to_le64(ms->m_range[1]);
 }
 
 void dlm_message_in(struct dlm_message *ms)
@@ -82,8 +80,6 @@ void dlm_message_in(struct dlm_message *ms)
        ms->m_bastmode          = le32_to_cpu(ms->m_bastmode);
        ms->m_asts              = le32_to_cpu(ms->m_asts);
        ms->m_result            = le32_to_cpu(ms->m_result);
-       ms->m_range[0]          = le64_to_cpu(ms->m_range[0]);
-       ms->m_range[1]          = le64_to_cpu(ms->m_range[1]);
 }
 
 static void rcom_lock_out(struct rcom_lock *rl)
@@ -99,10 +95,6 @@ static void rcom_lock_out(struct rcom_lock *rl)
        rl->rl_result           = cpu_to_le32(rl->rl_result);
        rl->rl_wait_type        = cpu_to_le16(rl->rl_wait_type);
        rl->rl_namelen          = cpu_to_le16(rl->rl_namelen);
-       rl->rl_range[0]         = cpu_to_le64(rl->rl_range[0]);
-       rl->rl_range[1]         = cpu_to_le64(rl->rl_range[1]);
-       rl->rl_range[2]         = cpu_to_le64(rl->rl_range[2]);
-       rl->rl_range[3]         = cpu_to_le64(rl->rl_range[3]);
 }
 
 static void rcom_lock_in(struct rcom_lock *rl)
@@ -118,10 +110,6 @@ static void rcom_lock_in(struct rcom_lock *rl)
        rl->rl_result           = le32_to_cpu(rl->rl_result);
        rl->rl_wait_type        = le16_to_cpu(rl->rl_wait_type);
        rl->rl_namelen          = le16_to_cpu(rl->rl_namelen);
-       rl->rl_range[0]         = le64_to_cpu(rl->rl_range[0]);
-       rl->rl_range[1]         = le64_to_cpu(rl->rl_range[1]);
-       rl->rl_range[2]         = le64_to_cpu(rl->rl_range[2]);
-       rl->rl_range[3]         = le64_to_cpu(rl->rl_range[3]);
 }
 
 static void rcom_config_out(struct rcom_config *rf)
index dd324ba..1b1dcb9 100644 (file)
 
 typedef void dlm_lockspace_t;
 
-/*
- * Lock range structure
- */
-
-struct dlm_range {
-       uint64_t ra_start;
-       uint64_t ra_end;
-};
-
 /*
  * Lock status block
  *
@@ -277,8 +268,7 @@ int dlm_lock(dlm_lockspace_t *lockspace,
             uint32_t parent_lkid,
             void (*lockast) (void *astarg),
             void *astarg,
-            void (*bast) (void *astarg, int mode),
-            struct dlm_range *range);
+            void (*bast) (void *astarg, int mode));
 
 /*
  * dlm_unlock
index 5e17d29..f8ba198 100644 (file)
@@ -18,7 +18,7 @@
 #define DLM_USER_LVB_LEN       32
 
 /* Version of the device interface */
-#define DLM_DEVICE_VERSION_MAJOR 3
+#define DLM_DEVICE_VERSION_MAJOR 4
 #define DLM_DEVICE_VERSION_MINOR 0
 #define DLM_DEVICE_VERSION_PATCH 0
 
@@ -28,7 +28,6 @@ struct dlm_lock_params {
        __u16 flags;
        __u32 lkid;
        __u32 parent;
-       struct dlm_range range;
        __u8 namelen;
         void __user *castparam;
        void __user *castaddr;