linux/fs/bio-integrity.c
<<
>>
Prefs
   1/*
   2 * bio-integrity.c - bio data integrity extensions
   3 *
   4 * Copyright (C) 2007, 2008 Oracle Corporation
   5 * Written by: Martin K. Petersen <martin.petersen@oracle.com>
   6 *
   7 * This program is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU General Public License version
   9 * 2 as published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful, but
  12 * WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14 * General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; see the file COPYING.  If not, write to
  18 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
  19 * USA.
  20 *
  21 */
  22
  23#include <linux/blkdev.h>
  24#include <linux/mempool.h>
  25#include <linux/bio.h>
  26#include <linux/workqueue.h>
  27
  28static struct kmem_cache *bio_integrity_slab __read_mostly;
  29static struct workqueue_struct *kintegrityd_wq;
  30
  31/**
  32 * bio_integrity_alloc_bioset - Allocate integrity payload and attach it to bio
  33 * @bio:        bio to attach integrity metadata to
  34 * @gfp_mask:   Memory allocation mask
  35 * @nr_vecs:    Number of integrity metadata scatter-gather elements
  36 * @bs:         bio_set to allocate from
  37 *
  38 * Description: This function prepares a bio for attaching integrity
  39 * metadata.  nr_vecs specifies the maximum number of pages containing
  40 * integrity metadata that can be attached.
  41 */
  42struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio,
  43                                                         gfp_t gfp_mask,
  44                                                         unsigned int nr_vecs,
  45                                                         struct bio_set *bs)
  46{
  47        struct bio_integrity_payload *bip;
  48        struct bio_vec *iv;
  49        unsigned long idx;
  50
  51        BUG_ON(bio == NULL);
  52
  53        bip = mempool_alloc(bs->bio_integrity_pool, gfp_mask);
  54        if (unlikely(bip == NULL)) {
  55                printk(KERN_ERR "%s: could not alloc bip\n", __func__);
  56                return NULL;
  57        }
  58
  59        memset(bip, 0, sizeof(*bip));
  60
  61        iv = bvec_alloc_bs(gfp_mask, nr_vecs, &idx, bs);
  62        if (unlikely(iv == NULL)) {
  63                printk(KERN_ERR "%s: could not alloc bip_vec\n", __func__);
  64                mempool_free(bip, bs->bio_integrity_pool);
  65                return NULL;
  66        }
  67
  68        bip->bip_pool = idx;
  69        bip->bip_vec = iv;
  70        bip->bip_bio = bio;
  71        bio->bi_integrity = bip;
  72
  73        return bip;
  74}
  75EXPORT_SYMBOL(bio_integrity_alloc_bioset);
  76
  77/**
  78 * bio_integrity_alloc - Allocate integrity payload and attach it to bio
  79 * @bio:        bio to attach integrity metadata to
  80 * @gfp_mask:   Memory allocation mask
  81 * @nr_vecs:    Number of integrity metadata scatter-gather elements
  82 *
  83 * Description: This function prepares a bio for attaching integrity
  84 * metadata.  nr_vecs specifies the maximum number of pages containing
  85 * integrity metadata that can be attached.
  86 */
  87struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
  88                                                  gfp_t gfp_mask,
  89                                                  unsigned int nr_vecs)
  90{
  91        return bio_integrity_alloc_bioset(bio, gfp_mask, nr_vecs, fs_bio_set);
  92}
  93EXPORT_SYMBOL(bio_integrity_alloc);
  94
  95/**
  96 * bio_integrity_free - Free bio integrity payload
  97 * @bio:        bio containing bip to be freed
  98 * @bs:         bio_set this bio was allocated from
  99 *
 100 * Description: Used to free the integrity portion of a bio. Usually
 101 * called from bio_free().
 102 */
 103void bio_integrity_free(struct bio *bio, struct bio_set *bs)
 104{
 105        struct bio_integrity_payload *bip = bio->bi_integrity;
 106
 107        BUG_ON(bip == NULL);
 108
 109        /* A cloned bio doesn't own the integrity metadata */
 110        if (!bio_flagged(bio, BIO_CLONED) && !bio_flagged(bio, BIO_FS_INTEGRITY)
 111            && bip->bip_buf != NULL)
 112                kfree(bip->bip_buf);
 113
 114        mempool_free(bip->bip_vec, bs->bvec_pools[bip->bip_pool]);
 115        mempool_free(bip, bs->bio_integrity_pool);
 116
 117        bio->bi_integrity = NULL;
 118}
 119EXPORT_SYMBOL(bio_integrity_free);
 120
 121/**
 122 * bio_integrity_add_page - Attach integrity metadata
 123 * @bio:        bio to update
 124 * @page:       page containing integrity metadata
 125 * @len:        number of bytes of integrity metadata in page
 126 * @offset:     start offset within page
 127 *
 128 * Description: Attach a page containing integrity metadata to bio.
 129 */
 130int bio_integrity_add_page(struct bio *bio, struct page *page,
 131                           unsigned int len, unsigned int offset)
 132{
 133        struct bio_integrity_payload *bip = bio->bi_integrity;
 134        struct bio_vec *iv;
 135
 136        if (bip->bip_vcnt >= bvec_nr_vecs(bip->bip_pool)) {
 137                printk(KERN_ERR "%s: bip_vec full\n", __func__);
 138                return 0;
 139        }
 140
 141        iv = bip_vec_idx(bip, bip->bip_vcnt);
 142        BUG_ON(iv == NULL);
 143        BUG_ON(iv->bv_page != NULL);
 144
 145        iv->bv_page = page;
 146        iv->bv_len = len;
 147        iv->bv_offset = offset;
 148        bip->bip_vcnt++;
 149
 150        return len;
 151}
 152EXPORT_SYMBOL(bio_integrity_add_page);
 153
 154static int bdev_integrity_enabled(struct block_device *bdev, int rw)
 155{
 156        struct blk_integrity *bi = bdev_get_integrity(bdev);
 157
 158        if (bi == NULL)
 159                return 0;
 160
 161        if (rw == READ && bi->verify_fn != NULL &&
 162            (bi->flags & INTEGRITY_FLAG_READ))
 163                return 1;
 164
 165        if (rw == WRITE && bi->generate_fn != NULL &&
 166            (bi->flags & INTEGRITY_FLAG_WRITE))
 167                return 1;
 168
 169        return 0;
 170}
 171
 172/**
 173 * bio_integrity_enabled - Check whether integrity can be passed
 174 * @bio:        bio to check
 175 *
 176 * Description: Determines whether bio_integrity_prep() can be called
 177 * on this bio or not.  bio data direction and target device must be
 178 * set prior to calling.  The functions honors the write_generate and
 179 * read_verify flags in sysfs.
 180 */
 181int bio_integrity_enabled(struct bio *bio)
 182{
 183        /* Already protected? */
 184        if (bio_integrity(bio))
 185                return 0;
 186
 187        return bdev_integrity_enabled(bio->bi_bdev, bio_data_dir(bio));
 188}
 189EXPORT_SYMBOL(bio_integrity_enabled);
 190
 191/**
 192 * bio_integrity_hw_sectors - Convert 512b sectors to hardware ditto
 193 * @bi:         blk_integrity profile for device
 194 * @sectors:    Number of 512 sectors to convert
 195 *
 196 * Description: The block layer calculates everything in 512 byte
 197 * sectors but integrity metadata is done in terms of the hardware
 198 * sector size of the storage device.  Convert the block layer sectors
 199 * to physical sectors.
 200 */
 201static inline unsigned int bio_integrity_hw_sectors(struct blk_integrity *bi,
 202                                                    unsigned int sectors)
 203{
 204        /* At this point there are only 512b or 4096b DIF/EPP devices */
 205        if (bi->sector_size == 4096)
 206                return sectors >>= 3;
 207
 208        return sectors;
 209}
 210
 211/**
 212 * bio_integrity_tag_size - Retrieve integrity tag space
 213 * @bio:        bio to inspect
 214 *
 215 * Description: Returns the maximum number of tag bytes that can be
 216 * attached to this bio. Filesystems can use this to determine how
 217 * much metadata to attach to an I/O.
 218 */
 219unsigned int bio_integrity_tag_size(struct bio *bio)
 220{
 221        struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
 222
 223        BUG_ON(bio->bi_size == 0);
 224
 225        return bi->tag_size * (bio->bi_size / bi->sector_size);
 226}
 227EXPORT_SYMBOL(bio_integrity_tag_size);
 228
 229int bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, int set)
 230{
 231        struct bio_integrity_payload *bip = bio->bi_integrity;
 232        struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
 233        unsigned int nr_sectors;
 234
 235        BUG_ON(bip->bip_buf == NULL);
 236
 237        if (bi->tag_size == 0)
 238                return -1;
 239
 240        nr_sectors = bio_integrity_hw_sectors(bi,
 241                                        DIV_ROUND_UP(len, bi->tag_size));
 242
 243        if (nr_sectors * bi->tuple_size > bip->bip_size) {
 244                printk(KERN_ERR "%s: tag too big for bio: %u > %u\n",
 245                       __func__, nr_sectors * bi->tuple_size, bip->bip_size);
 246                return -1;
 247        }
 248
 249        if (set)
 250                bi->set_tag_fn(bip->bip_buf, tag_buf, nr_sectors);
 251        else
 252                bi->get_tag_fn(bip->bip_buf, tag_buf, nr_sectors);
 253
 254        return 0;
 255}
 256
 257/**
 258 * bio_integrity_set_tag - Attach a tag buffer to a bio
 259 * @bio:        bio to attach buffer to
 260 * @tag_buf:    Pointer to a buffer containing tag data
 261 * @len:        Length of the included buffer
 262 *
 263 * Description: Use this function to tag a bio by leveraging the extra
 264 * space provided by devices formatted with integrity protection.  The
 265 * size of the integrity buffer must be <= to the size reported by
 266 * bio_integrity_tag_size().
 267 */
 268int bio_integrity_set_tag(struct bio *bio, void *tag_buf, unsigned int len)
 269{
 270        BUG_ON(bio_data_dir(bio) != WRITE);
 271
 272        return bio_integrity_tag(bio, tag_buf, len, 1);
 273}
 274EXPORT_SYMBOL(bio_integrity_set_tag);
 275
 276/**
 277 * bio_integrity_get_tag - Retrieve a tag buffer from a bio
 278 * @bio:        bio to retrieve buffer from
 279 * @tag_buf:    Pointer to a buffer for the tag data
 280 * @len:        Length of the target buffer
 281 *
 282 * Description: Use this function to retrieve the tag buffer from a
 283 * completed I/O. The size of the integrity buffer must be <= to the
 284 * size reported by bio_integrity_tag_size().
 285 */
 286int bio_integrity_get_tag(struct bio *bio, void *tag_buf, unsigned int len)
 287{
 288        BUG_ON(bio_data_dir(bio) != READ);
 289
 290        return bio_integrity_tag(bio, tag_buf, len, 0);
 291}
 292EXPORT_SYMBOL(bio_integrity_get_tag);
 293
 294/**
 295 * bio_integrity_generate - Generate integrity metadata for a bio
 296 * @bio:        bio to generate integrity metadata for
 297 *
 298 * Description: Generates integrity metadata for a bio by calling the
 299 * block device's generation callback function.  The bio must have a
 300 * bip attached with enough room to accommodate the generated
 301 * integrity metadata.
 302 */
 303static void bio_integrity_generate(struct bio *bio)
 304{
 305        struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
 306        struct blk_integrity_exchg bix;
 307        struct bio_vec *bv;
 308        sector_t sector = bio->bi_sector;
 309        unsigned int i, sectors, total;
 310        void *prot_buf = bio->bi_integrity->bip_buf;
 311
 312        total = 0;
 313        bix.disk_name = bio->bi_bdev->bd_disk->disk_name;
 314        bix.sector_size = bi->sector_size;
 315
 316        bio_for_each_segment(bv, bio, i) {
 317                void *kaddr = kmap_atomic(bv->bv_page, KM_USER0);
 318                bix.data_buf = kaddr + bv->bv_offset;
 319                bix.data_size = bv->bv_len;
 320                bix.prot_buf = prot_buf;
 321                bix.sector = sector;
 322
 323                bi->generate_fn(&bix);
 324
 325                sectors = bv->bv_len / bi->sector_size;
 326                sector += sectors;
 327                prot_buf += sectors * bi->tuple_size;
 328                total += sectors * bi->tuple_size;
 329                BUG_ON(total > bio->bi_integrity->bip_size);
 330
 331                kunmap_atomic(kaddr, KM_USER0);
 332        }
 333}
 334
 335static inline unsigned short blk_integrity_tuple_size(struct blk_integrity *bi)
 336{
 337        if (bi)
 338                return bi->tuple_size;
 339
 340        return 0;
 341}
 342
 343/**
 344 * bio_integrity_prep - Prepare bio for integrity I/O
 345 * @bio:        bio to prepare
 346 *
 347 * Description: Allocates a buffer for integrity metadata, maps the
 348 * pages and attaches them to a bio.  The bio must have data
 349 * direction, target device and start sector set priot to calling.  In
 350 * the WRITE case, integrity metadata will be generated using the
 351 * block device's integrity function.  In the READ case, the buffer
 352 * will be prepared for DMA and a suitable end_io handler set up.
 353 */
 354int bio_integrity_prep(struct bio *bio)
 355{
 356        struct bio_integrity_payload *bip;
 357        struct blk_integrity *bi;
 358        struct request_queue *q;
 359        void *buf;
 360        unsigned long start, end;
 361        unsigned int len, nr_pages;
 362        unsigned int bytes, offset, i;
 363        unsigned int sectors;
 364
 365        bi = bdev_get_integrity(bio->bi_bdev);
 366        q = bdev_get_queue(bio->bi_bdev);
 367        BUG_ON(bi == NULL);
 368        BUG_ON(bio_integrity(bio));
 369
 370        sectors = bio_integrity_hw_sectors(bi, bio_sectors(bio));
 371
 372        /* Allocate kernel buffer for protection data */
 373        len = sectors * blk_integrity_tuple_size(bi);
 374        buf = kmalloc(len, GFP_NOIO | __GFP_NOFAIL | q->bounce_gfp);
 375        if (unlikely(buf == NULL)) {
 376                printk(KERN_ERR "could not allocate integrity buffer\n");
 377                return -EIO;
 378        }
 379
 380        end = (((unsigned long) buf) + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
 381        start = ((unsigned long) buf) >> PAGE_SHIFT;
 382        nr_pages = end - start;
 383
 384        /* Allocate bio integrity payload and integrity vectors */
 385        bip = bio_integrity_alloc(bio, GFP_NOIO, nr_pages);
 386        if (unlikely(bip == NULL)) {
 387                printk(KERN_ERR "could not allocate data integrity bioset\n");
 388                kfree(buf);
 389                return -EIO;
 390        }
 391
 392        bip->bip_buf = buf;
 393        bip->bip_size = len;
 394        bip->bip_sector = bio->bi_sector;
 395
 396        /* Map it */
 397        offset = offset_in_page(buf);
 398        for (i = 0 ; i < nr_pages ; i++) {
 399                int ret;
 400                bytes = PAGE_SIZE - offset;
 401
 402                if (len <= 0)
 403                        break;
 404
 405                if (bytes > len)
 406                        bytes = len;
 407
 408                ret = bio_integrity_add_page(bio, virt_to_page(buf),
 409                                             bytes, offset);
 410
 411                if (ret == 0)
 412                        return 0;
 413
 414                if (ret < bytes)
 415                        break;
 416
 417                buf += bytes;
 418                len -= bytes;
 419                offset = 0;
 420        }
 421
 422        /* Install custom I/O completion handler if read verify is enabled */
 423        if (bio_data_dir(bio) == READ) {
 424                bip->bip_end_io = bio->bi_end_io;
 425                bio->bi_end_io = bio_integrity_endio;
 426        }
 427
 428        /* Auto-generate integrity metadata if this is a write */
 429        if (bio_data_dir(bio) == WRITE)
 430                bio_integrity_generate(bio);
 431
 432        return 0;
 433}
 434EXPORT_SYMBOL(bio_integrity_prep);
 435
 436/**
 437 * bio_integrity_verify - Verify integrity metadata for a bio
 438 * @bio:        bio to verify
 439 *
 440 * Description: This function is called to verify the integrity of a
 441 * bio.  The data in the bio io_vec is compared to the integrity
 442 * metadata returned by the HBA.
 443 */
 444static int bio_integrity_verify(struct bio *bio)
 445{
 446        struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
 447        struct blk_integrity_exchg bix;
 448        struct bio_vec *bv;
 449        sector_t sector = bio->bi_integrity->bip_sector;
 450        unsigned int i, sectors, total, ret;
 451        void *prot_buf = bio->bi_integrity->bip_buf;
 452
 453        ret = total = 0;
 454        bix.disk_name = bio->bi_bdev->bd_disk->disk_name;
 455        bix.sector_size = bi->sector_size;
 456
 457        bio_for_each_segment(bv, bio, i) {
 458                void *kaddr = kmap_atomic(bv->bv_page, KM_USER0);
 459                bix.data_buf = kaddr + bv->bv_offset;
 460                bix.data_size = bv->bv_len;
 461                bix.prot_buf = prot_buf;
 462                bix.sector = sector;
 463
 464                ret = bi->verify_fn(&bix);
 465
 466                if (ret) {
 467                        kunmap_atomic(kaddr, KM_USER0);
 468                        break;
 469                }
 470
 471                sectors = bv->bv_len / bi->sector_size;
 472                sector += sectors;
 473                prot_buf += sectors * bi->tuple_size;
 474                total += sectors * bi->tuple_size;
 475                BUG_ON(total > bio->bi_integrity->bip_size);
 476
 477                kunmap_atomic(kaddr, KM_USER0);
 478        }
 479
 480        return ret;
 481}
 482
 483/**
 484 * bio_integrity_verify_fn - Integrity I/O completion worker
 485 * @work:       Work struct stored in bio to be verified
 486 *
 487 * Description: This workqueue function is called to complete a READ
 488 * request.  The function verifies the transferred integrity metadata
 489 * and then calls the original bio end_io function.
 490 */
 491static void bio_integrity_verify_fn(struct work_struct *work)
 492{
 493        struct bio_integrity_payload *bip =
 494                container_of(work, struct bio_integrity_payload, bip_work);
 495        struct bio *bio = bip->bip_bio;
 496        int error = bip->bip_error;
 497
 498        if (bio_integrity_verify(bio)) {
 499                clear_bit(BIO_UPTODATE, &bio->bi_flags);
 500                error = -EIO;
 501        }
 502
 503        /* Restore original bio completion handler */
 504        bio->bi_end_io = bip->bip_end_io;
 505
 506        if (bio->bi_end_io)
 507                bio->bi_end_io(bio, error);
 508}
 509
 510/**
 511 * bio_integrity_endio - Integrity I/O completion function
 512 * @bio:        Protected bio
 513 * @error:      Pointer to errno
 514 *
 515 * Description: Completion for integrity I/O
 516 *
 517 * Normally I/O completion is done in interrupt context.  However,
 518 * verifying I/O integrity is a time-consuming task which must be run
 519 * in process context.  This function postpones completion
 520 * accordingly.
 521 */
 522void bio_integrity_endio(struct bio *bio, int error)
 523{
 524        struct bio_integrity_payload *bip = bio->bi_integrity;
 525
 526        BUG_ON(bip->bip_bio != bio);
 527
 528        bip->bip_error = error;
 529        INIT_WORK(&bip->bip_work, bio_integrity_verify_fn);
 530        queue_work(kintegrityd_wq, &bip->bip_work);
 531}
 532EXPORT_SYMBOL(bio_integrity_endio);
 533
 534/**
 535 * bio_integrity_mark_head - Advance bip_vec skip bytes
 536 * @bip:        Integrity vector to advance
 537 * @skip:       Number of bytes to advance it
 538 */
 539void bio_integrity_mark_head(struct bio_integrity_payload *bip,
 540                             unsigned int skip)
 541{
 542        struct bio_vec *iv;
 543        unsigned int i;
 544
 545        bip_for_each_vec(iv, bip, i) {
 546                if (skip == 0) {
 547                        bip->bip_idx = i;
 548                        return;
 549                } else if (skip >= iv->bv_len) {
 550                        skip -= iv->bv_len;
 551                } else { /* skip < iv->bv_len) */
 552                        iv->bv_offset += skip;
 553                        iv->bv_len -= skip;
 554                        bip->bip_idx = i;
 555                        return;
 556                }
 557        }
 558}
 559
 560/**
 561 * bio_integrity_mark_tail - Truncate bip_vec to be len bytes long
 562 * @bip:        Integrity vector to truncate
 563 * @len:        New length of integrity vector
 564 */
 565void bio_integrity_mark_tail(struct bio_integrity_payload *bip,
 566                             unsigned int len)
 567{
 568        struct bio_vec *iv;
 569        unsigned int i;
 570
 571        bip_for_each_vec(iv, bip, i) {
 572                if (len == 0) {
 573                        bip->bip_vcnt = i;
 574                        return;
 575                } else if (len >= iv->bv_len) {
 576                        len -= iv->bv_len;
 577                } else { /* len < iv->bv_len) */
 578                        iv->bv_len = len;
 579                        len = 0;
 580                }
 581        }
 582}
 583
 584/**
 585 * bio_integrity_advance - Advance integrity vector
 586 * @bio:        bio whose integrity vector to update
 587 * @bytes_done: number of data bytes that have been completed
 588 *
 589 * Description: This function calculates how many integrity bytes the
 590 * number of completed data bytes correspond to and advances the
 591 * integrity vector accordingly.
 592 */
 593void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
 594{
 595        struct bio_integrity_payload *bip = bio->bi_integrity;
 596        struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
 597        unsigned int nr_sectors;
 598
 599        BUG_ON(bip == NULL);
 600        BUG_ON(bi == NULL);
 601
 602        nr_sectors = bio_integrity_hw_sectors(bi, bytes_done >> 9);
 603        bio_integrity_mark_head(bip, nr_sectors * bi->tuple_size);
 604}
 605EXPORT_SYMBOL(bio_integrity_advance);
 606
 607/**
 608 * bio_integrity_trim - Trim integrity vector
 609 * @bio:        bio whose integrity vector to update
 610 * @offset:     offset to first data sector
 611 * @sectors:    number of data sectors
 612 *
 613 * Description: Used to trim the integrity vector in a cloned bio.
 614 * The ivec will be advanced corresponding to 'offset' data sectors
 615 * and the length will be truncated corresponding to 'len' data
 616 * sectors.
 617 */
 618void bio_integrity_trim(struct bio *bio, unsigned int offset,
 619                        unsigned int sectors)
 620{
 621        struct bio_integrity_payload *bip = bio->bi_integrity;
 622        struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
 623        unsigned int nr_sectors;
 624
 625        BUG_ON(bip == NULL);
 626        BUG_ON(bi == NULL);
 627        BUG_ON(!bio_flagged(bio, BIO_CLONED));
 628
 629        nr_sectors = bio_integrity_hw_sectors(bi, sectors);
 630        bip->bip_sector = bip->bip_sector + offset;
 631        bio_integrity_mark_head(bip, offset * bi->tuple_size);
 632        bio_integrity_mark_tail(bip, sectors * bi->tuple_size);
 633}
 634EXPORT_SYMBOL(bio_integrity_trim);
 635
 636/**
 637 * bio_integrity_split - Split integrity metadata
 638 * @bio:        Protected bio
 639 * @bp:         Resulting bio_pair
 640 * @sectors:    Offset
 641 *
 642 * Description: Splits an integrity page into a bio_pair.
 643 */
 644void bio_integrity_split(struct bio *bio, struct bio_pair *bp, int sectors)
 645{
 646        struct blk_integrity *bi;
 647        struct bio_integrity_payload *bip = bio->bi_integrity;
 648        unsigned int nr_sectors;
 649
 650        if (bio_integrity(bio) == 0)
 651                return;
 652
 653        bi = bdev_get_integrity(bio->bi_bdev);
 654        BUG_ON(bi == NULL);
 655        BUG_ON(bip->bip_vcnt != 1);
 656
 657        nr_sectors = bio_integrity_hw_sectors(bi, sectors);
 658
 659        bp->bio1.bi_integrity = &bp->bip1;
 660        bp->bio2.bi_integrity = &bp->bip2;
 661
 662        bp->iv1 = bip->bip_vec[0];
 663        bp->iv2 = bip->bip_vec[0];
 664
 665        bp->bip1.bip_vec = &bp->iv1;
 666        bp->bip2.bip_vec = &bp->iv2;
 667
 668        bp->iv1.bv_len = sectors * bi->tuple_size;
 669        bp->iv2.bv_offset += sectors * bi->tuple_size;
 670        bp->iv2.bv_len -= sectors * bi->tuple_size;
 671
 672        bp->bip1.bip_sector = bio->bi_integrity->bip_sector;
 673        bp->bip2.bip_sector = bio->bi_integrity->bip_sector + nr_sectors;
 674
 675        bp->bip1.bip_vcnt = bp->bip2.bip_vcnt = 1;
 676        bp->bip1.bip_idx = bp->bip2.bip_idx = 0;
 677}
 678EXPORT_SYMBOL(bio_integrity_split);
 679
 680/**
 681 * bio_integrity_clone - Callback for cloning bios with integrity metadata
 682 * @bio:        New bio
 683 * @bio_src:    Original bio
 684 * @bs:         bio_set to allocate bip from
 685 *
 686 * Description: Called to allocate a bip when cloning a bio
 687 */
 688int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
 689                        struct bio_set *bs)
 690{
 691        struct bio_integrity_payload *bip_src = bio_src->bi_integrity;
 692        struct bio_integrity_payload *bip;
 693
 694        BUG_ON(bip_src == NULL);
 695
 696        bip = bio_integrity_alloc_bioset(bio, GFP_NOIO, bip_src->bip_vcnt, bs);
 697
 698        if (bip == NULL)
 699                return -EIO;
 700
 701        memcpy(bip->bip_vec, bip_src->bip_vec,
 702               bip_src->bip_vcnt * sizeof(struct bio_vec));
 703
 704        bip->bip_sector = bip_src->bip_sector;
 705        bip->bip_vcnt = bip_src->bip_vcnt;
 706        bip->bip_idx = bip_src->bip_idx;
 707
 708        return 0;
 709}
 710EXPORT_SYMBOL(bio_integrity_clone);
 711
 712int bioset_integrity_create(struct bio_set *bs, int pool_size)
 713{
 714        bs->bio_integrity_pool = mempool_create_slab_pool(pool_size,
 715                                                          bio_integrity_slab);
 716        if (!bs->bio_integrity_pool)
 717                return -1;
 718
 719        return 0;
 720}
 721EXPORT_SYMBOL(bioset_integrity_create);
 722
 723void bioset_integrity_free(struct bio_set *bs)
 724{
 725        if (bs->bio_integrity_pool)
 726                mempool_destroy(bs->bio_integrity_pool);
 727}
 728EXPORT_SYMBOL(bioset_integrity_free);
 729
 730void __init bio_integrity_init_slab(void)
 731{
 732        bio_integrity_slab = KMEM_CACHE(bio_integrity_payload,
 733                                        SLAB_HWCACHE_ALIGN|SLAB_PANIC);
 734}
 735
 736static int __init integrity_init(void)
 737{
 738        kintegrityd_wq = create_workqueue("kintegrityd");
 739
 740        if (!kintegrityd_wq)
 741                panic("Failed to create kintegrityd\n");
 742
 743        return 0;
 744}
 745subsys_initcall(integrity_init);
 746
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.