[PATCH v2] dax: fix NULL pointer in __dax_pmd_fault()
by Ross Zwisler
The following commit:
commit 46c043ede471 ("mm: take i_mmap_lock in unmap_mapping_range() for
DAX")
moved some code in __dax_pmd_fault() that was responsible for zeroing
newly allocated PMD pages. The new location didn't properly set up
'kaddr', though, so when run this code resulted in a NULL pointer BUG.
Fix this by getting the correct 'kaddr' via bdev_direct_access().
Signed-off-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Reported-by: Dan Williams <dan.j.williams(a)intel.com>
---
fs/dax.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/fs/dax.c b/fs/dax.c
index 7ae6df7..bcfb14b 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -569,8 +569,20 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
if (!buffer_size_valid(&bh) || bh.b_size < PMD_SIZE)
goto fallback;
+ sector = bh.b_blocknr << (blkbits - 9);
+
if (buffer_unwritten(&bh) || buffer_new(&bh)) {
int i;
+
+ length = bdev_direct_access(bh.b_bdev, sector, &kaddr, &pfn,
+ bh.b_size);
+ if (length < 0) {
+ result = VM_FAULT_SIGBUS;
+ goto out;
+ }
+ if ((length < PMD_SIZE) || (pfn & PG_PMD_COLOUR))
+ goto fallback;
+
for (i = 0; i < PTRS_PER_PMD; i++)
clear_pmem(kaddr + i * PAGE_SIZE, PAGE_SIZE);
wmb_pmem();
@@ -623,7 +635,6 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
result = VM_FAULT_NOPAGE;
spin_unlock(ptl);
} else {
- sector = bh.b_blocknr << (blkbits - 9);
length = bdev_direct_access(bh.b_bdev, sector, &kaddr, &pfn,
bh.b_size);
if (length < 0) {
--
2.1.0
5 years, 3 months
范总的三个问题
by 范澜韵
gohvktmtribarm2n3tykdry9fdlpqm
5 years, 3 months
linux-nvdimm:劳动纠纷
by 訾毅柏
438wd
"新《劳动合同法》、《社会保险法》、《工伤保险条例》
实操应对策略与有效调岗调薪、裁员解雇及违纪问题员
工处理技巧"
【时间地点】 10月23-24日上海(B单元)、10月30-31日北京(B单元)、11月6-7日深圳(B单元)、11月13-14日广州(A单元)、11月20-21日上海(A单元)、11月27-28日北京(A单元)、12月4-5日深圳(A单元)、12月11-12日广州(B单元)、12月18-19日上海(B单元)、12月25-26日北京(B单元)、12月30-31日深圳(B单元)
注明:该课程2天为一个单元,A单元与B单元内容是完全独立的不分先后顺序,客户可根据自己需求选择参
加A单元或者B单元,或AB单元均参加,可以参加完A单元再参加B单元或者先参加B单元再参加A单元均可,A
单元与B单元内容请看下面的课程大纲!!!
【参加对象】 董事长、总经理、副总经理、人力资源总监/经理/专员及人事行政管理人员、工会干部、法
务人员及相关管理人员、相关律师等。
【授课方式】 讲师讲授 + 视频演绎 + 案例研讨 +角色扮演 + 讲师点评
【学习费用】 参加A单元:2800元/1人,5000元/2人;参加B单元:2800元/1人,5000元/2人
参加AB单元:5000元/人,(含课程讲义、午餐、茶点等)
【值班手机】0512-68700653 (0)18015596327
课程背景:
2008年,国家出台了《劳动合同法》、《劳动合同法实施条例》、《劳动争议调解仲裁法》、《职工带
薪年休假条例》、《企业职工带薪年休假实施办法》;2009年,国家出台了《劳动人事争议仲裁办案规则》
;2010年,国家出台了《劳动争议司法解释(三)》及修改了《工伤保险条例》;2011年,国家出台了《社
会保险法》及《实施<社会保险法>若干规定》;2012年,国家出台了《企业民主管理规定》、《女职工劳动
保护特别规定》及修改了《职业病防治法》;2013年,国家出台了《劳动争议司法解释(四)》、《劳务派
遣若干规定》;2014年……
上述法律法规政策的持续实施,客观上要求企业精打细算,否则无法承受与日俱增的用工成本;客观上
要求用人单位做到“精细化”管理,否则难以证明劳动者“不合格、不胜任、严重失职、严重违纪违规”,
也难以进行合法有效的“调岗调薪、裁员解雇”。如果用人单位依然实施“传统式、粗放式、随便式”的管
理,那么用人单位必将面临巨大的用工风险和赔偿责任,其管理权威也将受到严峻的挑战!
为帮助广大企事业单位了解相关政策法律法规,掌握防范用工风险和化解劳动争议的技能技巧,以实现
低风险、低成本、高绩效的人力资源管理目标,特邀请我国知名的劳动法与员工关系管理实战专家钟永棣老
师主讲此课程。欢迎企事业单位积极组织相关人员参加此培训课程!
培训收益:
1、全面了解劳动用工过程的法律风险;
2、理解与劳动用工有关的政策法律法规;
3、培养预测、分析劳动用工法律风险的思维;
4、掌握预防和应对风险的实战技能及方法工具……
课程特色:
稀缺性:此课程将劳动法体系和薪酬绩效管理体系紧密相结合,国内极少出现此类课程。
针对性:课程内容精选了过去5年来主讲老师亲自处理过的且在不少用人单位内部也曾发生过的代表性案例
,这些案例完全符合中国现阶段的大环境大气候,极具参考性和启发性。
实战性:实战沙盘演练,学员深入思考与充分互动,老师毫不保留倾囊相授;学员把错误留在课堂,把正确
的观点、方法、工具、技能带回去。
课程大纲:
A单元内容(共2天,15个以上经典案例)
专题一:招聘入职
1.如何预防劳动者的“应聘欺诈”,如何证明劳动者的“欺诈”?
2.招收应届毕业生,应注意哪些细节问题?
3.招用达到法定退休年龄的人员,应注意哪些细节问题?
4.招用待岗、内退、停薪留职的人员,应注意哪些细节问题?
5.入职体检需注意哪些细节问题?
6.入职前后用人单位应告知劳动者哪些情况,如何保留证据?
7.《入职登记表》如何设计,才能起到预防法律风险的作用?
8.劳动者无法提交《离职证明》,该怎么办?
9.企业如何书写《录用通知书》,其法律风险有哪些?
专题二:劳动合同订立
1.用人单位自行拟定的劳动合同文本是否有效,是否需要进行备案?
2.劳动者借故拖延或拒绝签订劳动合同,用人单位如何应对?
3.未签订劳动合同,需支付多长期限的双倍工资?是否受到仲裁时效的限制?
4.劳动合同期满,继续留用劳动者,但未续签合同,是否也需支付双倍工资?
5.什么时候为最佳时间,签署劳动合同、用工协议?
6.法律禁止2次约定试用期,劳动合同期限和试用期限该如何约定?
7.用人单位收购其他组织时,如何与被接收的员工签订、变更劳动合同?
8.应否与属于职业经理人的法人代表签订劳动合同?
专题三:试用期
1.可否先试用后签合同,可否单独签订试用期协议?
2.员工主动申请延长试用期,该怎样操作,才规避赔偿风险?
3.试用期满后辞退员工,最少赔2个月工资,该如何化解?
4.试用期最后一天辞退员工,赔偿概率为70%,如何化解?
5.试用期满前几天辞退员工,赔偿概率为50%,如何化解?
6.不符合录用条件的范围包括哪些,如何取证证明?
7.《试用期辞退通知书》如何书写,以避免违法解除的赔偿金?
8.出现“经济性裁员”情况,优先裁掉试用期的新员工,合法吗?
专题四:无固定期限劳动合同
1.无固定期限劳动合同到底是不是铁饭碗,会不会增加企业成本?
2.无固定期限劳动合同解除的条件、理由有哪些?
3.用人单位拒绝签订无固定期限劳动合同,有何风险?
4.签订了固定期限劳动合同的员工,期间工作累计满10年,能否要求将固定期限合同变更为无固定期限合同
?
5.连续订立二次固定期限劳动合同到期,用人单位能否终止合同;员工提出签订无固定期限合同,用人单位
能否拒绝?
6.合同期满劳动者由于医疗期、三期等原因续延劳动合同导致劳动者连续工作满十年,劳动者提出订立无固
定期限劳动合同的,用人单位能否拒绝?
专题五:特殊用工协议
1.培训服务期与劳动合同期限有何不同,劳动合同期限与服务期限发生冲突时如何适用?
2.培训服务期未到期,而劳动合同到期,用人单位终止劳动合同的,是否属于提前解除劳动合同,如何规避
?
3.劳动者严重过错被解雇,用人单位能否依据服务期约定要求劳动者支付违约金?
4.在什么情况下,可签署竞业限制协议?
5.在什么时候,企业更有主动权签署竞业限制协议?
6.无约定经济补偿的支付,竞业限制是否有效?
7.竞业限制的经济补偿的标准如何界定?
8.要求员工保密,企业需要支付保密工资吗?
专题六:劳动关系解除终止
1.双方协商解除劳动合同并约定支付适当的经济补偿,事后劳动者追讨经济补偿的差额部分,仲裁机构有可
能支持劳动者的诉求,企业如何避免案件败诉?
2.能否与“三期妇女、特殊保护期间的员工”协商解除,如何规避风险?
3.员工未提前30日通知企业即自行离职,企业能否扣减其工资?
4.员工提交辞职信后的30天内,企业批准其离职,可能有风险,如何化解?
5.员工提交辞职信后的30天后,企业批准其离职,也可能有风险,如何化解?
6.对于患病员工,能否解除,如何操作才能降低法律风险?
7.实行末位淘汰制,以末位排名为由解雇员工,往往被认定非法解雇,企业该如何做,才避免案件败诉?
8.以“组织架构调整,无合适岗位安排”为由解雇员工,感觉非常符合常理,但往往被认定非法解雇,企业
该如何做才避免风险?
9.以“经济性裁员”名义解雇员工,感觉非常符合常理,但往往被认定非法解雇,企业该如何操作?
10.《解除劳动合同通知书》如果表述不当,往往成为劳动者打赢官司的有力证据,企业该如何书写,才避
免案件败诉而承担法律责任?
11.解除劳动合同前未通知及征求工会的意见,是否构成非法解除?
12.劳动合同到期后,经常出现该终止的忘记办理终止手续,该续签的忘记办理续签手续,其引发的风险非
常大;那么企业该如何规避风险?
专题七:社会保险法
1.用人单位拖欠社保费,有什么法律责任?
2.用人单位不足额缴纳社会保险如何处理?
3.员工不愿意买社保,并与单位签有协议的情况下,该协议是否有效?
4.试用期间,是否必须缴纳社会保险?
5.如果无参保,劳动者因第三方责任产生的医疗费用,能否要求单位报销?
6.企业协助辞职员工骗取失业保险金,有什么法律风险?
7.女职工未婚先孕、未婚生育争议如何处理?
8.怀孕女职工提出长期休假保胎,直至修完产假,该如何协调此问题?
专题八:劳动争议处理
1.用人单位败诉的原因主要有哪些?
2.仲裁或法院在处理案件时,如何适用法律法规?
3.如何判定政策法律法规的效力等级?
4.公开审理的开庭形式,有何风险,如何避免风险?
5.申请仲裁的时效如何计算;如何理解“劳动争议发生之日”?
6.如何书写答辩书,有哪些注意事项?
7.开庭期间,质证与辩论需要注意哪些关键问题?
8.举证责任如何分配,无法举证的后果有哪些?
B单元内容(共2天,15个以上经典案例)
专题一:绩效管理与岗位调整
1.企业单方调整岗位,员工往往可被迫解除合同并索赔经济补偿,如何规避?
2.调岗时没有书面确认,员工到新岗位工作2个月后能否要求恢复到原岗位?
3.可否对“三期内”女职工进行调岗、调薪?
4.员工认同绩效结果,为什么在“不胜任工作”引发的争议中还是败诉?
5.为什么企业根据绩效结果支付员工绩效奖金,最终被认定非法克扣工资?
6.法律上如何证明劳动者“不能胜任工作”?
7.对绩效考核不合格的员工,如何合法辞退?
8.绩效正态分布往往强制划分5%的员工为不合格者,是否合法?
专题二:劳动报酬、薪酬福利
1.工资总额包括哪些工资明细?
2.新进员工薪资管理问题及处理技巧;
3.调整工作岗位后,可以调整薪资标准吗?
4.如何通过薪酬调整处理员工失职、违纪等问题?
5.值班算不算加班?
6.加班加点工资支付常见误区?
7.用人单位如何设计工资构成以降低加班费成本?
8.未经用人单位安排,劳动者自行加班的,是否需支付加班工资?
9.劳动者主张入职以来的加班费,如何应对?
10.劳动者在工作日\法定节假日加班,能否安排补休而不予支付加班费?
11.病假、年休假、婚假、产假、丧假等的享受条件及工资待遇标准?
12.离职员工往往回头追讨年终奖,有可能得到支持,如何规避该风险?
专题三:违纪违规问题员工处理
1.劳动者往往拒绝签收处分、解雇通知书,如何应对?
2.问题员工往往拒绝提交《检讨书》或否认违纪违规事实,企业该如何收集证据?
3.对于违纪员工,应该在什么时间内处理?
4.怎样理解“严重违反用人单位的规章制度”?
5.如何在《惩罚条例》中描述“一般违纪”、“较重违纪”及“严重违纪”?
6.怎样理解“严重失职,营私舞弊,给用人单位造成重大损害”?
7.如何界定“重大损害”,“重大损害”是否必须体现为造成直接的经济损失?
8.如何追究“严重失职、严重违纪违规”者的法律责任?
9.能否直接规定“禁止兼职,否则视为严重违纪违规”?
10.直线部门经理擅自口头辞退员工,仲裁机构往往认定企业非法解雇,企业该如何做,才避免案件败诉?
11.劳动者不辞而别、无故旷工,却主张被企业口头解雇,往往得到仲裁机构的支持,企业该如何做,才避
免案件败诉?
12.“录音录象”证据,仲裁与法院是否采信;企业内部OA系统上的资料能否作为证据使用;电子邮件、手
机短信能否作为证据使用?
专题四:经济补偿
1.用人单位需向劳动者支付经济补偿的情形有哪些?
2.什么情况下用人单位需支付两倍的经济补偿?
3.劳动者可否同时向用人单位主张经济补偿和赔偿金?
4.经济补偿计算的基数及标准如何确定?
5.经济补偿年限最高不超过十二年的适用范围?
6.如何计算《劳动合同法》生效前后的经济补偿年限?
7.如何理解“六个月以上不满一年的,按一年计算;不满六个月的,向劳动者支付半个月工资的经济补偿”
?
8.劳动合同法环境下“50%额外经济补偿金”是否继续适用?
专题五:规章制度、员工手册
1.企业人力资源管理体系中哪些内容跟劳动法有必然联系?
2.人力资源、劳动用工管理制度应该包括哪些必备内容?
3.制定规章制度的程序要求给用人单位带来哪些风险,如何应对?
4.非国有用人单位如何组建“职工代表大会”?
5.无纸化、网络化办公下的公示,存在哪些风险?
6.如何公示或告知,更符合仲裁或诉讼的举证要求?
7.规章制度能否规定对员工进行经济处罚?
8.规章制度违反法律法规,劳动者可以被迫解除并索取经济补偿,如何防范?
专题六:工伤保险条例
1.属于工伤范围的情形有哪些?
2.不得认定为工伤的情形有哪些?
3.怎样理解“上下班途中”,怎样控制期间的风险?
4.发生工伤事故,用人单位需承担哪些费用?
5.工伤员工借故拒绝复工,借故不断休假,如何处理?
6.对于第三方造成的工伤事故,劳动者能否要求用人单位支付工伤待遇又同时要求第三方支付人身伤害赔偿
?
7.用人单位能否以商业保险理赔款替代职工工伤赔偿待遇?
8.发生工伤事故,双方私下和解,补偿协议该如何签订才有效?
专题七:劳务派遣
1.劳务派遣用工模式,有何利弊,利大还是弊大?
2.劳务派遣合作协议必须注意的风险细节有哪些?
3.新法下劳务派遣面临的主要风险有哪些?
4.派遣工“第三签”时,能否要求签订无固定期限劳动合同?
5.哪些岗位可以使用派遣工,辅助性、临时性、替代性如何理解与操作?
6.新规定对于同工同酬提出哪些新要求,如何规避同工同酬风险?
7.采用劳务派遣用工方式,能否异地参保?
8.用工单位如何行使对派遣员工的退还或退换权?
9.如何处理违反用工单位规章制度的派遣员工?
10.怎样规定派遣员工的辞职程序和离职责任?
11.部分劳务公司很可能面临关闭停业,原来的派遣工的劳动关系如何处理?
12.业务外包与劳务派遣的本质区别有哪些?
13.如何筛选承包方,需考察哪些细节要点?
14.用工单位如何应对派遣合作争议和劳动争议?
1tiswkqnjxtnajtzsdqfehmzdqeze2
5 years, 3 months
[PATCH 1/2] ndctl: add TEST_SKIP constant
by Ross Zwisler
To help with readability, since "77" isn't very informative.
Signed-off-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
---
builtin-test.c | 6 +++---
lib/blk_namespaces.c | 2 +-
lib/pmem_namespaces.c | 2 +-
lib/test-core.c | 4 ++--
lib/test-dpa-alloc.c | 4 ++--
lib/test-libndctl.c | 4 ++--
lib/test-parent-uuid.c | 4 ++--
test.h | 4 ++++
8 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/builtin-test.c b/builtin-test.c
index 9c3b7a8..854984b 100644
--- a/builtin-test.c
+++ b/builtin-test.c
@@ -6,7 +6,7 @@
static char *result(int rc)
{
- if (rc == 77)
+ if (rc == TEST_SKIP)
return "SKIP";
else if (rc)
return "FAIL";
@@ -46,12 +46,12 @@ int cmd_test(int argc, const char **argv)
rc = test_libndctl(loglevel, test);
fprintf(stderr, "test-libndctl: %s\n", result(rc));
- if (rc && rc != 77)
+ if (rc && rc != TEST_SKIP)
return rc;
rc = test_dpa_alloc(loglevel, test);
fprintf(stderr, "test-dpa-alloc: %s\n", result(rc));
- if (rc && rc != 77)
+ if (rc && rc != TEST_SKIP)
return rc;
rc = test_parent_uuid(loglevel, test);
diff --git a/lib/blk_namespaces.c b/lib/blk_namespaces.c
index 968af27..9a07000 100644
--- a/lib/blk_namespaces.c
+++ b/lib/blk_namespaces.c
@@ -227,7 +227,7 @@ int test_blk_namespaces(int log_level)
bus = ndctl_bus_get_by_provider(ctx, provider);
if (!bus) {
fprintf(stderr, "%s: failed to find NFIT-provider\n", comm);
- rc = 77;
+ rc = TEST_SKIP;
goto err_nobus;
} else
fprintf(stderr, "%s: found provider: %s\n", comm,
diff --git a/lib/pmem_namespaces.c b/lib/pmem_namespaces.c
index 17c3019..2fd6e50 100644
--- a/lib/pmem_namespaces.c
+++ b/lib/pmem_namespaces.c
@@ -187,7 +187,7 @@ int test_pmem_namespaces(int log_level)
bus = ndctl_bus_get_by_provider(ctx, provider);
if (!bus) {
fprintf(stderr, "%s: failed to find NFIT-provider\n", comm);
- rc = 77;
+ rc = TEST_SKIP;
goto err;
} else
fprintf(stderr, "%s: found provider: %s\n", comm,
diff --git a/lib/test-core.c b/lib/test-core.c
index 93d02d8..ddf059b 100644
--- a/lib/test-core.c
+++ b/lib/test-core.c
@@ -32,10 +32,10 @@ int ndctl_test_result(struct ndctl_test *test, int rc)
fprintf(stderr, "attempted: %d skipped: %d\n",
ndctl_test_get_attempted(test),
ndctl_test_get_skipped(test));
- if (rc && rc != 77)
+ if (rc && rc != TEST_SKIP)
return rc;
if (ndctl_test_get_skipped(test) >= ndctl_test_get_attempted(test))
- return 77;
+ return TEST_SKIP;
/* return success if no failures and at least one test not skipped */
return 0;
}
diff --git a/lib/test-dpa-alloc.c b/lib/test-dpa-alloc.c
index 6fa88cc..a2ecf94 100644
--- a/lib/test-dpa-alloc.c
+++ b/lib/test-dpa-alloc.c
@@ -298,7 +298,7 @@ int test_dpa_alloc(int loglevel, struct ndctl_test *test)
int err, result = EXIT_FAILURE;
if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 2, 0)))
- return 77;
+ return TEST_SKIP;
err = ndctl_new(&ctx);
if (err < 0)
@@ -317,7 +317,7 @@ int test_dpa_alloc(int loglevel, struct ndctl_test *test)
err = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
NULL, NULL, NULL, NULL);
if (err < 0) {
- result = 77;
+ result = TEST_SKIP;
ndctl_test_skip(test);
fprintf(stderr, "%s unavailable skipping tests\n",
NFIT_TEST_MODULE);
diff --git a/lib/test-libndctl.c b/lib/test-libndctl.c
index 616b0be..88e63e0 100644
--- a/lib/test-libndctl.c
+++ b/lib/test-libndctl.c
@@ -1561,7 +1561,7 @@ int test_libndctl(int loglevel, struct ndctl_test *test)
int err, result = EXIT_FAILURE;
if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 2, 0)))
- return 77;
+ return TEST_SKIP;
err = ndctl_new(&ctx);
if (err < 0)
@@ -1581,7 +1581,7 @@ int test_libndctl(int loglevel, struct ndctl_test *test)
err = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
NULL, NULL, NULL, NULL);
if (err < 0) {
- result = 77;
+ result = TEST_SKIP;
ndctl_test_skip(test);
fprintf(stderr, "%s unavailable skipping tests\n",
NFIT_TEST_MODULE);
diff --git a/lib/test-parent-uuid.c b/lib/test-parent-uuid.c
index 042ea6b..4fd7e1f 100644
--- a/lib/test-parent-uuid.c
+++ b/lib/test-parent-uuid.c
@@ -228,7 +228,7 @@ int test_parent_uuid(int loglevel, struct ndctl_test *test)
int err, result = EXIT_FAILURE;
if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 3, 0)))
- return 77;
+ return TEST_SKIP;
err = ndctl_new(&ctx);
if (err < 0)
@@ -247,7 +247,7 @@ int test_parent_uuid(int loglevel, struct ndctl_test *test)
err = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST,
NULL, NULL, NULL, NULL);
if (err < 0) {
- result = 77;
+ result = TEST_SKIP;
ndctl_test_skip(test);
fprintf(stderr, "%s unavailable skipping tests\n",
NFIT_TEST_MODULE);
diff --git a/test.h b/test.h
index d58dc88..33598bb 100644
--- a/test.h
+++ b/test.h
@@ -1,5 +1,8 @@
#ifndef __TEST_H__
#define __TEST_H__
+
+#define TEST_SKIP 77
+
struct ndctl_test;
struct ndctl_test;
struct ndctl_test *ndctl_test_new(unsigned int kver);
@@ -19,4 +22,5 @@ int test_libndctl(int loglevel, struct ndctl_test *test);
int test_blk_namespaces(int loglevel);
int test_pmem_namespaces(int loglevel);
int test_pcommit(void);
+
#endif /* __TEST_H__ */
--
2.1.0
5 years, 3 months
[PATCH] dax: fix NULL pointer in __dax_pmd_fault()
by Ross Zwisler
The following commit:
commit 46c043ede471 ("mm: take i_mmap_lock in unmap_mapping_range() for
DAX")
moved some code in __dax_pmd_fault() that was responsible for zeroing
newly allocated PMD pages. The new location didn't properly set up
'kaddr', though, so when run this code resulted in a NULL pointer BUG.
Fix this by getting the correct 'kaddr' via bdev_direct_access(), and
only make the second call to bdev_direct_access() if we don't already
have a PFN from the first call.
Signed-off-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Reported-by: Dan Williams <dan.j.williams(a)intel.com>
---
fs/dax.c | 31 ++++++++++++++++++++++---------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index 7ae6df7..08ac2bd 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -532,7 +532,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
void __pmem *kaddr;
pgoff_t size, pgoff;
sector_t block, sector;
- unsigned long pfn;
+ unsigned long pfn = 0;
int result = 0;
/* Fall back to PTEs if we're going to COW */
@@ -569,8 +569,20 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
if (!buffer_size_valid(&bh) || bh.b_size < PMD_SIZE)
goto fallback;
+ sector = bh.b_blocknr << (blkbits - 9);
+
if (buffer_unwritten(&bh) || buffer_new(&bh)) {
int i;
+
+ length = bdev_direct_access(bh.b_bdev, sector, &kaddr, &pfn,
+ bh.b_size);
+ if (length < 0) {
+ result = VM_FAULT_SIGBUS;
+ goto out;
+ }
+ if ((length < PMD_SIZE) || (pfn & PG_PMD_COLOUR))
+ goto fallback;
+
for (i = 0; i < PTRS_PER_PMD; i++)
clear_pmem(kaddr + i * PAGE_SIZE, PAGE_SIZE);
wmb_pmem();
@@ -623,15 +635,16 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
result = VM_FAULT_NOPAGE;
spin_unlock(ptl);
} else {
- sector = bh.b_blocknr << (blkbits - 9);
- length = bdev_direct_access(bh.b_bdev, sector, &kaddr, &pfn,
- bh.b_size);
- if (length < 0) {
- result = VM_FAULT_SIGBUS;
- goto out;
+ if (pfn == 0) {
+ length = bdev_direct_access(bh.b_bdev, sector, &kaddr,
+ &pfn, bh.b_size);
+ if (length < 0) {
+ result = VM_FAULT_SIGBUS;
+ goto out;
+ }
+ if ((length < PMD_SIZE) || (pfn & PG_PMD_COLOUR))
+ goto fallback;
}
- if ((length < PMD_SIZE) || (pfn & PG_PMD_COLOUR))
- goto fallback;
result |= vmf_insert_pfn_pmd(vma, address, pmd, pfn, write);
}
--
2.1.0
5 years, 3 months
Non Drop Cheap followers
by Twitter Followers
Twitter is one of the most popular social networks
platforms and with no doubt the largest in its kind.
If you are running a website / business the chances
you have an active account are big.
The rule is simple, the more followers you have,
the bigger and trusted you are.
We offer this service very cheap,
starting at 6$ for 5000 followers
http://www.buysocial.cn/detail.php?id=17
Unsubscribe option is available on the footer of our website
5 years, 3 months
[GIT PULL] libnvdimm fixes for 4.3-rc2
by Williams, Dan J
Hi Linus, please pull from:
git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm libnvdimm-fixes
...to receive:
1/ A boot regression (since v4.2) fix for some ARM configurations from
Tyler
2/ Regression (since v4.1) fixes for mkfs.xfs on a DAX enabled device
from Jeff. These are tagged for -stable.
3/ A pair of locking fixes from Axel that are hidden from lockdep since
they involve device_lock(). The "btt" one is tagged for -stable, the
other only applies to the new "pfn" mechanism in v4.3.
4/ A fix for the pmem ->rw_page() path to use wmb_pmem() from Ross.
Full log and diff below.
---
The following changes since commit 6ff33f3902c3b1c5d0db6b1e2c70b6d76fba357f:
Linux 4.3-rc1 (2015-09-12 16:35:56 -0700)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm libnvdimm-fixes
for you to fetch changes up to ae4f976968896f8f41b3a7aa21be6146492211e5:
mm: fix type cast in __pfn_to_phys() (2015-09-19 03:58:10 -0400)
----------------------------------------------------------------
Axel Lin (2):
libnvdimm: btt_devs: Fix locking in namespace_store
libnvdimm: pfn_devs: Fix locking in namespace_store
Jeff Moyer (2):
dax: fix O_DIRECT I/O to the last block of a blockdev
blockdev: don't set S_DAX for misaligned partitions
Ross Zwisler (1):
pmem: add proper fencing to pmem_rw_page()
Tyler Baker (1):
mm: fix type cast in __pfn_to_phys()
drivers/nvdimm/btt_devs.c | 4 ++--
drivers/nvdimm/pfn_devs.c | 4 ++--
drivers/nvdimm/pmem.c | 2 ++
fs/block_dev.c | 7 +++++++
fs/dax.c | 3 ++-
include/asm-generic/memory_model.h | 2 +-
6 files changed, 16 insertions(+), 6 deletions(-)
commit ae4f976968896f8f41b3a7aa21be6146492211e5
Author: Tyler Baker <tyler.baker(a)linaro.org>
Date: Sat Sep 19 03:58:10 2015 -0400
mm: fix type cast in __pfn_to_phys()
The various definitions of __pfn_to_phys() have been consolidated to
use a generic macro in include/asm-generic/memory_model.h. This hit
mainline in the form of 012dcef3f058 "mm: move __phys_to_pfn and
__pfn_to_phys to asm/generic/memory_model.h". When the generic macro
was implemented the type cast to phys_addr_t was dropped which caused
boot regressions on ARM platforms with more than 4GB of memory and
LPAE enabled.
It was suggested to use PFN_PHYS() defined in include/linux/pfn.h
as provides the correct logic and avoids further duplication.
Reported-by: kernelci.org bot <bot(a)kernelci.org>
Suggested-by: Dan Williams <dan.j.williams(a)intel.com>
Signed-off-by: Tyler Baker <tyler.baker(a)linaro.org>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit ba8fe0f85e15d047686caf8a42463b592c63c98c
Author: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Date: Wed Sep 16 14:52:21 2015 -0600
pmem: add proper fencing to pmem_rw_page()
pmem_rw_page() needs to call wmb_pmem() on writes to make sure that the
newly written data is durable. This flow was added to pmem_rw_bytes()
and pmem_make_request() with this commit:
commit 61031952f4c8 ("arch, x86: pmem api for ensuring durability of
persistent memory updates")
...the pmem_rw_page() path was missed.
Cc: <stable(a)vger.kernel.org>
Signed-off-by: Ross Zwisler <ross.zwisler(a)linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 4ca8b57a0af145f4e791f21dbca6ad789da9ee8b
Author: Axel Lin <axel.lin(a)ingics.com>
Date: Wed Sep 16 21:25:38 2015 +0800
libnvdimm: pfn_devs: Fix locking in namespace_store
Always take device_lock() before nvdimm_bus_lock() to prevent deadlock.
Signed-off-by: Axel Lin <axel.lin(a)ingics.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit 4be9c1fc3df9c3b03c9bde8aec5e44fc73996a3f
Author: Axel Lin <axel.lin(a)ingics.com>
Date: Wed Sep 16 21:24:47 2015 +0800
libnvdimm: btt_devs: Fix locking in namespace_store
Always take device_lock() before nvdimm_bus_lock() to prevent deadlock.
Cc: <stable(a)vger.kernel.org>
Signed-off-by: Axel Lin <axel.lin(a)ingics.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit f0b2e563bc419df7c1b3d2f494574c25125f6aed
Author: Jeff Moyer <jmoyer(a)redhat.com>
Date: Fri Aug 14 16:15:32 2015 -0400
blockdev: don't set S_DAX for misaligned partitions
The dax code doesn't currently support misaligned partitions,
so disable O_DIRECT via dax until such time as that support
materializes.
Cc: <stable(a)vger.kernel.org>
Suggested-by: Boaz Harrosh <boaz(a)plexistor.com>
Signed-off-by: Jeff Moyer <jmoyer(a)redhat.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
commit e94f5a2285fc94202a9efb2c687481f29b64132c
Author: Jeff Moyer <jmoyer(a)redhat.com>
Date: Fri Aug 14 16:15:31 2015 -0400
dax: fix O_DIRECT I/O to the last block of a blockdev
commit bbab37ddc20b (block: Add support for DAX reads/writes to
block devices) caused a regression in mkfs.xfs. That utility
sets the block size of the device to the logical block size
using the BLKBSZSET ioctl, and then issues a single sector read
from the last sector of the device. This results in the dax_io
code trying to do a page-sized read from 512 bytes from the end
of the device. The result is -ERANGE being returned to userspace.
The fix is to align the block to the page size before calling
get_block.
Thanks to willy for simplifying my original patch.
Cc: <stable(a)vger.kernel.org>
Signed-off-by: Jeff Moyer <jmoyer(a)redhat.com>
Tested-by: Linda Knippers <linda.knippers(a)hp.com>
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
diff --git a/drivers/nvdimm/btt_devs.c b/drivers/nvdimm/btt_devs.c
index 59ad54a63d9f..cb477518dd0e 100644
--- a/drivers/nvdimm/btt_devs.c
+++ b/drivers/nvdimm/btt_devs.c
@@ -128,13 +128,13 @@ static ssize_t namespace_store(struct device *dev,
struct nd_btt *nd_btt = to_nd_btt(dev);
ssize_t rc;
- nvdimm_bus_lock(dev);
device_lock(dev);
+ nvdimm_bus_lock(dev);
rc = nd_namespace_store(dev, &nd_btt->ndns, buf, len);
dev_dbg(dev, "%s: result: %zd wrote: %s%s", __func__,
rc, buf, buf[len - 1] == '\n' ? "" : "\n");
- device_unlock(dev);
nvdimm_bus_unlock(dev);
+ device_unlock(dev);
return rc;
}
diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c
index 3fd7d0d81a47..71805a1aa0f3 100644
--- a/drivers/nvdimm/pfn_devs.c
+++ b/drivers/nvdimm/pfn_devs.c
@@ -148,13 +148,13 @@ static ssize_t namespace_store(struct device *dev,
struct nd_pfn *nd_pfn = to_nd_pfn(dev);
ssize_t rc;
- nvdimm_bus_lock(dev);
device_lock(dev);
+ nvdimm_bus_lock(dev);
rc = nd_namespace_store(dev, &nd_pfn->ndns, buf, len);
dev_dbg(dev, "%s: result: %zd wrote: %s%s", __func__,
rc, buf, buf[len - 1] == '\n' ? "" : "\n");
- device_unlock(dev);
nvdimm_bus_unlock(dev);
+ device_unlock(dev);
return rc;
}
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index b9525385c0dc..0ba6a978f227 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -92,6 +92,8 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
struct pmem_device *pmem = bdev->bd_disk->private_data;
pmem_do_bvec(pmem, page, PAGE_CACHE_SIZE, 0, rw, sector);
+ if (rw & WRITE)
+ wmb_pmem();
page_endio(page, rw & WRITE, 0);
return 0;
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 22ea424ee741..073bb57adab1 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1242,6 +1242,13 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
goto out_clear;
}
bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
+ /*
+ * If the partition is not aligned on a page
+ * boundary, we can't do dax I/O to it.
+ */
+ if ((bdev->bd_part->start_sect % (PAGE_SIZE / 512)) ||
+ (bdev->bd_part->nr_sects % (PAGE_SIZE / 512)))
+ bdev->bd_inode->i_flags &= ~S_DAX;
}
} else {
if (bdev->bd_contains == bdev) {
diff --git a/fs/dax.c b/fs/dax.c
index 93bf2f990ace..7ae6df7ea1d2 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -119,7 +119,8 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
size_t len;
if (pos == max) {
unsigned blkbits = inode->i_blkbits;
- sector_t block = pos >> blkbits;
+ long page = pos >> PAGE_SHIFT;
+ sector_t block = page << (PAGE_SHIFT - blkbits);
unsigned first = pos - (block << blkbits);
long size;
diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h
index f20f407ce45d..4b4b056a6eb0 100644
--- a/include/asm-generic/memory_model.h
+++ b/include/asm-generic/memory_model.h
@@ -73,7 +73,7 @@
* Convert a physical address to a Page Frame Number and back
*/
#define __phys_to_pfn(paddr) ((unsigned long)((paddr) >> PAGE_SHIFT))
-#define __pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT)
+#define __pfn_to_phys(pfn) PFN_PHYS(pfn)
#define page_to_pfn __page_to_pfn
#define pfn_to_page __pfn_to_page
5 years, 4 months
[PATCH] ndctl: fix up git URL in README.md
by Dan Williams
Reflect the move from djbw/nvdimm.git to nvdimm/nvdimm.git on
git.kernel.org.
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 1e01cb3a5774..84b8ed175f4f 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ loaded. To build and install nfit_test.ko:
1. Obtain the kernel source. For example,
`git clone -b libnvdimm-for-next
-git://git.kernel.org/pub/scm/linux/kernel/git/djbw/nvdimm.git`
+git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm.git`
2. Configure the kernel to make some memory available to CMA (contiguous
memory allocator).
5 years, 4 months