linux/fs/ocfs2/localalloc.c
<<
>>
Prefs
   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
  50static inline int ocfs2_local_alloc_window_bits(struct ocfs2_super *osb);
  51
  52static u32 ocfs2_local_alloc_count_bits(struct ocfs2_dinode *alloc);
  53
  54static int ocfs2_local_alloc_find_clear_bits(struct ocfs2_super *osb,
  55                                             struct ocfs2_dinode *alloc,
  56                                             u32 numbits);
  57
  58static void ocfs2_clear_local_alloc(struct ocfs2_dinode *alloc);
  59
  60static 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
  66static 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
  71static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb,
  72                                        handle_t *handle,
  73                                        struct ocfs2_alloc_context *ac);
  74
  75static 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 */
  85static 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 */
  96int 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
 113int 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
 177bail:
 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.*/
 195void 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
 282out_commit:
 283        ocfs2_commit_trans(osb, handle);
 284
 285out_unlock:
 286        if (main_bm_bh)
 287                brelse(main_bm_bh);
 288
 289        ocfs2_meta_unlock(main_bm_inode, 1);
 290
 291out_mutex:
 292        mutex_unlock(&main_bm_inode->i_mutex);
 293        iput(main_bm_inode);
 294
 295out:
 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 */
 312int 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
 357bail:
 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 */
 381int 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
 426out_unlock:
 427        ocfs2_meta_unlock(main_bm_inode, 1);
 428
 429out_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
 437out:
 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 */
 449int 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;
 518bail:
 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
 528int 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;
 583bail:
 584        mlog_exit(status);
 585        return status;
 586}
 587
 588static 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
 605static 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
 659bail:
 660        mlog_exit(bitoff);
 661        return bitoff;
 662}
 663
 664static 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. */
 681static 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 */
 704static 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
 769bail:
 770        mlog_exit(status);
 771        return status;
 772}
 773
 774static 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;
 802bail:
 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 */
 815static 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
 870bail:
 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. */
 877static 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;
 957bail:
 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
 977