aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenry C Chang <henry.cy.chang@gmail.com>2011-03-15 05:18:01 -0400
committerSage Weil <sage@newdream.net>2011-03-21 15:24:24 -0400
commit78a255654fa7f01945dea0dcedcf5113b3ad9f93 (patch)
tree87664950f3c8d68ba56e53034c6e9bcdf3a03699
parent80456f8672f7e69d05c01627da03587dc1ea1603 (diff)
ceph: remove request from unsafe list if it is canceled/timed out
This fixes the list corruption warning like this: ------------[ cut here ]------------ WARNING: at lib/list_debug.c:30 __list_add+0x68/0x81() Hardware name: X8DTU list_add corruption. prev->next should be next (ffff880618931250), but was (null). (prev=ffff880c188b9130). Modules linked in: nfsd lockd nfs_acl auth_rpcgss exportfs ceph libceph libcrc32c sunrpc ipv6 fuse igb i2c_i801 ioatdma i2c_core iTCO_wdt iTCO_vendor_support joydev dca serio_raw usb_storage [last unloaded: scsi_wait_scan] Pid: 10977, comm: smbd Tainted: G W 2.6.32.23-170.Elaster.xendom0.fc12.x86_64 #1 Call Trace: [<ffffffff8105753c>] warn_slowpath_common+0x7c/0x94 [<ffffffff810575ab>] warn_slowpath_fmt+0x41/0x43 [<ffffffff812351a3>] __list_add+0x68/0x81 [<ffffffffa014799d>] ceph_aio_write+0x614/0x8a2 [ceph] [<ffffffff8111d2a0>] do_sync_write+0xe8/0x125 [<ffffffff81075a1f>] ? autoremove_wake_function+0x0/0x39 [<ffffffff811f21ec>] ? selinux_file_permission+0x5c/0xb3 [<ffffffff811e8521>] ? security_file_permission+0x16/0x18 [<ffffffff8111d864>] vfs_write+0xae/0x10b [<ffffffff8111d91b>] sys_pwrite64+0x5a/0x76 [<ffffffff81012d32>] system_call_fastpath+0x16/0x1b ---[ end trace 08573eb9f07ff6f4 ]--- Signed-off-by: Henry C Chang <henry_c_chang@tcloudcomputing.com> Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r--fs/ceph/file.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 7d0e4a82d898..db5d86309744 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -568,7 +568,14 @@ more:
568 spin_unlock(&ci->i_unsafe_lock); 568 spin_unlock(&ci->i_unsafe_lock);
569 ceph_get_cap_refs(ci, CEPH_CAP_FILE_WR); 569 ceph_get_cap_refs(ci, CEPH_CAP_FILE_WR);
570 } 570 }
571
571 ret = ceph_osdc_wait_request(&fsc->client->osdc, req); 572 ret = ceph_osdc_wait_request(&fsc->client->osdc, req);
573 if (ret < 0 && req->r_safe_callback) {
574 spin_lock(&ci->i_unsafe_lock);
575 list_del_init(&req->r_unsafe_item);
576 spin_unlock(&ci->i_unsafe_lock);
577 ceph_put_cap_refs(ci, CEPH_CAP_FILE_WR);
578 }
572 } 579 }
573 580
574 if (file->f_flags & O_DIRECT) 581 if (file->f_flags & O_DIRECT)