User: | Jiri Slaby |
Error type: | Double Unlock |
Error type description: | Some lock is unlocked twice unintentionally in a sequence |
File location: | fs/xfs/xfs_vfsops.c |
Line in file: | 570 |
Project: | Linux Kernel |
Project version: | 2.6.28 |
Tools: |
Smatch
(1.59)
|
Entered: | 2013-09-10 15:16:58 UTC |
540 * is already being flushed so don't bother waiting. 541 * 542 * If we can lock it then do a delwri flush so we can 543 * combine multiple inode flushes in each disk write. 544 */ 545 } else if (xfs_iflock_nowait(ip)) { 546 error = xfs_iflush(ip, XFS_IFLUSH_DELWRI); 547 } else if (bypassed) { 548 (*bypassed)++; 549 } 550 } 551 552 if (lock_flags != 0) { 553 xfs_iunlock(ip, lock_flags); 554 } 555 556 if (vnode_refed) { 557 /* 558 * If we had to take a reference on the vnode 559 * above, then wait until after we've unlocked 560 * the inode to release the reference. This is 561 * because we can be already holding the inode 562 * lock when IRELE() calls xfs_inactive(). 563 * 564 * Make sure to drop the mount lock before calling 565 * IRELE() so that we don't trip over ourselves if 566 * we have to go for the mount lock again in the 567 * inactive code. 568 */ 569 if (mount_locked) { 570 IPOINTER_INSERT(ip, mp); 571 } 572 573 IRELE(ip); 574 575 vnode_refed = B_FALSE; 576 } 577 578 if (error) { 579 last_error = error; 580 }