免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2063 | 回复: 7
打印 上一主题 下一主题

patch btrfs v-0.16 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-29 10:18 |只看该作者 |倒序浏览

  1. struct btrfs_root *btrfs_lookup_fs_root(struct btrfs_fs_info *fs_info,
  2.                                         u64 root_objectid)
  3. {
  4.         struct btrfs_root *root;

  5.         if (root_objectid == BTRFS_ROOT_TREE_OBJECTID)
  6.                 return fs_info->tree_root;
  7.         if (root_objectid == BTRFS_EXTENT_TREE_OBJECTID)
  8.                 return fs_info->extent_root;

  9. -        root = radix_tree_lookup(&fs_info->fs_roots_radix,
  10. -                                 (unsigned long)root_objectid);
  11. +        root = NULL;
  12. +        if (! radix_tree_preload(GFP_NOIO)) {
  13. +                root = radix_tree_lookup(&fs_info->fs_roots_radix,
  14. +                                 (unsigned long)root_objectid);
  15. +                radix_tree_preload_end();
  16. +        }
  17.         return root;
  18. }
复制代码

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2009-11-29 10:22 |只看该作者

回复 #1 rtable 的帖子

这个是解决什么问题的?

论坛徽章:
0
3 [报告]
发表于 2009-11-29 10:24 |只看该作者

  1. struct btrfs_root *btrfs_read_fs_root_no_name(struct btrfs_fs_info *fs_info,
  2.                                               struct btrfs_key *location)
  3. {
  4.         struct btrfs_root *root;
  5.         int ret;

  6.         if (location->objectid == BTRFS_ROOT_TREE_OBJECTID)
  7.                 return fs_info->tree_root;
  8.         if (location->objectid == BTRFS_EXTENT_TREE_OBJECTID)
  9.                 return fs_info->extent_root;
  10.         if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID)
  11.                 return fs_info->chunk_root;
  12.         if (location->objectid == BTRFS_DEV_TREE_OBJECTID)
  13.                 return fs_info->dev_root;
  14.         if (location->objectid == BTRFS_CSUM_TREE_OBJECTID)
  15.                 return fs_info->csum_root;

  16. +        if (radix_tree_preload(GFP_NOIO))
  17. +                return NULL;
  18. +
  19.         root = radix_tree_lookup(&fs_info->fs_roots_radix,
  20.                                  (unsigned long)location->objectid);
  21. -        if (root)
  22. -                return root;
  23. +        if (root) {
  24. +                radix_tree_preload_end();
  25. +                return root;
  26. +        }
  27.         root = btrfs_read_fs_root_no_radix(fs_info->tree_root, location);
  28. -        if (IS_ERR(root))
  29. -                return root;
  30. +        if (IS_ERR(root)) {
  31. +                radix_tree_preload_end();
  32. +                return root;
  33. +        }
  34.         set_anon_super(&root->anon_super, NULL);

  35.         ret = radix_tree_insert(&fs_info->fs_roots_radix,
  36.                                 (unsigned long)root->root_key.objectid,
  37.                                 root);
  38.         if (ret) {
  39. +                radix_tree_preload_end();
  40.                 free_extent_buffer(root->node);
  41.                 kfree(root);
  42.                 return ERR_PTR(ret);
  43.         }
  44.         if (!(fs_info->sb->s_flags & MS_RDONLY)) {
  45.                 ret = btrfs_find_dead_roots(fs_info->tree_root,
  46.                                             root->root_key.objectid);
  47.                 BUG_ON(ret);
  48.                 btrfs_orphan_cleanup(root);
  49.         }
  50. +        radix_tree_preload_end();
  51.         return root;
  52. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-11-29 11:49 |只看该作者

  1. int btrfs_bio_wq_end_io(struct btrfs_fs_info *info, struct bio *bio,
  2.                                                 int metadata)
  3. {
  4.         struct end_io_wq *end_io_wq;
  5. +        //TODO: replace kmalloc with kmem_cache_alloc
  6.         end_io_wq = kmalloc(sizeof(*end_io_wq), GFP_NOFS);
  7.         if (!end_io_wq)
  8.                 return -ENOMEM;

  9.         end_io_wq->private = bio->bi_private;
  10.         end_io_wq->end_io = bio->bi_end_io;
  11.         end_io_wq->info = info;
  12.         end_io_wq->error = 0;
  13.         end_io_wq->bio = bio;
  14.         end_io_wq->metadata = metadata;

  15.         bio->bi_private = end_io_wq;
  16.         bio->bi_end_io  = end_workqueue_bio;
  17.         return 0;
  18. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-11-29 11:55 |只看该作者

  1. static void run_one_async_start(struct btrfs_work *work)
  2. {
  3. -        struct btrfs_fs_info *fs_info;
  4.         struct async_submit_bio *async;

  5.         async = container_of(work, struct async_submit_bio, work);
  6. -        fs_info = BTRFS_I(async->inode)->root->fs_info;

  7.         async->submit_bio_start(async->inode, async->rw, async->bio,
  8.                                                async->mirror_num, async->bio_flags);
  9. }
复制代码

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
6 [报告]
发表于 2009-11-29 13:49 |只看该作者
这个是解决什么问题的?加了什么功能呢?

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
7 [报告]
发表于 2009-11-29 14:22 |只看该作者
LZ貌似喜欢贴patch
不过希望LZ能描述一下如何发现的这个问题,如何解决的
最好能把思路什么的分享一下
这样我等新手可以学习一下
毕竟加入kernel社区方法是比较重要的

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
8 [报告]
发表于 2009-11-30 11:10 |只看该作者

看来楼主已经潜水了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP