[DLM] variable allocation
authorPatrick Caulfield <pcaulfie@redhat.com>
Wed, 6 Jun 2007 14:21:22 +0000 (09:21 -0500)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 9 Jul 2007 07:23:17 +0000 (08:23 +0100)
Add a new flag, DLM_LSFL_FS, to be used when a file system creates a lockspace.
This flag causes the dlm to use GFP_NOFS for allocations instead of GFP_KERNEL.
(This updated version of the patch uses gfp_t for ls_allocation.)

Signed-Off-By: Patrick Caulfield <pcaulfie@redhat.com>
Signed-Off-By: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/dlm/dlm_internal.h
fs/dlm/lock.c
fs/dlm/lockspace.c
fs/dlm/rcom.c
fs/gfs2/locking/dlm/mount.c
include/linux/dlm.h

index f2c85493c0c6bdac996e971a7e9271d52de6445f..8ac081882c78799780cc1a2c740a27bb4c13c2e9 100644 (file)
@@ -463,6 +463,7 @@ struct dlm_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 */
index de943afacb37aa26e175d26a87452467a4b0d30b..b455919c19984ad408d4ca498ad72f40a7d33d1f 100644 (file)
@@ -2594,7 +2594,7 @@ static int _create_message(struct dlm_ls *ls, int mb_len,
           pass into lowcomms_commit and a message buffer (mb) that we
           write our data into */
 
-       mh = dlm_lowcomms_get_buffer(to_nodeid, mb_len, GFP_KERNEL, &mb);
+       mh = dlm_lowcomms_get_buffer(to_nodeid, mb_len, ls->ls_allocation, &mb);
        if (!mh)
                return -ENOBUFS;
 
index c8f0c15ac166460ee07e0476b4a6d9b8c5a70833..6802653473d14f2cfb4aca8a24de29ad286246c5 100644 (file)
@@ -444,6 +444,11 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
                set_bit(LSFL_TIMEWARN, &ls->ls_flags);
        ls->ls_exflags = (flags & ~DLM_LSFL_TIMEWARN);
 
+       if (flags & DLM_LSFL_FS)
+               ls->ls_allocation = GFP_NOFS;
+       else
+               ls->ls_allocation = GFP_KERNEL;
+
        size = dlm_config.ci_rsbtbl_size;
        ls->ls_rsbtbl_size = size;
 
index f71c23542f0fe70c105154534ccb21e5cd71acc2..e3a1527cbdbe7c8cd4bb0a8b6605e486b8ea538c 100644 (file)
@@ -38,7 +38,7 @@ static int create_rcom(struct dlm_ls *ls, int to_nodeid, int type, int len,
        char *mb;
        int mb_len = sizeof(struct dlm_rcom) + len;
 
-       mh = dlm_lowcomms_get_buffer(to_nodeid, mb_len, GFP_KERNEL, &mb);
+       mh = dlm_lowcomms_get_buffer(to_nodeid, mb_len, ls->ls_allocation, &mb);
        if (!mh) {
                log_print("create_rcom to %d type %d len %d ENOBUFS",
                          to_nodeid, type, len);
@@ -386,7 +386,8 @@ static void receive_rcom_lock_reply(struct dlm_ls *ls, struct dlm_rcom *rc_in)
        dlm_recover_process_copy(ls, rc_in);
 }
 
-static int send_ls_not_ready(int nodeid, struct dlm_rcom *rc_in)
+static int send_ls_not_ready(struct dlm_ls *ls, int nodeid,
+                            struct dlm_rcom *rc_in)
 {
        struct dlm_rcom *rc;
        struct rcom_config *rf;
@@ -394,7 +395,7 @@ static int send_ls_not_ready(int nodeid, struct dlm_rcom *rc_in)
        char *mb;
        int mb_len = sizeof(struct dlm_rcom) + sizeof(struct rcom_config);
 
-       mh = dlm_lowcomms_get_buffer(nodeid, mb_len, GFP_KERNEL, &mb);
+       mh = dlm_lowcomms_get_buffer(nodeid, mb_len, ls->ls_allocation, &mb);
        if (!mh)
                return -ENOBUFS;
        memset(mb, 0, mb_len);
@@ -464,7 +465,7 @@ void dlm_receive_rcom(struct dlm_header *hd, int nodeid)
                log_print("lockspace %x from %d type %x not found",
                          hd->h_lockspace, nodeid, rc->rc_type);
                if (rc->rc_type == DLM_RCOM_STATUS)
-                       send_ls_not_ready(nodeid, rc);
+                       send_ls_not_ready(ls, nodeid, rc);
                return;
        }
 
index 1d8faa3da8af1f984168de88796f89281c8773ea..41c5b04caaba4194712fe955a76750462066d4b2 100644 (file)
@@ -147,7 +147,7 @@ static int gdlm_mount(char *table_name, char *host_data,
 
        error = dlm_new_lockspace(ls->fsname, strlen(ls->fsname),
                                  &ls->dlm_lockspace,
-                                 nodir ? DLM_LSFL_NODIR : 0,
+                                 DLM_LSFL_FS | (nodir ? DLM_LSFL_NODIR : 0),
                                  GDLM_LVB_SIZE);
        if (error) {
                log_error("dlm_new_lockspace error %d", error);
index 5227a9594f9d47863f5fe31ee28d79cde98a4103..be9d278761e0ed5ddbb87653d64f34e9108956cb 100644 (file)
@@ -206,6 +206,7 @@ struct dlm_lksb {
 
 #define DLM_LSFL_NODIR         0x00000001
 #define DLM_LSFL_TIMEWARN      0x00000002
+#define DLM_LSFL_FS            0x00000004
 
 #ifdef __KERNEL__