*/
  static void end_bio_extent_writepage(struct bio *bio, int err)
  {
 -      struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
 +      struct bio_vec *bvec;
-       struct extent_io_tree *tree;
        u64 start;
        u64 end;
 +      int i;
  
 -      do {
 +      bio_for_each_segment_all(bvec, bio, i) {
                struct page *page = bvec->bv_page;
-               tree = &BTRFS_I(page->mapping->host)->io_tree;
  
                /* We always issue full-page reads, but if some block
                 * in a page fails to read, blk_update_request() will
 
        struct btrfs_dio_private *dip = bio->bi_private;
  
        if (err) {
-               printk(KERN_ERR "btrfs direct IO failed ino %llu rw %lu "
-                     "sector %#Lx len %u err no %d\n",
+               btrfs_err(BTRFS_I(dip->inode)->root->fs_info,
+                         "direct IO failed ino %llu rw %lu sector %#Lx len %u err no %d",
                      btrfs_ino(dip->inode), bio->bi_rw,
 -                    (unsigned long long)bio->bi_sector, bio->bi_size, err);
 +                    (unsigned long long)bio->bi_iter.bi_sector,
 +                    bio->bi_iter.bi_size, err);
                dip->errors = 1;
  
                /*
 
        .show   = kobj_attr_show,
        .store  = kobj_attr_store,
  };
+ EXPORT_SYMBOL_GPL(kobj_sysfs_ops);
  
 -/**
 - * kobj_completion_init - initialize a kobj_completion object.
 - * @kc: kobj_completion
 - * @ktype: type of kobject to initialize
 - *
 - * kobj_completion structures can be embedded within structures with different
 - * lifetime rules.  During the release of the enclosing object, we can
 - * wait on the release of the kobject so that we don't free it while it's
 - * still busy.
 - */
 -void kobj_completion_init(struct kobj_completion *kc, struct kobj_type *ktype)
 -{
 -      init_completion(&kc->kc_unregister);
 -      kobject_init(&kc->kc_kobj, ktype);
 -}
 -EXPORT_SYMBOL_GPL(kobj_completion_init);
 -
 -/**
 - * kobj_completion_release - release a kobj_completion object
 - * @kobj: kobject embedded in kobj_completion
 - *
 - * Used with kobject_release to notify waiters that the kobject has been
 - * released.
 - */
 -void kobj_completion_release(struct kobject *kobj)
 -{
 -      struct kobj_completion *kc = kobj_to_kobj_completion(kobj);
 -      complete(&kc->kc_unregister);
 -}
 -EXPORT_SYMBOL_GPL(kobj_completion_release);
 -
 -/**
 - * kobj_completion_del_and_wait - release the kobject and wait for it
 - * @kc: kobj_completion object to release
 - *
 - * Delete the kobject from sysfs and drop the reference count.  Then wait
 - * until any other outstanding references are also dropped.  This routine
 - * is only necessary once other references may have been taken on the
 - * kobject.  Typically this happens when the kobject has been published
 - * to sysfs via kobject_add.
 - */
 -void kobj_completion_del_and_wait(struct kobj_completion *kc)
 -{
 -      kobject_del(&kc->kc_kobj);
 -      kobject_put(&kc->kc_kobj);
 -      wait_for_completion(&kc->kc_unregister);
 -}
 -EXPORT_SYMBOL_GPL(kobj_completion_del_and_wait);
 -
  /**
   * kset_register - initialize and add a kset.
   * @k: kset.