This patch allows to give the use control about the allocation context
based on a per message basis. Currently all messages forced to be
created under GFP_NOFS context.

Signed-off-by: Alexander Aring <[email protected]>
---
 fs/dlm/lock.c     | 31 +++++++++++++++++++------------
 fs/dlm/memory.c   |  4 ++--
 fs/dlm/memory.h   |  2 +-
 fs/dlm/midcomms.c |  2 +-
 4 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c
index 1ffe4eb09640..52bdaca400f4 100644
--- a/fs/dlm/lock.c
+++ b/fs/dlm/lock.c
@@ -3555,7 +3555,8 @@ int dlm_unlock(dlm_lockspace_t *lockspace,
 static int _create_message(struct dlm_ls *ls, int mb_len,
                           int to_nodeid, int mstype,
                           struct dlm_message **ms_ret,
-                          struct dlm_mhandle **mh_ret)
+                          struct dlm_mhandle **mh_ret,
+                          gfp_t allocation)
 {
        struct dlm_message *ms;
        struct dlm_mhandle *mh;
@@ -3565,7 +3566,7 @@ static int _create_message(struct dlm_ls *ls, int mb_len,
           pass into midcomms_commit and a message buffer (mb) that we
           write our data into */
 
-       mh = dlm_midcomms_get_mhandle(to_nodeid, mb_len, GFP_NOFS, &mb);
+       mh = dlm_midcomms_get_mhandle(to_nodeid, mb_len, allocation, &mb);
        if (!mh)
                return -ENOBUFS;
 
@@ -3587,7 +3588,8 @@ static int _create_message(struct dlm_ls *ls, int mb_len,
 static int create_message(struct dlm_rsb *r, struct dlm_lkb *lkb,
                          int to_nodeid, int mstype,
                          struct dlm_message **ms_ret,
-                         struct dlm_mhandle **mh_ret)
+                         struct dlm_mhandle **mh_ret,
+                         gfp_t allocation)
 {
        int mb_len = sizeof(struct dlm_message);
 
@@ -3608,7 +3610,7 @@ static int create_message(struct dlm_rsb *r, struct 
dlm_lkb *lkb,
        }
 
        return _create_message(r->res_ls, mb_len, to_nodeid, mstype,
-                              ms_ret, mh_ret);
+                              ms_ret, mh_ret, allocation);
 }
 
 /* further lowcomms enhancements or alternate implementations may make
@@ -3677,7 +3679,7 @@ static int send_common(struct dlm_rsb *r, struct dlm_lkb 
*lkb, int mstype)
        if (error)
                return error;
 
-       error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh);
+       error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh, GFP_NOFS);
        if (error)
                goto fail;
 
@@ -3738,7 +3740,8 @@ static int send_grant(struct dlm_rsb *r, struct dlm_lkb 
*lkb)
 
        to_nodeid = lkb->lkb_nodeid;
 
-       error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh);
+       error = create_message(r, lkb, to_nodeid, DLM_MSG_GRANT, &ms, &mh,
+                              GFP_NOFS);
        if (error)
                goto out;
 
@@ -3759,7 +3762,8 @@ static int send_bast(struct dlm_rsb *r, struct dlm_lkb 
*lkb, int mode)
 
        to_nodeid = lkb->lkb_nodeid;
 
-       error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh);
+       error = create_message(r, NULL, to_nodeid, DLM_MSG_BAST, &ms, &mh,
+                              GFP_NOFS);
        if (error)
                goto out;
 
@@ -3784,7 +3788,8 @@ static int send_lookup(struct dlm_rsb *r, struct dlm_lkb 
*lkb)
        if (error)
                return error;
 
-       error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh);
+       error = create_message(r, NULL, to_nodeid, DLM_MSG_LOOKUP, &ms, &mh,
+                              GFP_NOFS);
        if (error)
                goto fail;
 
@@ -3808,7 +3813,8 @@ static int send_remove(struct dlm_rsb *r)
 
        to_nodeid = dlm_dir_nodeid(r);
 
-       error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh);
+       error = create_message(r, NULL, to_nodeid, DLM_MSG_REMOVE, &ms, &mh,
+                              GFP_NOFS);
        if (error)
                goto out;
 
@@ -3829,7 +3835,7 @@ static int send_common_reply(struct dlm_rsb *r, struct 
dlm_lkb *lkb,
 
        to_nodeid = lkb->lkb_nodeid;
 
-       error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh);
+       error = create_message(r, lkb, to_nodeid, mstype, &ms, &mh, GFP_NOFS);
        if (error)
                goto out;
 
@@ -3870,7 +3876,8 @@ static int send_lookup_reply(struct dlm_ls *ls, struct 
dlm_message *ms_in,
        struct dlm_mhandle *mh;
        int error, nodeid = le32_to_cpu(ms_in->m_header.h_nodeid);
 
-       error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh);
+       error = create_message(r, NULL, nodeid, DLM_MSG_LOOKUP_REPLY, &ms, &mh,
+                              GFP_NOFS);
        if (error)
                goto out;
 
@@ -6295,7 +6302,7 @@ static int send_purge(struct dlm_ls *ls, int nodeid, int 
pid)
        int error;
 
        error = _create_message(ls, sizeof(struct dlm_message), nodeid,
-                               DLM_MSG_PURGE, &ms, &mh);
+                               DLM_MSG_PURGE, &ms, &mh, GFP_NOFS);
        if (error)
                return error;
        ms->m_nodeid = cpu_to_le32(nodeid);
diff --git a/fs/dlm/memory.c b/fs/dlm/memory.c
index 61fe0d1f5646..eb7a08641fcf 100644
--- a/fs/dlm/memory.c
+++ b/fs/dlm/memory.c
@@ -134,9 +134,9 @@ void dlm_free_lkb(struct dlm_lkb *lkb)
        kmem_cache_free(lkb_cache, lkb);
 }
 
-struct dlm_mhandle *dlm_allocate_mhandle(void)
+struct dlm_mhandle *dlm_allocate_mhandle(gfp_t allocation)
 {
-       return kmem_cache_alloc(mhandle_cache, GFP_NOFS);
+       return kmem_cache_alloc(mhandle_cache, allocation);
 }
 
 void dlm_free_mhandle(struct dlm_mhandle *mhandle)
diff --git a/fs/dlm/memory.h b/fs/dlm/memory.h
index c1583ec8b2cf..6b29563d24f7 100644
--- a/fs/dlm/memory.h
+++ b/fs/dlm/memory.h
@@ -20,7 +20,7 @@ struct dlm_lkb *dlm_allocate_lkb(struct dlm_ls *ls);
 void dlm_free_lkb(struct dlm_lkb *l);
 char *dlm_allocate_lvb(struct dlm_ls *ls);
 void dlm_free_lvb(char *l);
-struct dlm_mhandle *dlm_allocate_mhandle(void);
+struct dlm_mhandle *dlm_allocate_mhandle(gfp_t allocation);
 void dlm_free_mhandle(struct dlm_mhandle *mhandle);
 struct writequeue_entry *dlm_allocate_writequeue(void);
 void dlm_free_writequeue(struct writequeue_entry *writequeue);
diff --git a/fs/dlm/midcomms.c b/fs/dlm/midcomms.c
index e10a6e97df44..3a4e20d6cd2d 100644
--- a/fs/dlm/midcomms.c
+++ b/fs/dlm/midcomms.c
@@ -1097,7 +1097,7 @@ struct dlm_mhandle *dlm_midcomms_get_mhandle(int nodeid, 
int len,
        /* this is a bug, however we going on and hope it will be resolved */
        WARN_ON(test_bit(DLM_NODE_FLAG_STOP_TX, &node->flags));
 
-       mh = dlm_allocate_mhandle();
+       mh = dlm_allocate_mhandle(allocation);
        if (!mh)
                goto err;
 
-- 
2.31.1

Reply via email to