aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/linux-2.6/xfs_buf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_buf.c')
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index b9c8589e05c2..a49dd8d4b069 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -725,15 +725,15 @@ xfs_buf_associate_memory(
725{ 725{
726 int rval; 726 int rval;
727 int i = 0; 727 int i = 0;
728 size_t ptr; 728 unsigned long pageaddr;
729 size_t end, end_cur; 729 unsigned long offset;
730 off_t offset; 730 size_t buflen;
731 int page_count; 731 int page_count;
732 732
733 page_count = PAGE_CACHE_ALIGN(len) >> PAGE_CACHE_SHIFT; 733 pageaddr = (unsigned long)mem & PAGE_CACHE_MASK;
734 offset = (off_t) mem - ((off_t)mem & PAGE_CACHE_MASK); 734 offset = (unsigned long)mem - pageaddr;
735 if (offset && (len > PAGE_CACHE_SIZE)) 735 buflen = PAGE_CACHE_ALIGN(len + offset);
736 page_count++; 736 page_count = buflen >> PAGE_CACHE_SHIFT;
737 737
738 /* Free any previous set of page pointers */ 738 /* Free any previous set of page pointers */
739 if (bp->b_pages) 739 if (bp->b_pages)
@@ -747,22 +747,15 @@ xfs_buf_associate_memory(
747 return rval; 747 return rval;
748 748
749 bp->b_offset = offset; 749 bp->b_offset = offset;
750 ptr = (size_t) mem & PAGE_CACHE_MASK; 750
751 end = PAGE_CACHE_ALIGN((size_t) mem + len); 751 for (i = 0; i < bp->b_page_count; i++) {
752 end_cur = end; 752 bp->b_pages[i] = mem_to_page((void *)pageaddr);
753 /* set up first page */ 753 pageaddr += PAGE_CACHE_SIZE;
754 bp->b_pages[0] = mem_to_page(mem);
755
756 ptr += PAGE_CACHE_SIZE;
757 bp->b_page_count = ++i;
758 while (ptr < end) {
759 bp->b_pages[i] = mem_to_page((void *)ptr);
760 bp->b_page_count = ++i;
761 ptr += PAGE_CACHE_SIZE;
762 } 754 }
763 bp->b_locked = 0; 755 bp->b_locked = 0;
764 756
765 bp->b_count_desired = bp->b_buffer_length = len; 757 bp->b_count_desired = len;
758 bp->b_buffer_length = buflen;
766 bp->b_flags |= XBF_MAPPED; 759 bp->b_flags |= XBF_MAPPED;
767 760
768 return 0; 761 return 0;
@@ -1032,7 +1025,7 @@ xfs_buf_ioend(
1032 xfs_buf_t *bp, 1025 xfs_buf_t *bp,
1033 int schedule) 1026 int schedule)
1034{ 1027{
1035 bp->b_flags &= ~(XBF_READ | XBF_WRITE); 1028 bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD);
1036 if (bp->b_error == 0) 1029 if (bp->b_error == 0)
1037 bp->b_flags |= XBF_DONE; 1030 bp->b_flags |= XBF_DONE;
1038 1031
@@ -1750,6 +1743,8 @@ xfsbufd(
1750 1743
1751 current->flags |= PF_MEMALLOC; 1744 current->flags |= PF_MEMALLOC;
1752 1745
1746 set_freezable();
1747
1753 do { 1748 do {
1754 if (unlikely(freezing(current))) { 1749 if (unlikely(freezing(current))) {
1755 set_bit(XBT_FORCE_SLEEP, &target->bt_flags); 1750 set_bit(XBT_FORCE_SLEEP, &target->bt_flags);