Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e604635c authored by Anton Altaparmakov's avatar Anton Altaparmakov
Browse files

NTFS: Improve scalability by changing the driver global spin lock in


      fs/ntfs/aops.c::ntfs_end_buffer_async_read() to a bit spin lock
      in the first buffer head of a page.

Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent a01ac532
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -86,6 +86,9 @@ ToDo/Notes:
	- Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case
	  where a concurrent truncate has truncated the runlist under our feet.
	- Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.
	- In fs/ntfs/aops.c::ntfs_end_buffer_async_read(), use a bit spin lock
	  in the first buffer head instead of a driver global spin lock to
	  improve scalability.

2.1.23 - Implement extension of resident files and make writing safe as well as
	 many bug fixes, cleanups, and enhancements...
+9 −6
Original line number Diff line number Diff line
@@ -55,9 +55,8 @@
 */
static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
{
	static DEFINE_SPINLOCK(page_uptodate_lock);
	unsigned long flags;
	struct buffer_head *tmp;
	struct buffer_head *first, *tmp;
	struct page *page;
	ntfs_inode *ni;
	int page_uptodate = 1;
@@ -89,11 +88,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
		}
	} else {
		clear_buffer_uptodate(bh);
		SetPageError(page);
		ntfs_error(ni->vol->sb, "Buffer I/O error, logical block %llu.",
				(unsigned long long)bh->b_blocknr);
		SetPageError(page);
	}
	spin_lock_irqsave(&page_uptodate_lock, flags);
	first = page_buffers(page);
	local_irq_save(flags);
	bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
	clear_buffer_async_read(bh);
	unlock_buffer(bh);
	tmp = bh;
@@ -108,7 +109,8 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
		}
		tmp = tmp->b_this_page;
	} while (tmp != bh);
	spin_unlock_irqrestore(&page_uptodate_lock, flags);
	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
	local_irq_restore(flags);
	/*
	 * If none of the buffers had errors then we can set the page uptodate,
	 * but we first have to perform the post read mst fixups, if the
@@ -141,7 +143,8 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
	unlock_page(page);
	return;
still_busy:
	spin_unlock_irqrestore(&page_uptodate_lock, flags);
	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
	local_irq_restore(flags);
	return;
}