xref: /openbmc/linux/fs/ocfs2/localalloc.c (revision 87c2ce3b)
1 /* -*- mode: c; c-basic-offset: 8; -*-
2  * vim: noexpandtab sw=8 ts=8 sts=0:
3  *
4  * localalloc.c
5  *
6  * Node local data allocation
7  *
8  * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public
21  * License along with this program; if not, write to the
22  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23  * Boston, MA 021110-1307, USA.
24  */
25 
26 #include <linux/fs.h>
27 #include <linux/types.h>
28 #include <linux/slab.h>
29 #include <linux/highmem.h>
30 #include <linux/bitops.h>
31 
32 #define MLOG_MASK_PREFIX ML_DISK_ALLOC
33 #include <cluster/masklog.h>
34 
35 #include "ocfs2.h"
36 
37 #include "alloc.h"
38 #include "dlmglue.h"
39 #include "inode.h"
40 #include "journal.h"
41 #include "localalloc.h"
42 #include "suballoc.h"
43 #include "super.h"
44 #include "sysfile.h"
45 
46 #include "buffer_head_io.h"
47 
48 #define OCFS2_LOCAL_ALLOC(dinode)	(&((dinode)->id2.i_lab))
49 
50 static inline int ocfs2_local_alloc_window_bits(struct ocfs2_super *osb);
51 
52 static u32 ocfs2_local_alloc_count_bits(struct ocfs2_dinode *alloc);
53 
54 static int ocfs2_local_alloc_find_clear_bits(struct ocfs2_super *osb,
55 					     struct ocfs2_dinode *alloc,
56 					     u32 numbits);
57 
58 static void ocfs2_clear_local_alloc(struct ocfs2_dinode *alloc);
59 
60 static int ocfs2_sync_local_to_main(struct ocfs2_super *osb,
61 				    struct ocfs2_journal_handle *handle,
62 				    struct ocfs2_dinode *alloc,
63 				    struct inode *main_bm_inode,
64 				    struct buffer_head *main_bm_bh);
65 
66 static int ocfs2_local_alloc_reserve_for_window(struct ocfs2_super *osb,
67 						struct ocfs2_journal_handle *handle,
68 						struct ocfs2_alloc_context **ac,
69 						struct inode **bitmap_inode,
70 						struct buffer_head **bitmap_bh);
71 
72 static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb,
73 					struct ocfs2_journal_handle *handle,
74 					struct ocfs2_alloc_context *ac);
75 
76 static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb,
77 					  struct inode *local_alloc_inode);
78 
79 /*
80  * Determine how large our local alloc window should be, in bits.
81  *
82  * These values (and the behavior in ocfs2_alloc_should_use_local) have
83  * been chosen so that most allocations, including new block groups go
84  * through local alloc.
85  */
86 static inline int ocfs2_local_alloc_window_bits(struct ocfs2_super *osb)
87 {
88 	BUG_ON(osb->s_clustersize_bits < 12);
89 
90 	return 2048 >> (osb->s_clustersize_bits - 12);
91 }
92 
93 /*
94  * Tell us whether a given allocation should use the local alloc
95  * file. Otherwise, it has to go to the main bitmap.
96  */
97 int ocfs2_alloc_should_use_local(struct ocfs2_super *osb, u64 bits)
98 {
99 	int la_bits = ocfs2_local_alloc_window_bits(osb);
100 
101 	if (osb->local_alloc_state != OCFS2_LA_ENABLED)
102 		return 0;
103 
104 	/* la_bits should be at least twice the size (in clusters) of
105 	 * a new block group. We want to be sure block group
106 	 * allocations go through the local alloc, so allow an
107 	 * allocation to take up to half the bitmap. */
108 	if (bits > (la_bits / 2))
109 		return 0;
110 
111 	return 1;
112 }
113 
114 int ocfs2_load_local_alloc(struct ocfs2_super *osb)
115 {
116 	int status = 0;
117 	struct ocfs2_dinode *alloc = NULL;
118 	struct buffer_head *alloc_bh = NULL;
119 	u32 num_used;
120 	struct inode *inode = NULL;
121 	struct ocfs2_local_alloc *la;
122 
123 	mlog_entry_void();
124 
125 	/* read the alloc off disk */
126 	inode = ocfs2_get_system_file_inode(osb, LOCAL_ALLOC_SYSTEM_INODE,
127 					    osb->slot_num);
128 	if (!inode) {
129 		status = -EINVAL;
130 		mlog_errno(status);
131 		goto bail;
132 	}
133 
134 	status = ocfs2_read_block(osb, OCFS2_I(inode)->ip_blkno,
135 				  &alloc_bh, 0, inode);
136 	if (status < 0) {
137 		mlog_errno(status);
138 		goto bail;
139 	}
140 
141 	alloc = (struct ocfs2_dinode *) alloc_bh->b_data;
142 	la = OCFS2_LOCAL_ALLOC(alloc);
143 
144 	if (!(le32_to_cpu(alloc->i_flags) &
145 	    (OCFS2_LOCAL_ALLOC_FL|OCFS2_BITMAP_FL))) {
146 		mlog(ML_ERROR, "Invalid local alloc inode, %"MLFu64"\n",
147 		     OCFS2_I(inode)->ip_blkno);
148 		status = -EINVAL;
149 		goto bail;
150 	}
151 
152 	if ((la->la_size == 0) ||
153 	    (le16_to_cpu(la->la_size) > ocfs2_local_alloc_size(inode->i_sb))) {
154 		mlog(ML_ERROR, "Local alloc size is invalid (la_size = %u)\n",
155 		     le16_to_cpu(la->la_size));
156 		status = -EINVAL;
157 		goto bail;
158 	}
159 
160 	/* do a little verification. */
161 	num_used = ocfs2_local_alloc_count_bits(alloc);
162 
163 	/* hopefully the local alloc has always been recovered before
164 	 * we load it. */
165 	if (num_used
166 	    || alloc->id1.bitmap1.i_used
167 	    || alloc->id1.bitmap1.i_total
168 	    || la->la_bm_off)
169 		mlog(ML_ERROR, "Local alloc hasn't been recovered!\n"
170 		     "found = %u, set = %u, taken = %u, off = %u\n",
171 		     num_used, le32_to_cpu(alloc->id1.bitmap1.i_used),
172 		     le32_to_cpu(alloc->id1.bitmap1.i_total),
173 		     OCFS2_LOCAL_ALLOC(alloc)->la_bm_off);
174 
175 	osb->local_alloc_bh = alloc_bh;
176 	osb->local_alloc_state = OCFS2_LA_ENABLED;
177 
178 bail:
179 	if (status < 0)
180 		if (alloc_bh)
181 			brelse(alloc_bh);
182 	if (inode)
183 		iput(inode);
184 
185 	mlog_exit(status);
186 	return status;
187 }
188 
189 /*
190  * return any unused bits to the bitmap and write out a clean
191  * local_alloc.
192  *
193  * local_alloc_bh is optional. If not passed, we will simply use the
194  * one off osb. If you do pass it however, be warned that it *will* be
195  * returned brelse'd and NULL'd out.*/
196 void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb)
197 {
198 	int status;
199 	struct ocfs2_journal_handle *handle = NULL;
200 	struct inode *local_alloc_inode = NULL;
201 	struct buffer_head *bh = NULL;
202 	struct buffer_head *main_bm_bh = NULL;
203 	struct inode *main_bm_inode = NULL;
204 	struct ocfs2_dinode *alloc_copy = NULL;
205 	struct ocfs2_dinode *alloc = NULL;
206 
207 	mlog_entry_void();
208 
209 	if (osb->local_alloc_state == OCFS2_LA_UNUSED)
210 		goto bail;
211 
212 	local_alloc_inode =
213 		ocfs2_get_system_file_inode(osb,
214 					    LOCAL_ALLOC_SYSTEM_INODE,
215 					    osb->slot_num);
216 	if (!local_alloc_inode) {
217 		status = -ENOENT;
218 		mlog_errno(status);
219 		goto bail;
220 	}
221 
222 	osb->local_alloc_state = OCFS2_LA_DISABLED;
223 
224 	handle = ocfs2_alloc_handle(osb);
225 	if (!handle) {
226 		status = -ENOMEM;
227 		mlog_errno(status);
228 		goto bail;
229 	}
230 
231 	main_bm_inode = ocfs2_get_system_file_inode(osb,
232 						    GLOBAL_BITMAP_SYSTEM_INODE,
233 						    OCFS2_INVALID_SLOT);
234 	if (!main_bm_inode) {
235 		status = -EINVAL;
236 		mlog_errno(status);
237 		goto bail;
238 	}
239 
240 	ocfs2_handle_add_inode(handle, main_bm_inode);
241 	status = ocfs2_meta_lock(main_bm_inode, handle, &main_bm_bh, 1);
242 	if (status < 0) {
243 		mlog_errno(status);
244 		goto bail;
245 	}
246 
247 	/* WINDOW_MOVE_CREDITS is a bit heavy... */
248 	handle = ocfs2_start_trans(osb, handle, OCFS2_WINDOW_MOVE_CREDITS);
249 	if (IS_ERR(handle)) {
250 		mlog_errno(PTR_ERR(handle));
251 		handle = NULL;
252 		goto bail;
253 	}
254 
255 	bh = osb->local_alloc_bh;
256 	alloc = (struct ocfs2_dinode *) bh->b_data;
257 
258 	alloc_copy = kmalloc(bh->b_size, GFP_KERNEL);
259 	if (!alloc_copy) {
260 		status = -ENOMEM;
261 		goto bail;
262 	}
263 	memcpy(alloc_copy, alloc, bh->b_size);
264 
265 	status = ocfs2_journal_access(handle, local_alloc_inode, bh,
266 				      OCFS2_JOURNAL_ACCESS_WRITE);
267 	if (status < 0) {
268 		mlog_errno(status);
269 		goto bail;
270 	}
271 
272 	ocfs2_clear_local_alloc(alloc);
273 
274 	status = ocfs2_journal_dirty(handle, bh);
275 	if (status < 0) {
276 		mlog_errno(status);
277 		goto bail;
278 	}
279 
280 	brelse(bh);
281 	osb->local_alloc_bh = NULL;
282 	osb->local_alloc_state = OCFS2_LA_UNUSED;
283 
284 	status = ocfs2_sync_local_to_main(osb, handle, alloc_copy,
285 					  main_bm_inode, main_bm_bh);
286 	if (status < 0)
287 		mlog_errno(status);
288 
289 bail:
290 	if (handle)
291 		ocfs2_commit_trans(handle);
292 
293 	if (main_bm_bh)
294 		brelse(main_bm_bh);
295 
296 	if (main_bm_inode)
297 		iput(main_bm_inode);
298 
299 	if (local_alloc_inode)
300 		iput(local_alloc_inode);
301 
302 	if (alloc_copy)
303 		kfree(alloc_copy);
304 
305 	mlog_exit_void();
306 }
307 
308 /*
309  * We want to free the bitmap bits outside of any recovery context as
310  * we'll need a cluster lock to do so, but we must clear the local
311  * alloc before giving up the recovered nodes journal. To solve this,
312  * we kmalloc a copy of the local alloc before it's change for the
313  * caller to process with ocfs2_complete_local_alloc_recovery
314  */
315 int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb,
316 				     int slot_num,
317 				     struct ocfs2_dinode **alloc_copy)
318 {
319 	int status = 0;
320 	struct buffer_head *alloc_bh = NULL;
321 	struct inode *inode = NULL;
322 	struct ocfs2_dinode *alloc;
323 
324 	mlog_entry("(slot_num = %d)\n", slot_num);
325 
326 	*alloc_copy = NULL;
327 
328 	inode = ocfs2_get_system_file_inode(osb,
329 					    LOCAL_ALLOC_SYSTEM_INODE,
330 					    slot_num);
331 	if (!inode) {
332 		status = -EINVAL;
333 		mlog_errno(status);
334 		goto bail;
335 	}
336 
337 	mutex_lock(&inode->i_mutex);
338 
339 	status = ocfs2_read_block(osb, OCFS2_I(inode)->ip_blkno,
340 				  &alloc_bh, 0, inode);
341 	if (status < 0) {
342 		mlog_errno(status);
343 		goto bail;
344 	}
345 
346 	*alloc_copy = kmalloc(alloc_bh->b_size, GFP_KERNEL);
347 	if (!(*alloc_copy)) {
348 		status = -ENOMEM;
349 		goto bail;
350 	}
351 	memcpy((*alloc_copy), alloc_bh->b_data, alloc_bh->b_size);
352 
353 	alloc = (struct ocfs2_dinode *) alloc_bh->b_data;
354 	ocfs2_clear_local_alloc(alloc);
355 
356 	status = ocfs2_write_block(osb, alloc_bh, inode);
357 	if (status < 0)
358 		mlog_errno(status);
359 
360 bail:
361 	if ((status < 0) && (*alloc_copy)) {
362 		kfree(*alloc_copy);
363 		*alloc_copy = NULL;
364 	}
365 
366 	if (alloc_bh)
367 		brelse(alloc_bh);
368 
369 	if (inode) {
370 		mutex_unlock(&inode->i_mutex);
371 		iput(inode);
372 	}
373 
374 	mlog_exit(status);
375 	return status;
376 }
377 
378 /*
379  * Step 2: By now, we've completed the journal recovery, we've stamped
380  * a clean local alloc on disk and dropped the node out of the
381  * recovery map. Dlm locks will no longer stall, so lets clear out the
382  * main bitmap.
383  */
384 int ocfs2_complete_local_alloc_recovery(struct ocfs2_super *osb,
385 					struct ocfs2_dinode *alloc)
386 {
387 	int status;
388 	struct ocfs2_journal_handle *handle = NULL;
389 	struct buffer_head *main_bm_bh = NULL;
390 	struct inode *main_bm_inode = NULL;
391 
392 	mlog_entry_void();
393 
394 	handle = ocfs2_alloc_handle(osb);
395 	if (!handle) {
396 		status = -ENOMEM;
397 		mlog_errno(status);
398 		goto bail;
399 	}
400 
401 	main_bm_inode = ocfs2_get_system_file_inode(osb,
402 						    GLOBAL_BITMAP_SYSTEM_INODE,
403 						    OCFS2_INVALID_SLOT);
404 	if (!main_bm_inode) {
405 		status = -EINVAL;
406 		mlog_errno(status);
407 		goto bail;
408 	}
409 
410 	ocfs2_handle_add_inode(handle, main_bm_inode);
411 	status = ocfs2_meta_lock(main_bm_inode, handle, &main_bm_bh, 1);
412 	if (status < 0) {
413 		mlog_errno(status);
414 		goto bail;
415 	}
416 
417 	handle = ocfs2_start_trans(osb, handle, OCFS2_WINDOW_MOVE_CREDITS);
418 	if (IS_ERR(handle)) {
419 		status = PTR_ERR(handle);
420 		handle = NULL;
421 		mlog_errno(status);
422 		goto bail;
423 	}
424 
425 	/* we want the bitmap change to be recorded on disk asap */
426 	ocfs2_handle_set_sync(handle, 1);
427 
428 	status = ocfs2_sync_local_to_main(osb, handle, alloc,
429 					  main_bm_inode, main_bm_bh);
430 	if (status < 0)
431 		mlog_errno(status);
432 
433 bail:
434 	if (handle)
435 		ocfs2_commit_trans(handle);
436 
437 	if (main_bm_bh)
438 		brelse(main_bm_bh);
439 
440 	if (main_bm_inode)
441 		iput(main_bm_inode);
442 
443 	mlog_exit(status);
444 	return status;
445 }
446 
447 /*
448  * make sure we've got at least bitswanted contiguous bits in the
449  * local alloc. You lose them when you drop i_mutex.
450  *
451  * We will add ourselves to the transaction passed in, but may start
452  * our own in order to shift windows.
453  */
454 int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
455 				   struct ocfs2_journal_handle *passed_handle,
456 				   u32 bits_wanted,
457 				   struct ocfs2_alloc_context *ac)
458 {
459 	int status;
460 	struct ocfs2_dinode *alloc;
461 	struct inode *local_alloc_inode;
462 	unsigned int free_bits;
463 
464 	mlog_entry_void();
465 
466 	BUG_ON(!passed_handle);
467 	BUG_ON(!ac);
468 	BUG_ON(passed_handle->flags & OCFS2_HANDLE_STARTED);
469 
470 	local_alloc_inode =
471 		ocfs2_get_system_file_inode(osb,
472 					    LOCAL_ALLOC_SYSTEM_INODE,
473 					    osb->slot_num);
474 	if (!local_alloc_inode) {
475 		status = -ENOENT;
476 		mlog_errno(status);
477 		goto bail;
478 	}
479 	ocfs2_handle_add_inode(passed_handle, local_alloc_inode);
480 
481 	if (osb->local_alloc_state != OCFS2_LA_ENABLED) {
482 		status = -ENOSPC;
483 		goto bail;
484 	}
485 
486 	if (bits_wanted > ocfs2_local_alloc_window_bits(osb)) {
487 		mlog(0, "Asking for more than my max window size!\n");
488 		status = -ENOSPC;
489 		goto bail;
490 	}
491 
492 	alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data;
493 
494 	if (le32_to_cpu(alloc->id1.bitmap1.i_used) !=
495 	    ocfs2_local_alloc_count_bits(alloc)) {
496 		ocfs2_error(osb->sb, "local alloc inode %"MLFu64" says it has "
497 			    "%u free bits, but a count shows %u",
498 			    le64_to_cpu(alloc->i_blkno),
499 			    le32_to_cpu(alloc->id1.bitmap1.i_used),
500 			    ocfs2_local_alloc_count_bits(alloc));
501 		status = -EIO;
502 		goto bail;
503 	}
504 
505 	free_bits = le32_to_cpu(alloc->id1.bitmap1.i_total) -
506 		le32_to_cpu(alloc->id1.bitmap1.i_used);
507 	if (bits_wanted > free_bits) {
508 		/* uhoh, window change time. */
509 		status =
510 			ocfs2_local_alloc_slide_window(osb, local_alloc_inode);
511 		if (status < 0) {
512 			if (status != -ENOSPC)
513 				mlog_errno(status);
514 			goto bail;
515 		}
516 	}
517 
518 	ac->ac_inode = igrab(local_alloc_inode);
519 	get_bh(osb->local_alloc_bh);
520 	ac->ac_bh = osb->local_alloc_bh;
521 	ac->ac_which = OCFS2_AC_USE_LOCAL;
522 	status = 0;
523 bail:
524 	if (local_alloc_inode)
525 		iput(local_alloc_inode);
526 
527 	mlog_exit(status);
528 	return status;
529 }
530 
531 int ocfs2_claim_local_alloc_bits(struct ocfs2_super *osb,
532 				 struct ocfs2_journal_handle *handle,
533 				 struct ocfs2_alloc_context *ac,
534 				 u32 min_bits,
535 				 u32 *bit_off,
536 				 u32 *num_bits)
537 {
538 	int status, start;
539 	struct inode *local_alloc_inode;
540 	u32 bits_wanted;
541 	void *bitmap;
542 	struct ocfs2_dinode *alloc;
543 	struct ocfs2_local_alloc *la;
544 
545 	mlog_entry_void();
546 	BUG_ON(ac->ac_which != OCFS2_AC_USE_LOCAL);
547 
548 	bits_wanted = ac->ac_bits_wanted - ac->ac_bits_given;
549 	local_alloc_inode = ac->ac_inode;
550 	alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data;
551 	la = OCFS2_LOCAL_ALLOC(alloc);
552 
553 	start = ocfs2_local_alloc_find_clear_bits(osb, alloc, bits_wanted);
554 	if (start == -1) {
555 		/* TODO: Shouldn't we just BUG here? */
556 		status = -ENOSPC;
557 		mlog_errno(status);
558 		goto bail;
559 	}
560 
561 	bitmap = la->la_bitmap;
562 	*bit_off = le32_to_cpu(la->la_bm_off) + start;
563 	/* local alloc is always contiguous by nature -- we never
564 	 * delete bits from it! */
565 	*num_bits = bits_wanted;
566 
567 	status = ocfs2_journal_access(handle, local_alloc_inode,
568 				      osb->local_alloc_bh,
569 				      OCFS2_JOURNAL_ACCESS_WRITE);
570 	if (status < 0) {
571 		mlog_errno(status);
572 		goto bail;
573 	}
574 
575 	while(bits_wanted--)
576 		ocfs2_set_bit(start++, bitmap);
577 
578 	alloc->id1.bitmap1.i_used = cpu_to_le32(*num_bits +
579 				le32_to_cpu(alloc->id1.bitmap1.i_used));
580 
581 	status = ocfs2_journal_dirty(handle, osb->local_alloc_bh);
582 	if (status < 0) {
583 		mlog_errno(status);
584 		goto bail;
585 	}
586 
587 	status = 0;
588 bail:
589 	mlog_exit(status);
590 	return status;
591 }
592 
593 static u32 ocfs2_local_alloc_count_bits(struct ocfs2_dinode *alloc)
594 {
595 	int i;
596 	u8 *buffer;
597 	u32 count = 0;
598 	struct ocfs2_local_alloc *la = OCFS2_LOCAL_ALLOC(alloc);
599 
600 	mlog_entry_void();
601 
602 	buffer = la->la_bitmap;
603 	for (i = 0; i < le16_to_cpu(la->la_size); i++)
604 		count += hweight8(buffer[i]);
605 
606 	mlog_exit(count);
607 	return count;
608 }
609 
610 static int ocfs2_local_alloc_find_clear_bits(struct ocfs2_super *osb,
611 					     struct ocfs2_dinode *alloc,
612 					     u32 numbits)
613 {
614 	int numfound, bitoff, left, startoff, lastzero;
615 	void *bitmap = NULL;
616 
617 	mlog_entry("(numbits wanted = %u)\n", numbits);
618 
619 	if (!alloc->id1.bitmap1.i_total) {
620 		mlog(0, "No bits in my window!\n");
621 		bitoff = -1;
622 		goto bail;
623 	}
624 
625 	bitmap = OCFS2_LOCAL_ALLOC(alloc)->la_bitmap;
626 
627 	numfound = bitoff = startoff = 0;
628 	lastzero = -1;
629 	left = le32_to_cpu(alloc->id1.bitmap1.i_total);
630 	while ((bitoff = ocfs2_find_next_zero_bit(bitmap, left, startoff)) != -1) {
631 		if (bitoff == left) {
632 			/* mlog(0, "bitoff (%d) == left", bitoff); */
633 			break;
634 		}
635 		/* mlog(0, "Found a zero: bitoff = %d, startoff = %d, "
636 		   "numfound = %d\n", bitoff, startoff, numfound);*/
637 
638 		/* Ok, we found a zero bit... is it contig. or do we
639 		 * start over?*/
640 		if (bitoff == startoff) {
641 			/* we found a zero */
642 			numfound++;
643 			startoff++;
644 		} else {
645 			/* got a zero after some ones */
646 			numfound = 1;
647 			startoff = bitoff+1;
648 		}
649 		/* we got everything we needed */
650 		if (numfound == numbits) {
651 			/* mlog(0, "Found it all!\n"); */
652 			break;
653 		}
654 	}
655 
656 	mlog(0, "Exiting loop, bitoff = %d, numfound = %d\n", bitoff,
657 	     numfound);
658 
659 	if (numfound == numbits)
660 		bitoff = startoff - numfound;
661 	else
662 		bitoff = -1;
663 
664 bail:
665 	mlog_exit(bitoff);
666 	return bitoff;
667 }
668 
669 static void ocfs2_clear_local_alloc(struct ocfs2_dinode *alloc)
670 {
671 	struct ocfs2_local_alloc *la = OCFS2_LOCAL_ALLOC(alloc);
672 	int i;
673 	mlog_entry_void();
674 
675 	alloc->id1.bitmap1.i_total = 0;
676 	alloc->id1.bitmap1.i_used = 0;
677 	la->la_bm_off = 0;
678 	for(i = 0; i < le16_to_cpu(la->la_size); i++)
679 		la->la_bitmap[i] = 0;
680 
681 	mlog_exit_void();
682 }
683 
684 #if 0
685 /* turn this on and uncomment below to aid debugging window shifts. */
686 static void ocfs2_verify_zero_bits(unsigned long *bitmap,
687 				   unsigned int start,
688 				   unsigned int count)
689 {
690 	unsigned int tmp = count;
691 	while(tmp--) {
692 		if (ocfs2_test_bit(start + tmp, bitmap)) {
693 			printk("ocfs2_verify_zero_bits: start = %u, count = "
694 			       "%u\n", start, count);
695 			printk("ocfs2_verify_zero_bits: bit %u is set!",
696 			       start + tmp);
697 			BUG();
698 		}
699 	}
700 }
701 #endif
702 
703 /*
704  * sync the local alloc to main bitmap.
705  *
706  * assumes you've already locked the main bitmap -- the bitmap inode
707  * passed is used for caching.
708  */
709 static int ocfs2_sync_local_to_main(struct ocfs2_super *osb,
710 				    struct ocfs2_journal_handle *handle,
711 				    struct ocfs2_dinode *alloc,
712 				    struct inode *main_bm_inode,
713 				    struct buffer_head *main_bm_bh)
714 {
715 	int status = 0;
716 	int bit_off, left, count, start;
717 	u64 la_start_blk;
718 	u64 blkno;
719 	void *bitmap;
720 	struct ocfs2_local_alloc *la = OCFS2_LOCAL_ALLOC(alloc);
721 
722 	mlog_entry("total = %u, COUNT = %u, used = %u\n",
723 		   le32_to_cpu(alloc->id1.bitmap1.i_total),
724 		   ocfs2_local_alloc_count_bits(alloc),
725 		   le32_to_cpu(alloc->id1.bitmap1.i_used));
726 
727 	if (!alloc->id1.bitmap1.i_total) {
728 		mlog(0, "nothing to sync!\n");
729 		goto bail;
730 	}
731 
732 	if (le32_to_cpu(alloc->id1.bitmap1.i_used) ==
733 	    le32_to_cpu(alloc->id1.bitmap1.i_total)) {
734 		mlog(0, "all bits were taken!\n");
735 		goto bail;
736 	}
737 
738 	la_start_blk = ocfs2_clusters_to_blocks(osb->sb,
739 						le32_to_cpu(la->la_bm_off));
740 	bitmap = la->la_bitmap;
741 	start = count = bit_off = 0;
742 	left = le32_to_cpu(alloc->id1.bitmap1.i_total);
743 
744 	while ((bit_off = ocfs2_find_next_zero_bit(bitmap, left, start))
745 	       != -1) {
746 		if ((bit_off < left) && (bit_off == start)) {
747 			count++;
748 			start++;
749 			continue;
750 		}
751 		if (count) {
752 			blkno = la_start_blk +
753 				ocfs2_clusters_to_blocks(osb->sb,
754 							 start - count);
755 
756 			mlog(0, "freeing %u bits starting at local "
757 			     "alloc bit %u (la_start_blk = %"MLFu64", "
758 			     "blkno = %"MLFu64")\n", count, start - count,
759 			     la_start_blk, blkno);
760 
761 			status = ocfs2_free_clusters(handle, main_bm_inode,
762 						     main_bm_bh, blkno, count);
763 			if (status < 0) {
764 				mlog_errno(status);
765 				goto bail;
766 			}
767 		}
768 		if (bit_off >= left)
769 			break;
770 		count = 1;
771 		start = bit_off + 1;
772 	}
773 
774 bail:
775 	mlog_exit(status);
776 	return status;
777 }
778 
779 static int ocfs2_local_alloc_reserve_for_window(struct ocfs2_super *osb,
780 						struct ocfs2_journal_handle *handle,
781 						struct ocfs2_alloc_context **ac,
782 						struct inode **bitmap_inode,
783 						struct buffer_head **bitmap_bh)
784 {
785 	int status;
786 
787 	*ac = kcalloc(1, sizeof(struct ocfs2_alloc_context), GFP_KERNEL);
788 	if (!(*ac)) {
789 		status = -ENOMEM;
790 		mlog_errno(status);
791 		goto bail;
792 	}
793 
794 	(*ac)->ac_handle = handle;
795 	(*ac)->ac_bits_wanted = ocfs2_local_alloc_window_bits(osb);
796 
797 	status = ocfs2_reserve_cluster_bitmap_bits(osb, *ac);
798 	if (status < 0) {
799 		if (status != -ENOSPC)
800 			mlog_errno(status);
801 		goto bail;
802 	}
803 
804 	*bitmap_inode = (*ac)->ac_inode;
805 	igrab(*bitmap_inode);
806 	*bitmap_bh = (*ac)->ac_bh;
807 	get_bh(*bitmap_bh);
808 	status = 0;
809 bail:
810 	if ((status < 0) && *ac) {
811 		ocfs2_free_alloc_context(*ac);
812 		*ac = NULL;
813 	}
814 
815 	mlog_exit(status);
816 	return status;
817 }
818 
819 /*
820  * pass it the bitmap lock in lock_bh if you have it.
821  */
822 static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb,
823 					struct ocfs2_journal_handle *handle,
824 					struct ocfs2_alloc_context *ac)
825 {
826 	int status = 0;
827 	u32 cluster_off, cluster_count;
828 	struct ocfs2_dinode *alloc = NULL;
829 	struct ocfs2_local_alloc *la;
830 
831 	mlog_entry_void();
832 
833 	alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data;
834 	la = OCFS2_LOCAL_ALLOC(alloc);
835 
836 	if (alloc->id1.bitmap1.i_total)
837 		mlog(0, "asking me to alloc a new window over a non-empty "
838 		     "one\n");
839 
840 	mlog(0, "Allocating %u clusters for a new window.\n",
841 	     ocfs2_local_alloc_window_bits(osb));
842 	/* we used the generic suballoc reserve function, but we set
843 	 * everything up nicely, so there's no reason why we can't use
844 	 * the more specific cluster api to claim bits. */
845 	status = ocfs2_claim_clusters(osb, handle, ac,
846 				      ocfs2_local_alloc_window_bits(osb),
847 				      &cluster_off, &cluster_count);
848 	if (status < 0) {
849 		if (status != -ENOSPC)
850 			mlog_errno(status);
851 		goto bail;
852 	}
853 
854 	la->la_bm_off = cpu_to_le32(cluster_off);
855 	alloc->id1.bitmap1.i_total = cpu_to_le32(cluster_count);
856 	/* just in case... In the future when we find space ourselves,
857 	 * we don't have to get all contiguous -- but we'll have to
858 	 * set all previously used bits in bitmap and update
859 	 * la_bits_set before setting the bits in the main bitmap. */
860 	alloc->id1.bitmap1.i_used = 0;
861 	memset(OCFS2_LOCAL_ALLOC(alloc)->la_bitmap, 0,
862 	       le16_to_cpu(la->la_size));
863 
864 	mlog(0, "New window allocated:\n");
865 	mlog(0, "window la_bm_off = %u\n",
866 	     OCFS2_LOCAL_ALLOC(alloc)->la_bm_off);
867 	mlog(0, "window bits = %u\n", le32_to_cpu(alloc->id1.bitmap1.i_total));
868 
869 bail:
870 	mlog_exit(status);
871 	return status;
872 }
873 
874 /* Note that we do *NOT* lock the local alloc inode here as
875  * it's been locked already for us. */
876 static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb,
877 					  struct inode *local_alloc_inode)
878 {
879 	int status = 0;
880 	struct buffer_head *main_bm_bh = NULL;
881 	struct inode *main_bm_inode = NULL;
882 	struct ocfs2_journal_handle *handle = NULL;
883 	struct ocfs2_dinode *alloc;
884 	struct ocfs2_dinode *alloc_copy = NULL;
885 	struct ocfs2_alloc_context *ac = NULL;
886 
887 	mlog_entry_void();
888 
889 	handle = ocfs2_alloc_handle(osb);
890 	if (!handle) {
891 		status = -ENOMEM;
892 		mlog_errno(status);
893 		goto bail;
894 	}
895 
896 	/* This will lock the main bitmap for us. */
897 	status = ocfs2_local_alloc_reserve_for_window(osb,
898 						      handle,
899 						      &ac,
900 						      &main_bm_inode,
901 						      &main_bm_bh);
902 	if (status < 0) {
903 		if (status != -ENOSPC)
904 			mlog_errno(status);
905 		goto bail;
906 	}
907 
908 	handle = ocfs2_start_trans(osb, handle, OCFS2_WINDOW_MOVE_CREDITS);
909 	if (IS_ERR(handle)) {
910 		status = PTR_ERR(handle);
911 		handle = NULL;
912 		mlog_errno(status);
913 		goto bail;
914 	}
915 
916 	alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data;
917 
918 	/* We want to clear the local alloc before doing anything
919 	 * else, so that if we error later during this operation,
920 	 * local alloc shutdown won't try to double free main bitmap
921 	 * bits. Make a copy so the sync function knows which bits to
922 	 * free. */
923 	alloc_copy = kmalloc(osb->local_alloc_bh->b_size, GFP_KERNEL);
924 	if (!alloc_copy) {
925 		status = -ENOMEM;
926 		mlog_errno(status);
927 		goto bail;
928 	}
929 	memcpy(alloc_copy, alloc, osb->local_alloc_bh->b_size);
930 
931 	status = ocfs2_journal_access(handle, local_alloc_inode,
932 				      osb->local_alloc_bh,
933 				      OCFS2_JOURNAL_ACCESS_WRITE);
934 	if (status < 0) {
935 		mlog_errno(status);
936 		goto bail;
937 	}
938 
939 	ocfs2_clear_local_alloc(alloc);
940 
941 	status = ocfs2_journal_dirty(handle, osb->local_alloc_bh);
942 	if (status < 0) {
943 		mlog_errno(status);
944 		goto bail;
945 	}
946 
947 	status = ocfs2_sync_local_to_main(osb, handle, alloc_copy,
948 					  main_bm_inode, main_bm_bh);
949 	if (status < 0) {
950 		mlog_errno(status);
951 		goto bail;
952 	}
953 
954 	status = ocfs2_local_alloc_new_window(osb, handle, ac);
955 	if (status < 0) {
956 		if (status != -ENOSPC)
957 			mlog_errno(status);
958 		goto bail;
959 	}
960 
961 	atomic_inc(&osb->alloc_stats.moves);
962 
963 	status = 0;
964 bail:
965 	if (handle)
966 		ocfs2_commit_trans(handle);
967 
968 	if (main_bm_bh)
969 		brelse(main_bm_bh);
970 
971 	if (main_bm_inode)
972 		iput(main_bm_inode);
973 
974 	if (alloc_copy)
975 		kfree(alloc_copy);
976 
977 	if (ac)
978 		ocfs2_free_alloc_context(ac);
979 
980 	mlog_exit(status);
981 	return status;
982 }
983 
984