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(WRITE, 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                        mlog(ML_ERROR,
 143                             "block %llu had the JBD bit set "
 144                             "while I was in lock_buffer!",
 145                             (unsigned long long)bh->b_blocknr);
 146                        BUG();
 147                }
 148
 149                clear_buffer_uptodate(bh);
 150                get_bh(bh); /* for end_buffer_read_sync() */
 151                bh->b_end_io = end_buffer_read_sync;
 152                submit_bh(READ, bh);
 153        }
 154
 155        for (i = nr; i > 0; i--) {
 156                bh = bhs[i - 1];
 157
 158                /* No need to wait on the buffer if it's managed by JBD. */
 159                if (!buffer_jbd(bh))
 160                        wait_on_buffer(bh);
 161
 162                if (!buffer_uptodate(bh)) {
 163                        /* Status won't be cleared from here on out,
 164                         * so we can safely record this and loop back
 165                         * to cleanup the other buffers. */
 166                        status = -EIO;
 167                        put_bh(bh);
 168                        bhs[i - 1] = NULL;
 169                }
 170        }
 171
 172bail:
 173        return status;
 174}
 175
 176int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
 177                      struct buffer_head *bhs[], int flags,
 178                      int (*validate)(struct super_block *sb,
 179                                      struct buffer_head *bh))
 180{
 181        int status = 0;
 182        int i, ignore_cache = 0;
 183        struct buffer_head *bh;
 184        struct super_block *sb = ocfs2_metadata_cache_get_super(ci);
 185
 186        trace_ocfs2_read_blocks_begin(ci, (unsigned long long)block, nr, flags);
 187
 188        BUG_ON(!ci);
 189        BUG_ON((flags & OCFS2_BH_READAHEAD) &&
 190               (flags & OCFS2_BH_IGNORE_CACHE));
 191
 192        if (bhs == NULL) {
 193                status = -EINVAL;
 194                mlog_errno(status);
 195                goto bail;
 196        }
 197
 198        if (nr < 0) {
 199                mlog(ML_ERROR, "asked to read %d blocks!\n", nr);
 200                status = -EINVAL;
 201                mlog_errno(status);
 202                goto bail;
 203        }
 204
 205        if (nr == 0) {
 206                status = 0;
 207                goto bail;
 208        }
 209
 210        ocfs2_metadata_cache_io_lock(ci);
 211        for (i = 0 ; i < nr ; i++) {
 212                if (bhs[i] == NULL) {
 213                        bhs[i] = sb_getblk(sb, block++);
 214                        if (bhs[i] == NULL) {
 215                                ocfs2_metadata_cache_io_unlock(ci);
 216                                status = -ENOMEM;
 217                                mlog_errno(status);
 218                                goto bail;
 219                        }
 220                }
 221                bh = bhs[i];
 222                ignore_cache = (flags & OCFS2_BH_IGNORE_CACHE);
 223
 224                /* There are three read-ahead cases here which we need to
 225                 * be concerned with. All three assume a buffer has
 226                 * previously been submitted with OCFS2_BH_READAHEAD
 227                 * and it hasn't yet completed I/O.
 228                 *
 229                 * 1) The current request is sync to disk. This rarely
 230                 *    happens these days, and never when performance
 231                 *    matters - the code can just wait on the buffer
 232                 *    lock and re-submit.
 233                 *
 234                 * 2) The current request is cached, but not
 235                 *    readahead. ocfs2_buffer_uptodate() will return
 236                 *    false anyway, so we'll wind up waiting on the
 237                 *    buffer lock to do I/O. We re-check the request
 238                 *    with after getting the lock to avoid a re-submit.
 239                 *
 240                 * 3) The current request is readahead (and so must
 241                 *    also be a caching one). We short circuit if the
 242                 *    buffer is locked (under I/O) and if it's in the
 243                 *    uptodate cache. The re-check from #2 catches the
 244                 *    case that the previous read-ahead completes just
 245                 *    before our is-it-in-flight check.
 246                 */
 247
 248                if (!ignore_cache && !ocfs2_buffer_uptodate(ci, bh)) {
 249                        trace_ocfs2_read_blocks_from_disk(
 250                             (unsigned long long)bh->b_blocknr,
 251                             (unsigned long long)ocfs2_metadata_cache_owner(ci));
 252                        /* We're using ignore_cache here to say
 253                         * "go to disk" */
 254                        ignore_cache = 1;
 255                }
 256
 257                trace_ocfs2_read_blocks_bh((unsigned long long)bh->b_blocknr,
 258                        ignore_cache, buffer_jbd(bh), buffer_dirty(bh));
 259
 260                if (buffer_jbd(bh)) {
 261                        continue;
 262                }
 263
 264                if (ignore_cache) {
 265                        if (buffer_dirty(bh)) {
 266                                /* This should probably be a BUG, or
 267                                 * at least return an error. */
 268                                continue;
 269                        }
 270
 271                        /* A read-ahead request was made - if the
 272                         * buffer is already under read-ahead from a
 273                         * previously submitted request than we are
 274                         * done here. */
 275                        if ((flags & OCFS2_BH_READAHEAD)
 276                            && ocfs2_buffer_read_ahead(ci, bh))
 277                                continue;
 278
 279                        lock_buffer(bh);
 280                        if (buffer_jbd(bh)) {
 281#ifdef CATCH_BH_JBD_RACES
 282                                mlog(ML_ERROR, "block %llu had the JBD bit set "
 283                                               "while I was in lock_buffer!",
 284                                     (unsigned long long)bh->b_blocknr);
 285                                BUG();
 286#else
 287                                unlock_buffer(bh);
 288                                continue;
 289#endif
 290                        }
 291
 292                        /* Re-check ocfs2_buffer_uptodate() as a
 293                         * previously read-ahead buffer may have
 294                         * completed I/O while we were waiting for the
 295                         * buffer lock. */
 296                        if (!(flags & OCFS2_BH_IGNORE_CACHE)
 297                            && !(flags & OCFS2_BH_READAHEAD)
 298                            && ocfs2_buffer_uptodate(ci, bh)) {
 299                                unlock_buffer(bh);
 300                                continue;
 301                        }
 302
 303                        clear_buffer_uptodate(bh);
 304                        get_bh(bh); /* for end_buffer_read_sync() */
 305                        if (validate)
 306                                set_buffer_needs_validate(bh);
 307                        bh->b_end_io = end_buffer_read_sync;
 308                        submit_bh(READ, bh);
 309                        continue;
 310                }
 311        }
 312
 313        status = 0;
 314
 315        for (i = (nr - 1); i >= 0; i--) {
 316                bh = bhs[i];
 317
 318                if (!(flags & OCFS2_BH_READAHEAD)) {
 319                        /* We know this can't have changed as we hold the
 320                         * owner sem. Avoid doing any work on the bh if the
 321                         * journal has it. */
 322                        if (!buffer_jbd(bh))
 323                                wait_on_buffer(bh);
 324
 325                        if (!buffer_uptodate(bh)) {
 326                                /* Status won't be cleared from here on out,
 327                                 * so we can safely record this and loop back
 328                                 * to cleanup the other buffers. Don't need to
 329                                 * remove the clustered uptodate information
 330                                 * for this bh as it's not marked locally
 331                                 * uptodate. */
 332                                status = -EIO;
 333                                put_bh(bh);
 334                                bhs[i] = NULL;
 335                                continue;
 336                        }
 337
 338                        if (buffer_needs_validate(bh)) {
 339                                /* We never set NeedsValidate if the
 340                                 * buffer was held by the journal, so
 341                                 * that better not have changed */
 342                                BUG_ON(buffer_jbd(bh));
 343                                clear_buffer_needs_validate(bh);
 344                                status = validate(sb, bh);
 345                                if (status) {
 346                                        put_bh(bh);
 347                                        bhs[i] = NULL;
 348                                        continue;
 349                                }
 350                        }
 351                }
 352
 353                /* Always set the buffer in the cache, even if it was
 354                 * a forced read, or read-ahead which hasn't yet
 355                 * completed. */
 356                ocfs2_set_buffer_uptodate(ci, bh);
 357        }
 358        ocfs2_metadata_cache_io_unlock(ci);
 359
 360        trace_ocfs2_read_blocks_end((unsigned long long)block, nr,
 361                                    flags, ignore_cache);
 362
 363bail:
 364
 365        return status;
 366}
 367
 368/* Check whether the blkno is the super block or one of the backups. */
 369static void ocfs2_check_super_or_backup(struct super_block *sb,
 370                                        sector_t blkno)
 371{
 372        int i;
 373        u64 backup_blkno;
 374
 375        if (blkno == OCFS2_SUPER_BLOCK_BLKNO)
 376                return;
 377
 378        for (i = 0; i < OCFS2_MAX_BACKUP_SUPERBLOCKS; i++) {
 379                backup_blkno = ocfs2_backup_super_blkno(sb, i);
 380                if (backup_blkno == blkno)
 381                        return;
 382        }
 383
 384        BUG();
 385}
 386
 387/*
 388 * Write super block and backups doesn't need to collaborate with journal,
 389 * so we don't need to lock ip_io_mutex and ci doesn't need to bea passed
 390 * into this function.
 391 */
 392int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
 393                                struct buffer_head *bh)
 394{
 395        int ret = 0;
 396        struct ocfs2_dinode *di = (struct ocfs2_dinode *)bh->b_data;
 397
 398        BUG_ON(buffer_jbd(bh));
 399        ocfs2_check_super_or_backup(osb->sb, bh->b_blocknr);
 400
 401        if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb)) {
 402                ret = -EROFS;
 403                mlog_errno(ret);
 404                goto out;
 405        }
 406
 407        lock_buffer(bh);
 408        set_buffer_uptodate(bh);
 409
 410        /* remove from dirty list before I/O. */
 411        clear_buffer_dirty(bh);
 412
 413        get_bh(bh); /* for end_buffer_write_sync() */
 414        bh->b_end_io = end_buffer_write_sync;
 415        ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &di->i_check);
 416        submit_bh(WRITE, bh);
 417
 418        wait_on_buffer(bh);
 419
 420        if (!buffer_uptodate(bh)) {
 421                ret = -EIO;
 422                mlog_errno(ret);
 423        }
 424
 425out:
 426        return ret;
 427}
 428