linux/fs/ocfs2/buffer_head_io.c
<<
>>
Prefs
   1/* -*- mode: c; c-basic-offset: 8; -*-
   2 * vim: noexpandtab sw=8 ts=8 sts=0:
   3 *
   4 * io.c
   5 *
   6 * Buffer cache handling
   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/highmem.h>
  29
  30#include <cluster/masklog.h>
  31
  32#include "ocfs2.h"
  33
  34#include "alloc.h"
  35#include "inode.h"
  36#include "journal.h"
  37#include "uptodate.h"
  38#include "buffer_head_io.h"
  39#include "ocfs2_trace.h"
  40
  41/*
  42 * Bits on bh->b_state used by ocfs2.
  43 *
  44 * These MUST be after the JBD2 bits.  Hence, we use BH_JBDPrivateStart.
  45 */
  46enum ocfs2_state_bits {
  47        BH_NeedsValidate = BH_JBDPrivateStart,
  48};
  49
  50/* Expand the magic b_state functions */
  51BUFFER_FNS(NeedsValidate, needs_validate);
  52
  53int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
  54                      struct ocfs2_caching_info *ci)
  55{
  56        int ret = 0;
  57
  58        trace_ocfs2_write_block((unsigned long long)bh->b_blocknr, ci);
  59
  60        BUG_ON(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO);
  61        BUG_ON(buffer_jbd(bh));
  62
  63        /* No need to check for a soft readonly file system here. non
  64         * journalled writes are only ever done on system files which
  65         * can get modified during recovery even if read-only. */
  66        if (ocfs2_is_hard_readonly(osb)) {
  67                ret = -EROFS;
  68                mlog_errno(ret);
  69                goto out;
  70        }
  71
  72        ocfs2_metadata_cache_io_lock(ci);
  73
  74        lock_buffer(bh);
  75        set_buffer_uptodate(bh);
  76
  77        /* remove from dirty list before I/O. */
  78        clear_buffer_dirty(bh);
  79
  80        get_bh(bh); /* for end_buffer_write_sync() */
  81        bh->b_end_io = end_buffer_write_sync;
  82        submit_bh(REQ_OP_WRITE, 0, bh);
  83
  84        wait_on_buffer(bh);
  85
  86        if (buffer_uptodate(bh)) {
  87                ocfs2_set_buffer_uptodate(ci, bh);
  88        } else {
  89                /* We don't need to remove the clustered uptodate
  90                 * information for this bh as it's not marked locally
  91                 * uptodate. */
  92                ret = -EIO;
  93                mlog_errno(ret);
  94        }
  95
  96        ocfs2_metadata_cache_io_unlock(ci);
  97out:
  98        return ret;
  99}
 100
 101int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
 102                           unsigned int nr, struct buffer_head *bhs[])
 103{
 104        int status = 0;
 105        unsigned int i;
 106        struct buffer_head *bh;
 107
 108        trace_ocfs2_read_blocks_sync((unsigned long long)block, nr);
 109
 110        if (!nr)
 111                goto bail;
 112
 113        for (i = 0 ; i < nr ; i++) {
 114                if (bhs[i] == NULL) {
 115                        bhs[i] = sb_getblk(osb->sb, block++);
 116                        if (bhs[i] == NULL) {
 117                                status = -ENOMEM;
 118                                mlog_errno(status);
 119                                goto bail;
 120                        }
 121                }
 122                bh = bhs[i];
 123
 124                if (buffer_jbd(bh)) {
 125                        trace_ocfs2_read_blocks_sync_jbd(
 126                                        (unsigned long long)bh->b_blocknr);
 127                        continue;
 128                }
 129
 130                if (buffer_dirty(bh)) {
 131                        /* This should probably be a BUG, or
 132                         * at least return an error. */
 133                        mlog(ML_ERROR,
 134                             "trying to sync read a dirty "
 135                             "buffer! (blocknr = %llu), skipping\n",
 136                             (unsigned long long)bh->b_blocknr);
 137                        continue;
 138                }
 139
 140                lock_buffer(bh);
 141                if (buffer_jbd(bh)) {
 142#ifdef CATCH_BH_JBD_RACES
 143                        mlog(ML_ERROR,
 144                             "block %llu had the JBD bit set "
 145                             "while I was in lock_buffer!",
 146                             (unsigned long long)bh->b_blocknr);
 147                        BUG();
 148#else
 149                        unlock_buffer(bh);
 150                        continue;
 151#endif
 152                }
 153
 154                clear_buffer_uptodate(bh);
 155                get_bh(bh); /* for end_buffer_read_sync() */
 156                bh->b_end_io = end_buffer_read_sync;
 157                submit_bh(REQ_OP_READ, 0, bh);
 158        }
 159
 160        for (i = nr; i > 0; i--) {
 161                bh = bhs[i - 1];
 162
 163                /* No need to wait on the buffer if it's managed by JBD. */
 164                if (!buffer_jbd(bh))
 165                        wait_on_buffer(bh);
 166
 167                if (!buffer_uptodate(bh)) {
 168                        /* Status won't be cleared from here on out,
 169                         * so we can safely record this and loop back
 170                         * to cleanup the other buffers. */
 171                        status = -EIO;
 172                        put_bh(bh);
 173                        bhs[i - 1] = NULL;
 174                }
 175        }
 176
 177bail:
 178        return status;
 179}
 180
 181int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
 182                      struct buffer_head *bhs[], int flags,
 183                      int (*validate)(struct super_block *sb,
 184                                      struct buffer_head *bh))
 185{
 186        int status = 0;
 187        int i, ignore_cache = 0;
 188        struct buffer_head *bh;
 189        struct super_block *sb = ocfs2_metadata_cache_get_super(ci);
 190
 191        trace_ocfs2_read_blocks_begin(ci, (unsigned long long)block, nr, flags);
 192
 193        BUG_ON(!ci);
 194        BUG_ON((flags & OCFS2_BH_READAHEAD) &&
 195               (flags & OCFS2_BH_IGNORE_CACHE));
 196
 197        if (bhs == NULL) {
 198                status = -EINVAL;
 199                mlog_errno(status);
 200                goto bail;
 201        }
 202
 203        if (nr < 0) {
 204                mlog(ML_ERROR, "asked to read %d blocks!\n", nr);
 205                status = -EINVAL;
 206                mlog_errno(status);
 207                goto bail;
 208        }
 209
 210        if (nr == 0) {
 211                status = 0;
 212                goto bail;
 213        }
 214
 215        ocfs2_metadata_cache_io_lock(ci);
 216        for (i = 0 ; i < nr ; i++) {
 217                if (bhs[i] == NULL) {
 218                        bhs[i] = sb_getblk(sb, block++);
 219                        if (bhs[i] == NULL) {
 220                                ocfs2_metadata_cache_io_unlock(ci);
 221                                status = -ENOMEM;
 222                                mlog_errno(status);
 223                                goto bail;
 224                        }
 225                }
 226                bh = bhs[i];
 227                ignore_cache = (flags & OCFS2_BH_IGNORE_CACHE);
 228
 229                /* There are three read-ahead cases here which we need to
 230                 * be concerned with. All three assume a buffer has
 231                 * previously been submitted with OCFS2_BH_READAHEAD
 232                 * and it hasn't yet completed I/O.
 233                 *
 234                 * 1) The current request is sync to disk. This rarely
 235                 *    happens these days, and never when performance
 236                 *    matters - the code can just wait on the buffer
 237                 *    lock and re-submit.
 238                 *
 239                 * 2) The current request is cached, but not
 240                 *    readahead. ocfs2_buffer_uptodate() will return
 241                 *    false anyway, so we'll wind up waiting on the
 242                 *    buffer lock to do I/O. We re-check the request
 243                 *    with after getting the lock to avoid a re-submit.
 244                 *
 245                 * 3) The current request is readahead (and so must
 246                 *    also be a caching one). We short circuit if the
 247                 *    buffer is locked (under I/O) and if it's in the
 248                 *    uptodate cache. The re-check from #2 catches the
 249                 *    case that the previous read-ahead completes just
 250                 *    before our is-it-in-flight check.
 251                 */
 252
 253                if (!ignore_cache && !ocfs2_buffer_uptodate(ci, bh)) {
 254                        trace_ocfs2_read_blocks_from_disk(
 255                             (unsigned long long)bh->b_blocknr,
 256                             (unsigned long long)ocfs2_metadata_cache_owner(ci));
 257                        /* We're using ignore_cache here to say
 258                         * "go to disk" */
 259                        ignore_cache = 1;
 260                }
 261
 262                trace_ocfs2_read_blocks_bh((unsigned long long)bh->b_blocknr,
 263                        ignore_cache, buffer_jbd(bh), buffer_dirty(bh));
 264
 265                if (buffer_jbd(bh)) {
 266                        continue;
 267                }
 268
 269                if (ignore_cache) {
 270                        if (buffer_dirty(bh)) {
 271                                /* This should probably be a BUG, or
 272                                 * at least return an error. */
 273                                continue;
 274                        }
 275
 276                        /* A read-ahead request was made - if the
 277                         * buffer is already under read-ahead from a
 278                         * previously submitted request than we are
 279                         * done here. */
 280                        if ((flags & OCFS2_BH_READAHEAD)
 281                            && ocfs2_buffer_read_ahead(ci, bh))
 282                                continue;
 283
 284                        lock_buffer(bh);
 285                        if (buffer_jbd(bh)) {
 286#ifdef CATCH_BH_JBD_RACES
 287                                mlog(ML_ERROR, "block %llu had the JBD bit set "
 288                                               "while I was in lock_buffer!",
 289                                     (unsigned long long)bh->b_blocknr);
 290                                BUG();
 291#else
 292                                unlock_buffer(bh);
 293                                continue;
 294#endif
 295                        }
 296
 297                        /* Re-check ocfs2_buffer_uptodate() as a
 298                         * previously read-ahead buffer may have
 299                         * completed I/O while we were waiting for the
 300                         * buffer lock. */
 301                        if (!(flags & OCFS2_BH_IGNORE_CACHE)
 302                            && !(flags & OCFS2_BH_READAHEAD)
 303                            && ocfs2_buffer_uptodate(ci, bh)) {
 304                                unlock_buffer(bh);
 305                                continue;
 306                        }
 307
 308                        clear_buffer_uptodate(bh);
 309                        get_bh(bh); /* for end_buffer_read_sync() */
 310                        if (validate)
 311                                set_buffer_needs_validate(bh);
 312                        bh->b_end_io = end_buffer_read_sync;
 313                        submit_bh(REQ_OP_READ, 0, bh);
 314                        continue;
 315                }
 316        }
 317
 318        status = 0;
 319
 320        for (i = (nr - 1); i >= 0; i--) {
 321                bh = bhs[i];
 322
 323                if (!(flags & OCFS2_BH_READAHEAD)) {
 324                        if (status) {
 325                                /* Clear the rest of the buffers on error */
 326                                put_bh(bh);
 327                                bhs[i] = NULL;
 328                                continue;
 329                        }
 330                        /* We know this can't have changed as we hold the
 331                         * owner sem. Avoid doing any work on the bh if the
 332                         * journal has it. */
 333                        if (!buffer_jbd(bh))
 334                                wait_on_buffer(bh);
 335
 336                        if (!buffer_uptodate(bh)) {
 337                                /* Status won't be cleared from here on out,
 338                                 * so we can safely record this and loop back
 339                                 * to cleanup the other buffers. Don't need to
 340                                 * remove the clustered uptodate information
 341                                 * for this bh as it's not marked locally
 342                                 * uptodate. */
 343                                status = -EIO;
 344                                put_bh(bh);
 345                                bhs[i] = NULL;
 346                                continue;
 347                        }
 348
 349                        if (buffer_needs_validate(bh)) {
 350                                /* We never set NeedsValidate if the
 351                                 * buffer was held by the journal, so
 352                                 * that better not have changed */
 353                                BUG_ON(buffer_jbd(bh));
 354                                clear_buffer_needs_validate(bh);
 355                                status = validate(sb, bh);
 356                                if (status) {
 357                                        put_bh(bh);
 358                                        bhs[i] = NULL;
 359                                        continue;
 360                                }
 361                        }
 362                }
 363
 364                /* Always set the buffer in the cache, even if it was
 365                 * a forced read, or read-ahead which hasn't yet
 366                 * completed. */
 367                ocfs2_set_buffer_uptodate(ci, bh);
 368        }
 369        ocfs2_metadata_cache_io_unlock(ci);
 370
 371        trace_ocfs2_read_blocks_end((unsigned long long)block, nr,
 372                                    flags, ignore_cache);
 373
 374bail:
 375
 376        return status;
 377}
 378
 379/* Check whether the blkno is the super block or one of the backups. */
 380static void ocfs2_check_super_or_backup(struct super_block *sb,
 381                                        sector_t blkno)
 382{
 383        int i;
 384        u64 backup_blkno;
 385
 386        if (blkno == OCFS2_SUPER_BLOCK_BLKNO)
 387                return;
 388
 389        for (i = 0; i < OCFS2_MAX_BACKUP_SUPERBLOCKS; i++) {
 390                backup_blkno = ocfs2_backup_super_blkno(sb, i);
 391                if (backup_blkno == blkno)
 392                        return;
 393        }
 394
 395        BUG();
 396}
 397
 398/*
 399 * Write super block and backups doesn't need to collaborate with journal,
 400 * so we don't need to lock ip_io_mutex and ci doesn't need to bea passed
 401 * into this function.
 402 */
 403int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
 404                                struct buffer_head *bh)
 405{
 406        int ret = 0;
 407        struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data;
 408
 409        BUG_ON(buffer_jbd(bh));
 410        ocfs2_check_super_or_backup(osb->sb, bh->b_blocknr);
 411
 412        if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb)) {
 413                ret = -EROFS;
 414                mlog_errno(ret);
 415                goto out;
 416        }
 417
 418        lock_buffer(bh);
 419        set_buffer_uptodate(bh);
 420
 421        /* remove from dirty list before I/O. */
 422        clear_buffer_dirty(bh);
 423
 424        get_bh(bh); /* for end_buffer_write_sync() */
 425        bh->b_end_io = end_buffer_write_sync;
 426        ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check);
 427        submit_bh(REQ_OP_WRITE, 0, bh);
 428
 429        wait_on_buffer(bh);
 430
 431        if (!buffer_uptodate(bh)) {
 432                ret = -EIO;
 433                mlog_errno(ret);
 434        }
 435
 436out:
 437        return ret;
 438}
 439