OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [ocfs2/] [localalloc.c] - Blame information for rev 78

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.