免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1289 | 回复: 3

[文件系统] 调试两天无法解决的问题,各位大神帮一下忙 [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
发表于 2016-04-18 10:31 |显示全部楼层
问题是我在创建一个 struct dentry 的过程中,一个 bit 设置不对引起的.
源码如下: /fs/dcache.c
static void __d_rehash(struct dentry * entry, struct dcache_hash_bucket *b)
{
        BUG_ON(!d_unhashed(entry));
        spin_lock_bucket(b);
        entry->d_flags &= ~DCACHE_UNHASHED;
        hlist_bl_add_head_rcu(&entry->d_hash, &b->head);
        spin_unlock_bucket(b);
}

static void _d_rehash(struct dentry * entry)
{
        __d_rehash(entry, d_hash(entry->d_parent, entry->d_name.hash));
}

1. 如上面的源码所示,调用 _d_rehash() 时候,使用 d_hash() 函数获得了 dcache_hashtable 的入口,
    此时,入口类型为 struct dcache_hash_bucket,此时其成员 head.first 的值为 NULL.
2. 接着调用 __d_rehash() 经常 spin_lock_bucket(b) 处理之后, head.first 的值的最低位被值位,为 0x00000001.
    问题来了,由于这样的操作,导致 head.first 的不为 NULL,在接下来的处理过程中
    hlist_bl_add_head_rcu(&entry->d_hash, &b->head);
   
    其源码如下:
   static inline void hlist_bl_add_head_rcu(struct hlist_bl_node *n,
                                        struct hlist_bl_head *h)
{
        struct hlist_bl_node *first;

        /* don't need hlist_bl_first_rcu because we're under lock */
        first = hlist_bl_first(h);

        n->next = first;
        if (first)
                first->pprev = &n->next;
        n->pprev = &h->first;

        /* need _rcu because we can have concurrent lock free readers */
        hlist_bl_set_first_rcu(h, n);
}
   如上诉,first 的值为 1,但此时判断 first 不为 NULL 之后就对该指针进行操作,就导致系统崩溃.

这个问题该如何解释,请大神给建议.

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-04-18 11:36 |显示全部楼层
hlist_bl 是不是利用ptr的最bit低位作为lock用?

那样的话,加锁就不能是spin-lock,而使用相关的hlist_bl版本(hlist_bl_lock)?

或者hlist_bl的first函数,在返回的时候应该忽略bit位。
  1. static inline struct hlist_bl_node *hlist_bl_first(struct hlist_bl_head *h)
  2. {
  3.         return (struct hlist_bl_node *)
  4.                 ((unsigned long)h->first & ~LIST_BL_LOCKMASK);
  5. }
复制代码

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
发表于 2016-04-18 15:37 |显示全部楼层
回复 2# nswcfd


    谢谢,根据您的建议,我找到问题的出错点了

static inline struct hlist_bl_node *hlist_bl_first(struct hlist_bl_head *h)
{
        return (struct hlist_bl_node *)
                ((unsigned long)h->first & ~LIST_BL_LOCKMASK);
}

LIST_BL_LOCKMASK 的定义有两种,因为打开了 BIT_SPINLOCK 的宏,
所以 #define LIST_BL_LOCKMASK 1UL
之前定义为 :
#define LIST_BL_LOCKMASK 0UL


特别感谢您

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-04-22 10:21 |显示全部楼层
hehe,不用客气。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP