diff options
| author | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-07 12:13:20 -0500 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-07 12:13:20 -0500 | 
| commit | 1c1afa3c053d4ccdf44e5a4e159005cdfd48bfc6 (patch) | |
| tree | 3e686ad4cf1ae2300e7190ff83afc3f3dd4ba740 /fs/dlm/requestqueue.c | |
| parent | 0a01707b289853f56d1c000057b27e243c039722 (diff) | |
| parent | ac33d0710595579e3cfca42dde2257eb0b123f6d (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
* master.kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw: (73 commits)
  [DLM] Clean up lowcomms
  [GFS2] Change gfs2_fsync() to use write_inode_now()
  [GFS2] Fix indent in recovery.c
  [GFS2] Don't flush everything on fdatasync
  [GFS2] Add a comment about reading the super block
  [GFS2] Mount problem with the GFS2 code
  [GFS2] Remove gfs2_check_acl()
  [DLM] fix format warnings in rcom.c and recoverd.c
  [GFS2] lock function parameter
  [DLM] don't accept replies to old recovery messages
  [DLM] fix size of STATUS_REPLY message
  [GFS2] fs/gfs2/log.c:log_bmap() fix printk format warning
  [DLM] fix add_requestqueue checking nodes list
  [GFS2] Fix recursive locking in gfs2_getattr
  [GFS2] Fix recursive locking in gfs2_permission
  [GFS2] Reduce number of arguments to meta_io.c:getbuf()
  [GFS2] Move gfs2_meta_syncfs() into log.c
  [GFS2] Fix journal flush problem
  [GFS2] mark_inode_dirty after write to stuffed file
  [GFS2] Fix glock ordering on inode creation
  ...
Diffstat (limited to 'fs/dlm/requestqueue.c')
| -rw-r--r-- | fs/dlm/requestqueue.c | 26 | 
1 files changed, 20 insertions, 6 deletions
diff --git a/fs/dlm/requestqueue.c b/fs/dlm/requestqueue.c index 7b2b089634a2..65008d79c96d 100644 --- a/fs/dlm/requestqueue.c +++ b/fs/dlm/requestqueue.c  | |||
| @@ -30,26 +30,36 @@ struct rq_entry { | |||
| 30 | * lockspace is enabled on some while still suspended on others. | 30 | * lockspace is enabled on some while still suspended on others. | 
| 31 | */ | 31 | */ | 
| 32 | 32 | ||
| 33 | void dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_header *hd) | 33 | int dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_header *hd) | 
| 34 | { | 34 | { | 
| 35 | struct rq_entry *e; | 35 | struct rq_entry *e; | 
| 36 | int length = hd->h_length; | 36 | int length = hd->h_length; | 
| 37 | 37 | int rv = 0; | |
| 38 | if (dlm_is_removed(ls, nodeid)) | ||
| 39 | return; | ||
| 40 | 38 | ||
| 41 | e = kmalloc(sizeof(struct rq_entry) + length, GFP_KERNEL); | 39 | e = kmalloc(sizeof(struct rq_entry) + length, GFP_KERNEL); | 
| 42 | if (!e) { | 40 | if (!e) { | 
| 43 | log_print("dlm_add_requestqueue: out of memory\n"); | 41 | log_print("dlm_add_requestqueue: out of memory\n"); | 
| 44 | return; | 42 | return 0; | 
| 45 | } | 43 | } | 
| 46 | 44 | ||
| 47 | e->nodeid = nodeid; | 45 | e->nodeid = nodeid; | 
| 48 | memcpy(e->request, hd, length); | 46 | memcpy(e->request, hd, length); | 
| 49 | 47 | ||
| 48 | /* We need to check dlm_locking_stopped() after taking the mutex to | ||
| 49 | avoid a race where dlm_recoverd enables locking and runs | ||
| 50 | process_requestqueue between our earlier dlm_locking_stopped check | ||
| 51 | and this addition to the requestqueue. */ | ||
| 52 | |||
| 50 | mutex_lock(&ls->ls_requestqueue_mutex); | 53 | mutex_lock(&ls->ls_requestqueue_mutex); | 
| 51 | list_add_tail(&e->list, &ls->ls_requestqueue); | 54 | if (dlm_locking_stopped(ls)) | 
| 55 | list_add_tail(&e->list, &ls->ls_requestqueue); | ||
| 56 | else { | ||
| 57 | log_debug(ls, "dlm_add_requestqueue skip from %d", nodeid); | ||
| 58 | kfree(e); | ||
| 59 | rv = -EAGAIN; | ||
| 60 | } | ||
| 52 | mutex_unlock(&ls->ls_requestqueue_mutex); | 61 | mutex_unlock(&ls->ls_requestqueue_mutex); | 
| 62 | return rv; | ||
| 53 | } | 63 | } | 
| 54 | 64 | ||
| 55 | int dlm_process_requestqueue(struct dlm_ls *ls) | 65 | int dlm_process_requestqueue(struct dlm_ls *ls) | 
| @@ -120,6 +130,10 @@ static int purge_request(struct dlm_ls *ls, struct dlm_message *ms, int nodeid) | |||
| 120 | { | 130 | { | 
| 121 | uint32_t type = ms->m_type; | 131 | uint32_t type = ms->m_type; | 
| 122 | 132 | ||
| 133 | /* the ls is being cleaned up and freed by release_lockspace */ | ||
| 134 | if (!ls->ls_count) | ||
| 135 | return 1; | ||
| 136 | |||
| 123 | if (dlm_is_removed(ls, nodeid)) | 137 | if (dlm_is_removed(ls, nodeid)) | 
| 124 | return 1; | 138 | return 1; | 
| 125 | 139 | ||
