From mboxrd@z Thu Jan 1 00:00:00 1970 From: majianpeng Subject: [PATCH V1] ceph: fix sleeping function called from invalid context. Date: Wed, 19 Jun 2013 14:58:10 +0800 Message-ID: <201306191458048052860@gmail.com> Reply-To: majianpeng Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 Return-path: Sender: linux-kernel-owner@vger.kernel.org To: sage Cc: ceph-devel , linux-kernel List-Id: ceph-devel.vger.kernel.org WyAxMTIxLjIzMTg4M10gQlVHOiBzbGVlcGluZyBmdW5jdGlvbiBjYWxsZWQgZnJvbSBpbnZhbGlk IGNvbnRleHQgYXQga2VybmVsL3J3c2VtLmM6MjANClsgMTEyMS4yMzE5MzVdIGluX2F0b21pYygp OiAxLCBpcnFzX2Rpc2FibGVkKCk6IDAsIHBpZDogOTgzMSwgbmFtZTogbXYNClsgMTEyMS4yMzE5 NzFdIDEgbG9jayBoZWxkIGJ5IG12Lzk4MzE6DQpbIDExMjEuMjMxOTczXSAgIzA6ICAoJigmY2kt PmlfY2VwaF9sb2NrKS0+cmxvY2speysuKy4uLn0sYXQ6WzxmZmZmZmZmZmEwMmJiZDM4Pl0gY2Vw aF9nZXR4YXR0cisweDU4LzB4MWQwIFtjZXBoXQ0KWyAxMTIxLjIzMTk5OF0gQ1BVOiAzIFBJRDog OTgzMSBDb21tOiBtdiBOb3QgdGFpbnRlZCAzLjEwLjAtcmM2KyAjMjE1DQpbIDExMjEuMjMyMDAw XSBIYXJkd2FyZSBuYW1lOiBUbyBCZSBGaWxsZWQgQnkgTy5FLk0uIFRvIEJlIEZpbGxlZCBCeQ0K Ty5FLk0uL1RvIGJlIGZpbGxlZCBieSBPLkUuTS4sIEJJT1MgMDgwMDE1ICAxMS8wOS8yMDExDQpb IDExMjEuMjMyMDI3XSAgZmZmZjg4MDA2ZDM1NWE4MCBmZmZmODgwMDkyZjY5Y2UwIGZmZmZmZmZm ODE2ODM0OGMgZmZmZjg4MDA5MmY2OWNmOA0KWyAxMTIxLjIzMjA0NV0gIGZmZmZmZmZmODEwNzA0 MzUgZmZmZjg4MDA2ZDM1NWEyMCBmZmZmODgwMDkyZjY5ZDIwIGZmZmZmZmZmODE2ODk5YmENClsg MTEyMS4yMzIwNTJdICAwMDAwMDAwMzAwMDAwMDA0IGZmZmY4ODAwYjc2OTExZDAgZmZmZjg4MDA2 ZDM1NWEyMCBmZmZmODgwMDkyZjY5ZDY4DQpbIDExMjEuMjMyMDU2XSBDYWxsIFRyYWNlOg0KWyAx MTIxLjIzMjA2Ml0gIFs8ZmZmZmZmZmY4MTY4MzQ4Yz5dIGR1bXBfc3RhY2srMHgxOS8weDFiDQpb IDExMjEuMjMyMDY3XSAgWzxmZmZmZmZmZjgxMDcwNDM1Pl0gX19taWdodF9zbGVlcCsweGU1LzB4 MTEwDQpbIDExMjEuMjMyMDcxXSAgWzxmZmZmZmZmZjgxNjg5OWJhPl0gZG93bl9yZWFkKzB4MmEv MHg5OA0KWyAxMTIxLjIzMjA4MF0gIFs8ZmZmZmZmZmZhMDJiYWY3MD5dIGNlcGhfdnhhdHRyY2Jf bGF5b3V0KzB4NjAvMHhmMCBbY2VwaF0NClsgMTEyMS4yMzIwODhdICBbPGZmZmZmZmZmYTAyYmJk N2Y+XSBjZXBoX2dldHhhdHRyKzB4OWYvMHgxZDAgW2NlcGhdDQpbIDExMjEuMjMyMDkzXSAgWzxm ZmZmZmZmZjgxMTg4ZDI4Pl0gdmZzX2dldHhhdHRyKzB4YTgvMHhkMA0KWyAxMTIxLjIzMjA5N10g IFs8ZmZmZmZmZmY4MTE4OTAwYj5dIGdldHhhdHRyKzB4YWIvMHgxYzANClsgMTEyMS4yMzIxMDBd ICBbPGZmZmZmZmZmODExNzA0ZjI+XSA/IGZpbmFsX3B1dG5hbWUrMHgyMi8weDUwDQpbIDExMjEu MjMyMTA0XSAgWzxmZmZmZmZmZjgxMTU1ZjgwPl0gPyBrbWVtX2NhY2hlX2ZyZWUrMHhiMC8weDI2 MA0KWyAxMTIxLjIzMjEwN10gIFs8ZmZmZmZmZmY4MTE3MDRmMj5dID8gZmluYWxfcHV0bmFtZSsw eDIyLzB4NTANClsgMTEyMS4yMzIxMTBdICBbPGZmZmZmZmZmODEwOWU2M2Q+XSA/IHRyYWNlX2hh cmRpcnFzX29uKzB4ZC8weDEwDQpbIDExMjEuMjMyMTE0XSAgWzxmZmZmZmZmZjgxNjk1N2E3Pl0g PyBzeXNyZXRfY2hlY2srMHgxYi8weDU2DQpbIDExMjEuMjMyMTIwXSAgWzxmZmZmZmZmZjgxMTg5 YzljPl0gU3lTX2ZnZXR4YXR0cisweDZjLzB4YzANClsgMTEyMS4yMzIxMjVdICBbPGZmZmZmZmZm ODE2OTU3ODI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDE2LzB4MWINClsgMTEyMS4yMzIxMjld IEJVRzogc2NoZWR1bGluZyB3aGlsZSBhdG9taWM6IG12Lzk4MzEvMHgxMDAwMDAwMg0KWyAxMTIx LjIzMjE1NF0gMSBsb2NrIGhlbGQgYnkgbXYvOTgzMToNClsgMTEyMS4yMzIxNTZdICAjMDogICgm KCZjaS0+aV9jZXBoX2xvY2spLT5ybG9jayl7Ky4rLi4ufSwgYXQ6DQpbPGZmZmZmZmZmYTAyYmJk Mzg+XSBjZXBoX2dldHhhdHRyKzB4NTgvMHgxZDAgW2NlcGhdDQoNCkkgdGhpbmsgbW92ZSB0aGUg Y2ktPmlfY2VwaF9sb2NrIGRvd24gaXMgc2FmZSBiZWNhdXNlIHdlIGNhbid0IGZyZWUNCmNlcGhf aW5vZGVfaW5mbyBhdCB0aGVyZS4NCg0KU2lnbmVkLW9mZi1ieTogSmlhbnBlbmcgTWEgPG1hamlh bnBlbmdAZ21haWwuY29tPg0KLS0tDQogZnMvY2VwaC94YXR0ci5jIHwgOSArKysrKy0tLS0NCiAx IGZpbGUgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQ0KDQpkaWZmIC0t Z2l0IGEvZnMvY2VwaC94YXR0ci5jIGIvZnMvY2VwaC94YXR0ci5jDQppbmRleCA5YjZiMmI2Li5i ZTY2MWQ4IDEwMDY0NA0KLS0tIGEvZnMvY2VwaC94YXR0ci5jDQorKysgYi9mcy9jZXBoL3hhdHRy LmMNCkBAIC02NzUsMTcgKzY3NSwxOCBAQCBzc2l6ZV90IGNlcGhfZ2V0eGF0dHIoc3RydWN0IGRl bnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSwNCiAJaWYgKCFjZXBo X2lzX3ZhbGlkX3hhdHRyKG5hbWUpKQ0KIAkJcmV0dXJuIC1FTk9EQVRBOw0KIA0KLQlzcGluX2xv Y2soJmNpLT5pX2NlcGhfbG9jayk7DQotCWRvdXQoImdldHhhdHRyICVwIHZlcj0lbGxkIGluZGV4 X3Zlcj0lbGxkXG4iLCBpbm9kZSwNCi0JICAgICBjaS0+aV94YXR0cnMudmVyc2lvbiwgY2ktPmlf eGF0dHJzLmluZGV4X3ZlcnNpb24pOw0KIA0KIAkvKiBsZXQncyBzZWUgaWYgYSB2aXJ0dWFsIHhh dHRyIHdhcyByZXF1ZXN0ZWQgKi8NCiAJdnhhdHRyID0gY2VwaF9tYXRjaF92eGF0dHIoaW5vZGUs IG5hbWUpOw0KIAlpZiAodnhhdHRyICYmICEodnhhdHRyLT5leGlzdHNfY2IgJiYgIXZ4YXR0ci0+ ZXhpc3RzX2NiKGNpKSkpIHsNCiAJCWVyciA9IHZ4YXR0ci0+Z2V0eGF0dHJfY2IoY2ksIHZhbHVl LCBzaXplKTsNCi0JCWdvdG8gb3V0Ow0KKwkJcmV0dXJuIGVycjsNCiAJfQ0KIA0KKwlzcGluX2xv Y2soJmNpLT5pX2NlcGhfbG9jayk7DQorCWRvdXQoImdldHhhdHRyICVwIHZlcj0lbGxkIGluZGV4 X3Zlcj0lbGxkXG4iLCBpbm9kZSwNCisJICAgICBjaS0+aV94YXR0cnMudmVyc2lvbiwgY2ktPmlf eGF0dHJzLmluZGV4X3ZlcnNpb24pOw0KKw0KIAlpZiAoX19jZXBoX2NhcHNfaXNzdWVkX21hc2so Y2ksIENFUEhfQ0FQX1hBVFRSX1NIQVJFRCwgMSkgJiYNCiAJICAgIChjaS0+aV94YXR0cnMuaW5k ZXhfdmVyc2lvbiA+PSBjaS0+aV94YXR0cnMudmVyc2lvbikpIHsNCiAJCWdvdG8gZ2V0X3hhdHRy Ow0KLS0gDQoxLjguMy5yYzEuNDQuZ2IzODdjNzcNCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933913Ab3FSG6Q (ORCPT ); Wed, 19 Jun 2013 02:58:16 -0400 Received: from mail-pd0-f175.google.com ([209.85.192.175]:63604 "EHLO mail-pd0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751141Ab3FSG6O (ORCPT ); Wed, 19 Jun 2013 02:58:14 -0400 Date: Wed, 19 Jun 2013 14:58:10 +0800 From: majianpeng To: sage Cc: ceph-devel , linux-kernel Reply-To: majianpeng Subject: [PATCH V1] ceph: fix sleeping function called from invalid context. X-Priority: 3 X-GUID: DE2C8F38-E9AE-4650-95F2-82809A89B720 X-Has-Attach: no X-Mailer: Foxmail 7.0.1.90[en] Mime-Version: 1.0 Message-ID: <201306191458048052860@gmail.com> Content-Type: text/plain; charset="gb2312" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id r5J6wPax006423 [ 1121.231883] BUG: sleeping function called from invalid context at kernel/rwsem.c:20 [ 1121.231935] in_atomic(): 1, irqs_disabled(): 0, pid: 9831, name: mv [ 1121.231971] 1 lock held by mv/9831: [ 1121.231973] #0: (&(&ci->i_ceph_lock)->rlock){+.+...},at:[] ceph_getxattr+0x58/0x1d0 [ceph] [ 1121.231998] CPU: 3 PID: 9831 Comm: mv Not tainted 3.10.0-rc6+ #215 [ 1121.232000] Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./To be filled by O.E.M., BIOS 080015 11/09/2011 [ 1121.232027] ffff88006d355a80 ffff880092f69ce0 ffffffff8168348c ffff880092f69cf8 [ 1121.232045] ffffffff81070435 ffff88006d355a20 ffff880092f69d20 ffffffff816899ba [ 1121.232052] 0000000300000004 ffff8800b76911d0 ffff88006d355a20 ffff880092f69d68 [ 1121.232056] Call Trace: [ 1121.232062] [] dump_stack+0x19/0x1b [ 1121.232067] [] __might_sleep+0xe5/0x110 [ 1121.232071] [] down_read+0x2a/0x98 [ 1121.232080] [] ceph_vxattrcb_layout+0x60/0xf0 [ceph] [ 1121.232088] [] ceph_getxattr+0x9f/0x1d0 [ceph] [ 1121.232093] [] vfs_getxattr+0xa8/0xd0 [ 1121.232097] [] getxattr+0xab/0x1c0 [ 1121.232100] [] ? final_putname+0x22/0x50 [ 1121.232104] [] ? kmem_cache_free+0xb0/0x260 [ 1121.232107] [] ? final_putname+0x22/0x50 [ 1121.232110] [] ? trace_hardirqs_on+0xd/0x10 [ 1121.232114] [] ? sysret_check+0x1b/0x56 [ 1121.232120] [] SyS_fgetxattr+0x6c/0xc0 [ 1121.232125] [] system_call_fastpath+0x16/0x1b [ 1121.232129] BUG: scheduling while atomic: mv/9831/0x10000002 [ 1121.232154] 1 lock held by mv/9831: [ 1121.232156] #0: (&(&ci->i_ceph_lock)->rlock){+.+...}, at: [] ceph_getxattr+0x58/0x1d0 [ceph] I think move the ci->i_ceph_lock down is safe because we can't free ceph_inode_info at there. Signed-off-by: Jianpeng Ma --- fs/ceph/xattr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 9b6b2b6..be661d8 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -675,17 +675,18 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, if (!ceph_is_valid_xattr(name)) return -ENODATA; - spin_lock(&ci->i_ceph_lock); - dout("getxattr %p ver=%lld index_ver=%lld\n", inode, - ci->i_xattrs.version, ci->i_xattrs.index_version); /* let's see if a virtual xattr was requested */ vxattr = ceph_match_vxattr(inode, name); if (vxattr && !(vxattr->exists_cb && !vxattr->exists_cb(ci))) { err = vxattr->getxattr_cb(ci, value, size); - goto out; + return err; } + spin_lock(&ci->i_ceph_lock); + dout("getxattr %p ver=%lld index_ver=%lld\n", inode, + ci->i_xattrs.version, ci->i_xattrs.index_version); + if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1) && (ci->i_xattrs.index_version >= ci->i_xattrs.version)) { goto get_xattr; -- 1.8.3.rc1.44.gb387c77 {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I