~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/dlm/member.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/dlm/member.c (Version linux-6.12-rc7) and /fs/dlm/member.c (Version linux-5.16.20)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*********************************************      2 /******************************************************************************
  3 **********************************************      3 *******************************************************************************
  4 **                                                  4 **
  5 **  Copyright (C) 2005-2011 Red Hat, Inc.  All      5 **  Copyright (C) 2005-2011 Red Hat, Inc.  All rights reserved.
  6 **                                                  6 **
  7 **                                                  7 **
  8 **********************************************      8 *******************************************************************************
  9 **********************************************      9 ******************************************************************************/
 10                                                    10 
 11 #include "dlm_internal.h"                          11 #include "dlm_internal.h"
 12 #include "lockspace.h"                             12 #include "lockspace.h"
 13 #include "member.h"                                13 #include "member.h"
 14 #include "recoverd.h"                              14 #include "recoverd.h"
 15 #include "recover.h"                               15 #include "recover.h"
 16 #include "rcom.h"                                  16 #include "rcom.h"
 17 #include "config.h"                                17 #include "config.h"
 18 #include "midcomms.h"                              18 #include "midcomms.h"
 19 #include "lowcomms.h"                              19 #include "lowcomms.h"
 20                                                    20 
 21 int dlm_slots_version(const struct dlm_header  !!  21 int dlm_slots_version(struct dlm_header *h)
 22 {                                                  22 {
 23         if ((le32_to_cpu(h->h_version) & 0x000 !!  23         if ((h->h_version & 0x0000FFFF) < DLM_HEADER_SLOTS)
 24                 return 0;                          24                 return 0;
 25         return 1;                                  25         return 1;
 26 }                                                  26 }
 27                                                    27 
 28 void dlm_slot_save(struct dlm_ls *ls, struct d     28 void dlm_slot_save(struct dlm_ls *ls, struct dlm_rcom *rc,
 29                    struct dlm_member *memb)        29                    struct dlm_member *memb)
 30 {                                                  30 {
 31         struct rcom_config *rf = (struct rcom_     31         struct rcom_config *rf = (struct rcom_config *)rc->rc_buf;
 32                                                    32 
 33         if (!dlm_slots_version(&rc->rc_header)     33         if (!dlm_slots_version(&rc->rc_header))
 34                 return;                            34                 return;
 35                                                    35 
 36         memb->slot = le16_to_cpu(rf->rf_our_sl     36         memb->slot = le16_to_cpu(rf->rf_our_slot);
 37         memb->generation = le32_to_cpu(rf->rf_     37         memb->generation = le32_to_cpu(rf->rf_generation);
 38 }                                                  38 }
 39                                                    39 
 40 void dlm_slots_copy_out(struct dlm_ls *ls, str     40 void dlm_slots_copy_out(struct dlm_ls *ls, struct dlm_rcom *rc)
 41 {                                                  41 {
 42         struct dlm_slot *slot;                     42         struct dlm_slot *slot;
 43         struct rcom_slot *ro;                      43         struct rcom_slot *ro;
 44         int i;                                     44         int i;
 45                                                    45 
 46         ro = (struct rcom_slot *)(rc->rc_buf +     46         ro = (struct rcom_slot *)(rc->rc_buf + sizeof(struct rcom_config));
 47                                                    47 
 48         /* ls_slots array is sparse, but not r     48         /* ls_slots array is sparse, but not rcom_slots */
 49                                                    49 
 50         for (i = 0; i < ls->ls_slots_size; i++     50         for (i = 0; i < ls->ls_slots_size; i++) {
 51                 slot = &ls->ls_slots[i];           51                 slot = &ls->ls_slots[i];
 52                 if (!slot->nodeid)                 52                 if (!slot->nodeid)
 53                         continue;                  53                         continue;
 54                 ro->ro_nodeid = cpu_to_le32(sl     54                 ro->ro_nodeid = cpu_to_le32(slot->nodeid);
 55                 ro->ro_slot = cpu_to_le16(slot     55                 ro->ro_slot = cpu_to_le16(slot->slot);
 56                 ro++;                              56                 ro++;
 57         }                                          57         }
 58 }                                                  58 }
 59                                                    59 
 60 #define SLOT_DEBUG_LINE 128                        60 #define SLOT_DEBUG_LINE 128
 61                                                    61 
 62 static void log_slots(struct dlm_ls *ls, uint3     62 static void log_slots(struct dlm_ls *ls, uint32_t gen, int num_slots,
 63                       struct rcom_slot *ro0, s     63                       struct rcom_slot *ro0, struct dlm_slot *array,
 64                       int array_size)              64                       int array_size)
 65 {                                                  65 {
 66         char line[SLOT_DEBUG_LINE];                66         char line[SLOT_DEBUG_LINE];
 67         int len = SLOT_DEBUG_LINE - 1;             67         int len = SLOT_DEBUG_LINE - 1;
 68         int pos = 0;                               68         int pos = 0;
 69         int ret, i;                                69         int ret, i;
 70                                                    70 
 71         memset(line, 0, sizeof(line));             71         memset(line, 0, sizeof(line));
 72                                                    72 
 73         if (array) {                               73         if (array) {
 74                 for (i = 0; i < array_size; i+     74                 for (i = 0; i < array_size; i++) {
 75                         if (!array[i].nodeid)      75                         if (!array[i].nodeid)
 76                                 continue;          76                                 continue;
 77                                                    77 
 78                         ret = snprintf(line +      78                         ret = snprintf(line + pos, len - pos, " %d:%d",
 79                                        array[i     79                                        array[i].slot, array[i].nodeid);
 80                         if (ret >= len - pos)      80                         if (ret >= len - pos)
 81                                 break;             81                                 break;
 82                         pos += ret;                82                         pos += ret;
 83                 }                                  83                 }
 84         } else if (ro0) {                          84         } else if (ro0) {
 85                 for (i = 0; i < num_slots; i++     85                 for (i = 0; i < num_slots; i++) {
 86                         ret = snprintf(line +      86                         ret = snprintf(line + pos, len - pos, " %d:%d",
 87                                        ro0[i].     87                                        ro0[i].ro_slot, ro0[i].ro_nodeid);
 88                         if (ret >= len - pos)      88                         if (ret >= len - pos)
 89                                 break;             89                                 break;
 90                         pos += ret;                90                         pos += ret;
 91                 }                                  91                 }
 92         }                                          92         }
 93                                                    93 
 94         log_rinfo(ls, "generation %u slots %d%     94         log_rinfo(ls, "generation %u slots %d%s", gen, num_slots, line);
 95 }                                                  95 }
 96                                                    96 
 97 int dlm_slots_copy_in(struct dlm_ls *ls)           97 int dlm_slots_copy_in(struct dlm_ls *ls)
 98 {                                                  98 {
 99         struct dlm_member *memb;                   99         struct dlm_member *memb;
100         struct dlm_rcom *rc = ls->ls_recover_b    100         struct dlm_rcom *rc = ls->ls_recover_buf;
101         struct rcom_config *rf = (struct rcom_    101         struct rcom_config *rf = (struct rcom_config *)rc->rc_buf;
102         struct rcom_slot *ro0, *ro;               102         struct rcom_slot *ro0, *ro;
103         int our_nodeid = dlm_our_nodeid();        103         int our_nodeid = dlm_our_nodeid();
104         int i, num_slots;                         104         int i, num_slots;
105         uint32_t gen;                             105         uint32_t gen;
106                                                   106 
107         if (!dlm_slots_version(&rc->rc_header)    107         if (!dlm_slots_version(&rc->rc_header))
108                 return -1;                        108                 return -1;
109                                                   109 
110         gen = le32_to_cpu(rf->rf_generation);     110         gen = le32_to_cpu(rf->rf_generation);
111         if (gen <= ls->ls_generation) {           111         if (gen <= ls->ls_generation) {
112                 log_error(ls, "dlm_slots_copy_    112                 log_error(ls, "dlm_slots_copy_in gen %u old %u",
113                           gen, ls->ls_generati    113                           gen, ls->ls_generation);
114         }                                         114         }
115         ls->ls_generation = gen;                  115         ls->ls_generation = gen;
116                                                   116 
117         num_slots = le16_to_cpu(rf->rf_num_slo    117         num_slots = le16_to_cpu(rf->rf_num_slots);
118         if (!num_slots)                           118         if (!num_slots)
119                 return -1;                        119                 return -1;
120                                                   120 
121         ro0 = (struct rcom_slot *)(rc->rc_buf     121         ro0 = (struct rcom_slot *)(rc->rc_buf + sizeof(struct rcom_config));
122                                                   122 
                                                   >> 123         for (i = 0, ro = ro0; i < num_slots; i++, ro++) {
                                                   >> 124                 ro->ro_nodeid = le32_to_cpu(ro->ro_nodeid);
                                                   >> 125                 ro->ro_slot = le16_to_cpu(ro->ro_slot);
                                                   >> 126         }
                                                   >> 127 
123         log_slots(ls, gen, num_slots, ro0, NUL    128         log_slots(ls, gen, num_slots, ro0, NULL, 0);
124                                                   129 
125         list_for_each_entry(memb, &ls->ls_node    130         list_for_each_entry(memb, &ls->ls_nodes, list) {
126                 for (i = 0, ro = ro0; i < num_    131                 for (i = 0, ro = ro0; i < num_slots; i++, ro++) {
127                         if (le32_to_cpu(ro->ro !! 132                         if (ro->ro_nodeid != memb->nodeid)
128                                 continue;         133                                 continue;
129                         memb->slot = le16_to_c !! 134                         memb->slot = ro->ro_slot;
130                         memb->slot_prev = memb    135                         memb->slot_prev = memb->slot;
131                         break;                    136                         break;
132                 }                                 137                 }
133                                                   138 
134                 if (memb->nodeid == our_nodeid    139                 if (memb->nodeid == our_nodeid) {
135                         if (ls->ls_slot && ls-    140                         if (ls->ls_slot && ls->ls_slot != memb->slot) {
136                                 log_error(ls,     141                                 log_error(ls, "dlm_slots_copy_in our slot "
137                                           "cha    142                                           "changed %d %d", ls->ls_slot,
138                                           memb    143                                           memb->slot);
139                                 return -1;        144                                 return -1;
140                         }                         145                         }
141                                                   146 
142                         if (!ls->ls_slot)         147                         if (!ls->ls_slot)
143                                 ls->ls_slot =     148                                 ls->ls_slot = memb->slot;
144                 }                                 149                 }
145                                                   150 
146                 if (!memb->slot) {                151                 if (!memb->slot) {
147                         log_error(ls, "dlm_slo    152                         log_error(ls, "dlm_slots_copy_in nodeid %d no slot",
148                                    memb->nodei    153                                    memb->nodeid);
149                         return -1;                154                         return -1;
150                 }                                 155                 }
151         }                                         156         }
152                                                   157 
153         return 0;                                 158         return 0;
154 }                                                 159 }
155                                                   160 
156 /* for any nodes that do not support slots, we    161 /* for any nodes that do not support slots, we will not have set memb->slot
157    in wait_status_all(), so memb->slot will re    162    in wait_status_all(), so memb->slot will remain -1, and we will not
158    assign slots or set ls_num_slots here */       163    assign slots or set ls_num_slots here */
159                                                   164 
160 int dlm_slots_assign(struct dlm_ls *ls, int *n    165 int dlm_slots_assign(struct dlm_ls *ls, int *num_slots, int *slots_size,
161                      struct dlm_slot **slots_o    166                      struct dlm_slot **slots_out, uint32_t *gen_out)
162 {                                                 167 {
163         struct dlm_member *memb;                  168         struct dlm_member *memb;
164         struct dlm_slot *array;                   169         struct dlm_slot *array;
165         int our_nodeid = dlm_our_nodeid();        170         int our_nodeid = dlm_our_nodeid();
166         int array_size, max_slots, i;             171         int array_size, max_slots, i;
167         int need = 0;                             172         int need = 0;
168         int max = 0;                              173         int max = 0;
169         int num = 0;                              174         int num = 0;
170         uint32_t gen = 0;                         175         uint32_t gen = 0;
171                                                   176 
172         /* our own memb struct will have slot     177         /* our own memb struct will have slot -1 gen 0 */
173                                                   178 
174         list_for_each_entry(memb, &ls->ls_node    179         list_for_each_entry(memb, &ls->ls_nodes, list) {
175                 if (memb->nodeid == our_nodeid    180                 if (memb->nodeid == our_nodeid) {
176                         memb->slot = ls->ls_sl    181                         memb->slot = ls->ls_slot;
177                         memb->generation = ls-    182                         memb->generation = ls->ls_generation;
178                         break;                    183                         break;
179                 }                                 184                 }
180         }                                         185         }
181                                                   186 
182         list_for_each_entry(memb, &ls->ls_node    187         list_for_each_entry(memb, &ls->ls_nodes, list) {
183                 if (memb->generation > gen)       188                 if (memb->generation > gen)
184                         gen = memb->generation    189                         gen = memb->generation;
185                                                   190 
186                 /* node doesn't support slots     191                 /* node doesn't support slots */
187                                                   192 
188                 if (memb->slot == -1)             193                 if (memb->slot == -1)
189                         return -1;                194                         return -1;
190                                                   195 
191                 /* node needs a slot assigned     196                 /* node needs a slot assigned */
192                                                   197 
193                 if (!memb->slot)                  198                 if (!memb->slot)
194                         need++;                   199                         need++;
195                                                   200 
196                 /* node has a slot assigned */    201                 /* node has a slot assigned */
197                                                   202 
198                 num++;                            203                 num++;
199                                                   204 
200                 if (!max || max < memb->slot)     205                 if (!max || max < memb->slot)
201                         max = memb->slot;         206                         max = memb->slot;
202                                                   207 
203                 /* sanity check, once slot is     208                 /* sanity check, once slot is assigned it shouldn't change */
204                                                   209 
205                 if (memb->slot_prev && memb->s    210                 if (memb->slot_prev && memb->slot && memb->slot_prev != memb->slot) {
206                         log_error(ls, "nodeid     211                         log_error(ls, "nodeid %d slot changed %d %d",
207                                   memb->nodeid    212                                   memb->nodeid, memb->slot_prev, memb->slot);
208                         return -1;                213                         return -1;
209                 }                                 214                 }
210                 memb->slot_prev = memb->slot;     215                 memb->slot_prev = memb->slot;
211         }                                         216         }
212                                                   217 
213         array_size = max + need;                  218         array_size = max + need;
214         array = kcalloc(array_size, sizeof(*ar    219         array = kcalloc(array_size, sizeof(*array), GFP_NOFS);
215         if (!array)                               220         if (!array)
216                 return -ENOMEM;                   221                 return -ENOMEM;
217                                                   222 
218         num = 0;                                  223         num = 0;
219                                                   224 
220         /* fill in slots (offsets) that are us    225         /* fill in slots (offsets) that are used */
221                                                   226 
222         list_for_each_entry(memb, &ls->ls_node    227         list_for_each_entry(memb, &ls->ls_nodes, list) {
223                 if (!memb->slot)                  228                 if (!memb->slot)
224                         continue;                 229                         continue;
225                                                   230 
226                 if (memb->slot > array_size) {    231                 if (memb->slot > array_size) {
227                         log_error(ls, "invalid    232                         log_error(ls, "invalid slot number %d", memb->slot);
228                         kfree(array);             233                         kfree(array);
229                         return -1;                234                         return -1;
230                 }                                 235                 }
231                                                   236 
232                 array[memb->slot - 1].nodeid =    237                 array[memb->slot - 1].nodeid = memb->nodeid;
233                 array[memb->slot - 1].slot = m    238                 array[memb->slot - 1].slot = memb->slot;
234                 num++;                            239                 num++;
235         }                                         240         }
236                                                   241 
237         /* assign new slots from unused offset    242         /* assign new slots from unused offsets */
238                                                   243 
239         list_for_each_entry(memb, &ls->ls_node    244         list_for_each_entry(memb, &ls->ls_nodes, list) {
240                 if (memb->slot)                   245                 if (memb->slot)
241                         continue;                 246                         continue;
242                                                   247 
243                 for (i = 0; i < array_size; i+    248                 for (i = 0; i < array_size; i++) {
244                         if (array[i].nodeid)      249                         if (array[i].nodeid)
245                                 continue;         250                                 continue;
246                                                   251 
247                         memb->slot = i + 1;       252                         memb->slot = i + 1;
248                         memb->slot_prev = memb    253                         memb->slot_prev = memb->slot;
249                         array[i].nodeid = memb    254                         array[i].nodeid = memb->nodeid;
250                         array[i].slot = memb->    255                         array[i].slot = memb->slot;
251                         num++;                    256                         num++;
252                                                   257 
253                         if (!ls->ls_slot && me    258                         if (!ls->ls_slot && memb->nodeid == our_nodeid)
254                                 ls->ls_slot =     259                                 ls->ls_slot = memb->slot;
255                         break;                    260                         break;
256                 }                                 261                 }
257                                                   262 
258                 if (!memb->slot) {                263                 if (!memb->slot) {
259                         log_error(ls, "no free    264                         log_error(ls, "no free slot found");
260                         kfree(array);             265                         kfree(array);
261                         return -1;                266                         return -1;
262                 }                                 267                 }
263         }                                         268         }
264                                                   269 
265         gen++;                                    270         gen++;
266                                                   271 
267         log_slots(ls, gen, num, NULL, array, a    272         log_slots(ls, gen, num, NULL, array, array_size);
268                                                   273 
269         max_slots = (DLM_MAX_APP_BUFSIZE - siz    274         max_slots = (DLM_MAX_APP_BUFSIZE - sizeof(struct dlm_rcom) -
270                      sizeof(struct rcom_config    275                      sizeof(struct rcom_config)) / sizeof(struct rcom_slot);
271                                                   276 
272         if (num > max_slots) {                    277         if (num > max_slots) {
273                 log_error(ls, "num_slots %d ex    278                 log_error(ls, "num_slots %d exceeds max_slots %d",
274                           num, max_slots);        279                           num, max_slots);
275                 kfree(array);                     280                 kfree(array);
276                 return -1;                        281                 return -1;
277         }                                         282         }
278                                                   283 
279         *gen_out = gen;                           284         *gen_out = gen;
280         *slots_out = array;                       285         *slots_out = array;
281         *slots_size = array_size;                 286         *slots_size = array_size;
282         *num_slots = num;                         287         *num_slots = num;
283         return 0;                                 288         return 0;
284 }                                                 289 }
285                                                   290 
286 static void add_ordered_member(struct dlm_ls *    291 static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new)
287 {                                                 292 {
288         struct dlm_member *memb = NULL;           293         struct dlm_member *memb = NULL;
289         struct list_head *tmp;                    294         struct list_head *tmp;
290         struct list_head *newlist = &new->list    295         struct list_head *newlist = &new->list;
291         struct list_head *head = &ls->ls_nodes    296         struct list_head *head = &ls->ls_nodes;
292                                                   297 
293         list_for_each(tmp, head) {                298         list_for_each(tmp, head) {
294                 memb = list_entry(tmp, struct     299                 memb = list_entry(tmp, struct dlm_member, list);
295                 if (new->nodeid < memb->nodeid    300                 if (new->nodeid < memb->nodeid)
296                         break;                    301                         break;
297         }                                         302         }
298                                                   303 
299         if (!memb)                                304         if (!memb)
300                 list_add_tail(newlist, head);     305                 list_add_tail(newlist, head);
301         else {                                    306         else {
302                 /* FIXME: can use list macro h    307                 /* FIXME: can use list macro here */
303                 newlist->prev = tmp->prev;        308                 newlist->prev = tmp->prev;
304                 newlist->next = tmp;              309                 newlist->next = tmp;
305                 tmp->prev->next = newlist;        310                 tmp->prev->next = newlist;
306                 tmp->prev = newlist;              311                 tmp->prev = newlist;
307         }                                         312         }
308 }                                                 313 }
309                                                   314 
310 static int add_remote_member(int nodeid)       << 
311 {                                              << 
312         int error;                             << 
313                                                << 
314         if (nodeid == dlm_our_nodeid())        << 
315                 return 0;                      << 
316                                                << 
317         error = dlm_lowcomms_connect_node(node << 
318         if (error < 0)                         << 
319                 return error;                  << 
320                                                << 
321         dlm_midcomms_add_member(nodeid);       << 
322         return 0;                              << 
323 }                                              << 
324                                                << 
325 static int dlm_add_member(struct dlm_ls *ls, s    315 static int dlm_add_member(struct dlm_ls *ls, struct dlm_config_node *node)
326 {                                                 316 {
327         struct dlm_member *memb;                  317         struct dlm_member *memb;
328         int error;                                318         int error;
329                                                   319 
330         memb = kzalloc(sizeof(*memb), GFP_NOFS    320         memb = kzalloc(sizeof(*memb), GFP_NOFS);
331         if (!memb)                                321         if (!memb)
332                 return -ENOMEM;                   322                 return -ENOMEM;
333                                                   323 
334         memb->nodeid = node->nodeid;           !! 324         error = dlm_lowcomms_connect_node(node->nodeid);
335         memb->weight = node->weight;           << 
336         memb->comm_seq = node->comm_seq;       << 
337                                                << 
338         error = add_remote_member(node->nodeid << 
339         if (error < 0) {                          325         if (error < 0) {
340                 kfree(memb);                      326                 kfree(memb);
341                 return error;                     327                 return error;
342         }                                         328         }
343                                                   329 
                                                   >> 330         memb->nodeid = node->nodeid;
                                                   >> 331         memb->weight = node->weight;
                                                   >> 332         memb->comm_seq = node->comm_seq;
                                                   >> 333         dlm_midcomms_add_member(node->nodeid);
344         add_ordered_member(ls, memb);             334         add_ordered_member(ls, memb);
345         ls->ls_num_nodes++;                       335         ls->ls_num_nodes++;
346         return 0;                                 336         return 0;
347 }                                                 337 }
348                                                   338 
349 static struct dlm_member *find_memb(struct lis    339 static struct dlm_member *find_memb(struct list_head *head, int nodeid)
350 {                                                 340 {
351         struct dlm_member *memb;                  341         struct dlm_member *memb;
352                                                   342 
353         list_for_each_entry(memb, head, list)     343         list_for_each_entry(memb, head, list) {
354                 if (memb->nodeid == nodeid)       344                 if (memb->nodeid == nodeid)
355                         return memb;              345                         return memb;
356         }                                         346         }
357         return NULL;                              347         return NULL;
358 }                                                 348 }
359                                                   349 
360 int dlm_is_member(struct dlm_ls *ls, int nodei    350 int dlm_is_member(struct dlm_ls *ls, int nodeid)
361 {                                                 351 {
362         if (find_memb(&ls->ls_nodes, nodeid))     352         if (find_memb(&ls->ls_nodes, nodeid))
363                 return 1;                         353                 return 1;
364         return 0;                                 354         return 0;
365 }                                                 355 }
366                                                   356 
367 int dlm_is_removed(struct dlm_ls *ls, int node    357 int dlm_is_removed(struct dlm_ls *ls, int nodeid)
368 {                                                 358 {
369         WARN_ON_ONCE(!nodeid || nodeid == -1); << 
370                                                << 
371         if (find_memb(&ls->ls_nodes_gone, node    359         if (find_memb(&ls->ls_nodes_gone, nodeid))
372                 return 1;                         360                 return 1;
373         return 0;                                 361         return 0;
374 }                                                 362 }
375                                                   363 
376 static void clear_memb_list(struct list_head *    364 static void clear_memb_list(struct list_head *head,
377                             void (*after_del)(    365                             void (*after_del)(int nodeid))
378 {                                                 366 {
379         struct dlm_member *memb;                  367         struct dlm_member *memb;
380                                                   368 
381         while (!list_empty(head)) {               369         while (!list_empty(head)) {
382                 memb = list_entry(head->next,     370                 memb = list_entry(head->next, struct dlm_member, list);
383                 list_del(&memb->list);            371                 list_del(&memb->list);
384                 if (after_del)                    372                 if (after_del)
385                         after_del(memb->nodeid    373                         after_del(memb->nodeid);
386                 kfree(memb);                      374                 kfree(memb);
387         }                                         375         }
388 }                                                 376 }
389                                                   377 
390 static void remove_remote_member(int nodeid)   !! 378 static void clear_members_cb(int nodeid)
391 {                                                 379 {
392         if (nodeid == dlm_our_nodeid())        << 
393                 return;                        << 
394                                                << 
395         dlm_midcomms_remove_member(nodeid);       380         dlm_midcomms_remove_member(nodeid);
396 }                                                 381 }
397                                                   382 
398 void dlm_clear_members(struct dlm_ls *ls)         383 void dlm_clear_members(struct dlm_ls *ls)
399 {                                                 384 {
400         clear_memb_list(&ls->ls_nodes, remove_ !! 385         clear_memb_list(&ls->ls_nodes, clear_members_cb);
401         ls->ls_num_nodes = 0;                     386         ls->ls_num_nodes = 0;
402 }                                                 387 }
403                                                   388 
404 void dlm_clear_members_gone(struct dlm_ls *ls)    389 void dlm_clear_members_gone(struct dlm_ls *ls)
405 {                                                 390 {
406         clear_memb_list(&ls->ls_nodes_gone, NU    391         clear_memb_list(&ls->ls_nodes_gone, NULL);
407 }                                                 392 }
408                                                   393 
409 static void make_member_array(struct dlm_ls *l    394 static void make_member_array(struct dlm_ls *ls)
410 {                                                 395 {
411         struct dlm_member *memb;                  396         struct dlm_member *memb;
412         int i, w, x = 0, total = 0, all_zero =    397         int i, w, x = 0, total = 0, all_zero = 0, *array;
413                                                   398 
414         kfree(ls->ls_node_array);                 399         kfree(ls->ls_node_array);
415         ls->ls_node_array = NULL;                 400         ls->ls_node_array = NULL;
416                                                   401 
417         list_for_each_entry(memb, &ls->ls_node    402         list_for_each_entry(memb, &ls->ls_nodes, list) {
418                 if (memb->weight)                 403                 if (memb->weight)
419                         total += memb->weight;    404                         total += memb->weight;
420         }                                         405         }
421                                                   406 
422         /* all nodes revert to weight of 1 if     407         /* all nodes revert to weight of 1 if all have weight 0 */
423                                                   408 
424         if (!total) {                             409         if (!total) {
425                 total = ls->ls_num_nodes;         410                 total = ls->ls_num_nodes;
426                 all_zero = 1;                     411                 all_zero = 1;
427         }                                         412         }
428                                                   413 
429         ls->ls_total_weight = total;              414         ls->ls_total_weight = total;
430         array = kmalloc_array(total, sizeof(*a    415         array = kmalloc_array(total, sizeof(*array), GFP_NOFS);
431         if (!array)                               416         if (!array)
432                 return;                           417                 return;
433                                                   418 
434         list_for_each_entry(memb, &ls->ls_node    419         list_for_each_entry(memb, &ls->ls_nodes, list) {
435                 if (!all_zero && !memb->weight    420                 if (!all_zero && !memb->weight)
436                         continue;                 421                         continue;
437                                                   422 
438                 if (all_zero)                     423                 if (all_zero)
439                         w = 1;                    424                         w = 1;
440                 else                              425                 else
441                         w = memb->weight;         426                         w = memb->weight;
442                                                   427 
443                 DLM_ASSERT(x < total, printk("    428                 DLM_ASSERT(x < total, printk("total %d x %d\n", total, x););
444                                                   429 
445                 for (i = 0; i < w; i++)           430                 for (i = 0; i < w; i++)
446                         array[x++] = memb->nod    431                         array[x++] = memb->nodeid;
447         }                                         432         }
448                                                   433 
449         ls->ls_node_array = array;                434         ls->ls_node_array = array;
450 }                                                 435 }
451                                                   436 
452 /* send a status request to all members just t    437 /* send a status request to all members just to establish comms connections */
453                                                   438 
454 static int ping_members(struct dlm_ls *ls, uin !! 439 static int ping_members(struct dlm_ls *ls)
455 {                                                 440 {
456         struct dlm_member *memb;                  441         struct dlm_member *memb;
457         int error = 0;                            442         int error = 0;
458                                                   443 
459         list_for_each_entry(memb, &ls->ls_node    444         list_for_each_entry(memb, &ls->ls_nodes, list) {
460                 if (dlm_recovery_stopped(ls))  !! 445                 error = dlm_recovery_stopped(ls);
                                                   >> 446                 if (error) {
461                         error = -EINTR;           447                         error = -EINTR;
462                         break;                    448                         break;
463                 }                                 449                 }
464                 error = dlm_rcom_status(ls, me !! 450                 error = dlm_rcom_status(ls, memb->nodeid, 0);
465                 if (error)                        451                 if (error)
466                         break;                    452                         break;
467         }                                         453         }
468         if (error)                                454         if (error)
469                 log_rinfo(ls, "ping_members ab    455                 log_rinfo(ls, "ping_members aborted %d last nodeid %d",
470                           error, ls->ls_recove    456                           error, ls->ls_recover_nodeid);
471         return error;                             457         return error;
472 }                                                 458 }
473                                                   459 
474 static void dlm_lsop_recover_prep(struct dlm_l    460 static void dlm_lsop_recover_prep(struct dlm_ls *ls)
475 {                                                 461 {
476         if (!ls->ls_ops || !ls->ls_ops->recove    462         if (!ls->ls_ops || !ls->ls_ops->recover_prep)
477                 return;                           463                 return;
478         ls->ls_ops->recover_prep(ls->ls_ops_ar    464         ls->ls_ops->recover_prep(ls->ls_ops_arg);
479 }                                                 465 }
480                                                   466 
481 static void dlm_lsop_recover_slot(struct dlm_l    467 static void dlm_lsop_recover_slot(struct dlm_ls *ls, struct dlm_member *memb)
482 {                                                 468 {
483         struct dlm_slot slot;                     469         struct dlm_slot slot;
484         uint32_t seq;                             470         uint32_t seq;
485         int error;                                471         int error;
486                                                   472 
487         if (!ls->ls_ops || !ls->ls_ops->recove    473         if (!ls->ls_ops || !ls->ls_ops->recover_slot)
488                 return;                           474                 return;
489                                                   475 
490         /* if there is no comms connection wit    476         /* if there is no comms connection with this node
491            or the present comms connection is     477            or the present comms connection is newer
492            than the one when this member was a    478            than the one when this member was added, then
493            we consider the node to have failed    479            we consider the node to have failed (versus
494            being removed due to dlm_release_lo    480            being removed due to dlm_release_lockspace) */
495                                                   481 
496         error = dlm_comm_seq(memb->nodeid, &se    482         error = dlm_comm_seq(memb->nodeid, &seq);
497                                                   483 
498         if (!error && seq == memb->comm_seq)      484         if (!error && seq == memb->comm_seq)
499                 return;                           485                 return;
500                                                   486 
501         slot.nodeid = memb->nodeid;               487         slot.nodeid = memb->nodeid;
502         slot.slot = memb->slot;                   488         slot.slot = memb->slot;
503                                                   489 
504         ls->ls_ops->recover_slot(ls->ls_ops_ar    490         ls->ls_ops->recover_slot(ls->ls_ops_arg, &slot);
505 }                                                 491 }
506                                                   492 
507 void dlm_lsop_recover_done(struct dlm_ls *ls)     493 void dlm_lsop_recover_done(struct dlm_ls *ls)
508 {                                                 494 {
509         struct dlm_member *memb;                  495         struct dlm_member *memb;
510         struct dlm_slot *slots;                   496         struct dlm_slot *slots;
511         int i, num;                               497         int i, num;
512                                                   498 
513         if (!ls->ls_ops || !ls->ls_ops->recove    499         if (!ls->ls_ops || !ls->ls_ops->recover_done)
514                 return;                           500                 return;
515                                                   501 
516         num = ls->ls_num_nodes;                   502         num = ls->ls_num_nodes;
517         slots = kcalloc(num, sizeof(*slots), G    503         slots = kcalloc(num, sizeof(*slots), GFP_KERNEL);
518         if (!slots)                               504         if (!slots)
519                 return;                           505                 return;
520                                                   506 
521         i = 0;                                    507         i = 0;
522         list_for_each_entry(memb, &ls->ls_node    508         list_for_each_entry(memb, &ls->ls_nodes, list) {
523                 if (i == num) {                   509                 if (i == num) {
524                         log_error(ls, "dlm_lso    510                         log_error(ls, "dlm_lsop_recover_done bad num %d", num);
525                         goto out;                 511                         goto out;
526                 }                                 512                 }
527                 slots[i].nodeid = memb->nodeid    513                 slots[i].nodeid = memb->nodeid;
528                 slots[i].slot = memb->slot;       514                 slots[i].slot = memb->slot;
529                 i++;                              515                 i++;
530         }                                         516         }
531                                                   517 
532         ls->ls_ops->recover_done(ls->ls_ops_ar    518         ls->ls_ops->recover_done(ls->ls_ops_arg, slots, num,
533                                  ls->ls_slot,     519                                  ls->ls_slot, ls->ls_generation);
534  out:                                             520  out:
535         kfree(slots);                             521         kfree(slots);
536 }                                                 522 }
537                                                   523 
538 static struct dlm_config_node *find_config_nod    524 static struct dlm_config_node *find_config_node(struct dlm_recover *rv,
539                                                   525                                                 int nodeid)
540 {                                                 526 {
541         int i;                                    527         int i;
542                                                   528 
543         for (i = 0; i < rv->nodes_count; i++)     529         for (i = 0; i < rv->nodes_count; i++) {
544                 if (rv->nodes[i].nodeid == nod    530                 if (rv->nodes[i].nodeid == nodeid)
545                         return &rv->nodes[i];     531                         return &rv->nodes[i];
546         }                                         532         }
547         return NULL;                              533         return NULL;
548 }                                                 534 }
549                                                   535 
550 int dlm_recover_members(struct dlm_ls *ls, str    536 int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
551 {                                                 537 {
552         struct dlm_member *memb, *safe;           538         struct dlm_member *memb, *safe;
553         struct dlm_config_node *node;             539         struct dlm_config_node *node;
554         int i, error, neg = 0, low = -1;          540         int i, error, neg = 0, low = -1;
555                                                   541 
556         /* previously removed members that we'    542         /* previously removed members that we've not finished removing need to
557          * count as a negative change so the " !! 543            count as a negative change so the "neg" recovery steps will happen */
558          *                                     << 
559          * This functionality must report all  << 
560          * midcomms layer and must never retur << 
561          */                                    << 
562                                                   544 
563         list_for_each_entry(memb, &ls->ls_node    545         list_for_each_entry(memb, &ls->ls_nodes_gone, list) {
564                 log_rinfo(ls, "prev removed me    546                 log_rinfo(ls, "prev removed member %d", memb->nodeid);
565                 neg++;                            547                 neg++;
566         }                                         548         }
567                                                   549 
568         /* move departed members from ls_nodes    550         /* move departed members from ls_nodes to ls_nodes_gone */
569                                                   551 
570         list_for_each_entry_safe(memb, safe, &    552         list_for_each_entry_safe(memb, safe, &ls->ls_nodes, list) {
571                 node = find_config_node(rv, me    553                 node = find_config_node(rv, memb->nodeid);
572                 if (node && !node->new)           554                 if (node && !node->new)
573                         continue;                 555                         continue;
574                                                   556 
575                 if (!node) {                      557                 if (!node) {
576                         log_rinfo(ls, "remove     558                         log_rinfo(ls, "remove member %d", memb->nodeid);
577                 } else {                          559                 } else {
578                         /* removed and re-adde    560                         /* removed and re-added */
579                         log_rinfo(ls, "remove     561                         log_rinfo(ls, "remove member %d comm_seq %u %u",
580                                   memb->nodeid    562                                   memb->nodeid, memb->comm_seq, node->comm_seq);
581                 }                                 563                 }
582                                                   564 
583                 neg++;                            565                 neg++;
584                 list_move(&memb->list, &ls->ls    566                 list_move(&memb->list, &ls->ls_nodes_gone);
585                 remove_remote_member(memb->nod !! 567                 dlm_midcomms_remove_member(memb->nodeid);
586                 ls->ls_num_nodes--;               568                 ls->ls_num_nodes--;
587                 dlm_lsop_recover_slot(ls, memb    569                 dlm_lsop_recover_slot(ls, memb);
588         }                                         570         }
589                                                   571 
590         /* add new members to ls_nodes */         572         /* add new members to ls_nodes */
591                                                   573 
592         for (i = 0; i < rv->nodes_count; i++)     574         for (i = 0; i < rv->nodes_count; i++) {
593                 node = &rv->nodes[i];             575                 node = &rv->nodes[i];
594                 if (dlm_is_member(ls, node->no    576                 if (dlm_is_member(ls, node->nodeid))
595                         continue;                 577                         continue;
596                 error = dlm_add_member(ls, nod !! 578                 dlm_add_member(ls, node);
597                 if (error)                     << 
598                         return error;          << 
599                                                << 
600                 log_rinfo(ls, "add member %d",    579                 log_rinfo(ls, "add member %d", node->nodeid);
601         }                                         580         }
602                                                   581 
603         list_for_each_entry(memb, &ls->ls_node    582         list_for_each_entry(memb, &ls->ls_nodes, list) {
604                 if (low == -1 || memb->nodeid     583                 if (low == -1 || memb->nodeid < low)
605                         low = memb->nodeid;       584                         low = memb->nodeid;
606         }                                         585         }
607         ls->ls_low_nodeid = low;                  586         ls->ls_low_nodeid = low;
608                                                   587 
609         make_member_array(ls);                    588         make_member_array(ls);
610         *neg_out = neg;                           589         *neg_out = neg;
611                                                   590 
612         error = ping_members(ls, rv->seq);     !! 591         error = ping_members(ls);
                                                   >> 592         /* error -EINTR means that a new recovery action is triggered.
                                                   >> 593          * We ignore this recovery action and let run the new one which might
                                                   >> 594          * have new member configuration.
                                                   >> 595          */
                                                   >> 596         if (error == -EINTR)
                                                   >> 597                 error = 0;
                                                   >> 598 
                                                   >> 599         /* new_lockspace() may be waiting to know if the config
                                                   >> 600          * is good or bad
                                                   >> 601          */
                                                   >> 602         ls->ls_members_result = error;
                                                   >> 603         complete(&ls->ls_members_done);
                                                   >> 604 
613         log_rinfo(ls, "dlm_recover_members %d     605         log_rinfo(ls, "dlm_recover_members %d nodes", ls->ls_num_nodes);
614         return error;                             606         return error;
615 }                                                 607 }
616                                                   608 
617 /* Userspace guarantees that dlm_ls_stop() has    609 /* Userspace guarantees that dlm_ls_stop() has completed on all nodes before
618    dlm_ls_start() is called on any of them to     610    dlm_ls_start() is called on any of them to start the new recovery. */
619                                                   611 
620 int dlm_ls_stop(struct dlm_ls *ls)                612 int dlm_ls_stop(struct dlm_ls *ls)
621 {                                                 613 {
622         int new;                                  614         int new;
623                                                   615 
624         /*                                        616         /*
625          * Prevent dlm_recv from being in the     617          * Prevent dlm_recv from being in the middle of something when we do
626          * the stop.  This includes ensuring d    618          * the stop.  This includes ensuring dlm_recv isn't processing a
627          * recovery message (rcom), while dlm_    619          * recovery message (rcom), while dlm_recoverd is aborting and
628          * resetting things from an in-progres    620          * resetting things from an in-progress recovery.  i.e. we want
629          * dlm_recoverd to abort its recovery     621          * dlm_recoverd to abort its recovery without worrying about dlm_recv
630          * processing an rcom at the same time    622          * processing an rcom at the same time.  Stopping dlm_recv also makes
631          * it easy for dlm_receive_message() t    623          * it easy for dlm_receive_message() to check locking stopped and add a
632          * message to the requestqueue without    624          * message to the requestqueue without races.
633          */                                       625          */
634                                                   626 
635         write_lock_bh(&ls->ls_recv_active);    !! 627         down_write(&ls->ls_recv_active);
636                                                   628 
637         /*                                        629         /*
638          * Abort any recovery that's in progre    630          * Abort any recovery that's in progress (see RECOVER_STOP,
639          * dlm_recovery_stopped()) and tell an    631          * dlm_recovery_stopped()) and tell any other threads running in the
640          * dlm to quit any processing (see RUN    632          * dlm to quit any processing (see RUNNING, dlm_locking_stopped()).
641          */                                       633          */
642                                                   634 
643         spin_lock_bh(&ls->ls_recover_lock);    !! 635         spin_lock(&ls->ls_recover_lock);
644         set_bit(LSFL_RECOVER_STOP, &ls->ls_fla    636         set_bit(LSFL_RECOVER_STOP, &ls->ls_flags);
645         new = test_and_clear_bit(LSFL_RUNNING,    637         new = test_and_clear_bit(LSFL_RUNNING, &ls->ls_flags);
646         if (new)                               << 
647                 timer_delete_sync(&ls->ls_scan << 
648         ls->ls_recover_seq++;                     638         ls->ls_recover_seq++;
649                                                !! 639         spin_unlock(&ls->ls_recover_lock);
650         /* activate requestqueue and stop proc << 
651         write_lock_bh(&ls->ls_requestqueue_loc << 
652         set_bit(LSFL_RECV_MSG_BLOCKED, &ls->ls << 
653         write_unlock_bh(&ls->ls_requestqueue_l << 
654         spin_unlock_bh(&ls->ls_recover_lock);  << 
655                                                   640 
656         /*                                        641         /*
657          * Let dlm_recv run again, now any nor    642          * Let dlm_recv run again, now any normal messages will be saved on the
658          * requestqueue for later.                643          * requestqueue for later.
659          */                                       644          */
660                                                   645 
661         write_unlock_bh(&ls->ls_recv_active);  !! 646         up_write(&ls->ls_recv_active);
662                                                   647 
663         /*                                        648         /*
664          * This in_recovery lock does two thin    649          * This in_recovery lock does two things:
665          * 1) Keeps this function from returni    650          * 1) Keeps this function from returning until all threads are out
666          *    of locking routines and locking     651          *    of locking routines and locking is truly stopped.
667          * 2) Keeps any new requests from bein    652          * 2) Keeps any new requests from being processed until it's unlocked
668          *    when recovery is complete.          653          *    when recovery is complete.
669          */                                       654          */
670                                                   655 
671         if (new) {                                656         if (new) {
672                 set_bit(LSFL_RECOVER_DOWN, &ls    657                 set_bit(LSFL_RECOVER_DOWN, &ls->ls_flags);
673                 wake_up_process(ls->ls_recover    658                 wake_up_process(ls->ls_recoverd_task);
674                 wait_event(ls->ls_recover_lock    659                 wait_event(ls->ls_recover_lock_wait,
675                            test_bit(LSFL_RECOV    660                            test_bit(LSFL_RECOVER_LOCK, &ls->ls_flags));
676         }                                         661         }
677                                                   662 
678         /*                                        663         /*
679          * The recoverd suspend/resume makes s    664          * The recoverd suspend/resume makes sure that dlm_recoverd (if
680          * running) has noticed RECOVER_STOP a    665          * running) has noticed RECOVER_STOP above and quit processing the
681          * previous recovery.                     666          * previous recovery.
682          */                                       667          */
683                                                   668 
684         dlm_recoverd_suspend(ls);                 669         dlm_recoverd_suspend(ls);
685                                                   670 
686         spin_lock_bh(&ls->ls_recover_lock);    !! 671         spin_lock(&ls->ls_recover_lock);
687         kfree(ls->ls_slots);                      672         kfree(ls->ls_slots);
688         ls->ls_slots = NULL;                      673         ls->ls_slots = NULL;
689         ls->ls_num_slots = 0;                     674         ls->ls_num_slots = 0;
690         ls->ls_slots_size = 0;                    675         ls->ls_slots_size = 0;
691         ls->ls_recover_status = 0;                676         ls->ls_recover_status = 0;
692         spin_unlock_bh(&ls->ls_recover_lock);  !! 677         spin_unlock(&ls->ls_recover_lock);
693                                                   678 
694         dlm_recoverd_resume(ls);                  679         dlm_recoverd_resume(ls);
695                                                   680 
696         if (!ls->ls_recover_begin)                681         if (!ls->ls_recover_begin)
697                 ls->ls_recover_begin = jiffies    682                 ls->ls_recover_begin = jiffies;
698                                                   683 
699         /* call recover_prep ops only once and !! 684         dlm_lsop_recover_prep(ls);
700          * for each possible dlm_ls_stop() whe << 
701          * stopped.                            << 
702          *                                     << 
703          * If we successful was able to clear  << 
704          * it was set we know it is the first  << 
705          */                                    << 
706         if (new)                               << 
707                 dlm_lsop_recover_prep(ls);     << 
708                                                << 
709         return 0;                                 685         return 0;
710 }                                                 686 }
711                                                   687 
712 int dlm_ls_start(struct dlm_ls *ls)               688 int dlm_ls_start(struct dlm_ls *ls)
713 {                                                 689 {
714         struct dlm_recover *rv, *rv_old;          690         struct dlm_recover *rv, *rv_old;
715         struct dlm_config_node *nodes = NULL;     691         struct dlm_config_node *nodes = NULL;
716         int error, count;                         692         int error, count;
717                                                   693 
718         rv = kzalloc(sizeof(*rv), GFP_NOFS);      694         rv = kzalloc(sizeof(*rv), GFP_NOFS);
719         if (!rv)                                  695         if (!rv)
720                 return -ENOMEM;                   696                 return -ENOMEM;
721                                                   697 
722         error = dlm_config_nodes(ls->ls_name,     698         error = dlm_config_nodes(ls->ls_name, &nodes, &count);
723         if (error < 0)                            699         if (error < 0)
724                 goto fail_rv;                     700                 goto fail_rv;
725                                                   701 
726         spin_lock_bh(&ls->ls_recover_lock);    !! 702         spin_lock(&ls->ls_recover_lock);
727                                                   703 
728         /* the lockspace needs to be stopped b    704         /* the lockspace needs to be stopped before it can be started */
729                                                   705 
730         if (!dlm_locking_stopped(ls)) {           706         if (!dlm_locking_stopped(ls)) {
731                 spin_unlock_bh(&ls->ls_recover !! 707                 spin_unlock(&ls->ls_recover_lock);
732                 log_error(ls, "start ignored:     708                 log_error(ls, "start ignored: lockspace running");
733                 error = -EINVAL;                  709                 error = -EINVAL;
734                 goto fail;                        710                 goto fail;
735         }                                         711         }
736                                                   712 
737         rv->nodes = nodes;                        713         rv->nodes = nodes;
738         rv->nodes_count = count;                  714         rv->nodes_count = count;
739         rv->seq = ++ls->ls_recover_seq;           715         rv->seq = ++ls->ls_recover_seq;
740         rv_old = ls->ls_recover_args;             716         rv_old = ls->ls_recover_args;
741         ls->ls_recover_args = rv;                 717         ls->ls_recover_args = rv;
742         spin_unlock_bh(&ls->ls_recover_lock);  !! 718         spin_unlock(&ls->ls_recover_lock);
743                                                   719 
744         if (rv_old) {                             720         if (rv_old) {
745                 log_error(ls, "unused recovery    721                 log_error(ls, "unused recovery %llx %d",
746                           (unsigned long long)    722                           (unsigned long long)rv_old->seq, rv_old->nodes_count);
747                 kfree(rv_old->nodes);             723                 kfree(rv_old->nodes);
748                 kfree(rv_old);                    724                 kfree(rv_old);
749         }                                         725         }
750                                                   726 
751         set_bit(LSFL_RECOVER_WORK, &ls->ls_fla    727         set_bit(LSFL_RECOVER_WORK, &ls->ls_flags);
752         wake_up_process(ls->ls_recoverd_task);    728         wake_up_process(ls->ls_recoverd_task);
753         return 0;                                 729         return 0;
754                                                   730 
755  fail:                                            731  fail:
756         kfree(nodes);                             732         kfree(nodes);
757  fail_rv:                                         733  fail_rv:
758         kfree(rv);                                734         kfree(rv);
759         return error;                             735         return error;
760 }                                                 736 }
761                                                   737 
762                                                   738 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php