diff options
author | Mark Fasheh <mark.fasheh@oracle.com> | 2007-06-06 19:15:24 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2007-06-06 19:42:03 -0400 |
commit | eeb47d1234af1a9267836f680a8e114b2e88d0dc (patch) | |
tree | 8362fcf841f204876446c952dca530cdb419899d /fs | |
parent | 59be7dc97bacc0fd8e22f0be6e2aebb5c9b4ff47 (diff) |
ocfs2: Fix invalid assertion during write on 64k pages
The write path code intends to bug if a math error (or unhandled case)
results in a write outside of the current cluster boundaries. The actual
BUG_ON() statements however are incorrect, leading to a crash on kernels
with 64k page size. Fix those by checking against the right variables.
Also, move the assertions higher up within the functions so that they trip
*before* the code starts to mark buffers.
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/aops.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 0023b31e48a8..a480b09c79b9 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -798,6 +798,11 @@ int ocfs2_map_and_write_splice_data(struct inode *inode, | |||
798 | } | 798 | } |
799 | to = from + bytes; | 799 | to = from + bytes; |
800 | 800 | ||
801 | BUG_ON(from > PAGE_CACHE_SIZE); | ||
802 | BUG_ON(to > PAGE_CACHE_SIZE); | ||
803 | BUG_ON(from < cluster_start); | ||
804 | BUG_ON(to > cluster_end); | ||
805 | |||
801 | if (wc->w_this_page_new) | 806 | if (wc->w_this_page_new) |
802 | ret = ocfs2_map_page_blocks(wc->w_this_page, p_blkno, inode, | 807 | ret = ocfs2_map_page_blocks(wc->w_this_page, p_blkno, inode, |
803 | cluster_start, cluster_end, 1); | 808 | cluster_start, cluster_end, 1); |
@@ -809,11 +814,6 @@ int ocfs2_map_and_write_splice_data(struct inode *inode, | |||
809 | goto out; | 814 | goto out; |
810 | } | 815 | } |
811 | 816 | ||
812 | BUG_ON(from > PAGE_CACHE_SIZE); | ||
813 | BUG_ON(to > PAGE_CACHE_SIZE); | ||
814 | BUG_ON(from > osb->s_clustersize); | ||
815 | BUG_ON(to > osb->s_clustersize); | ||
816 | |||
817 | src = buf->ops->map(sp->s_pipe, buf, 1); | 817 | src = buf->ops->map(sp->s_pipe, buf, 1); |
818 | dst = kmap_atomic(wc->w_this_page, KM_USER1); | 818 | dst = kmap_atomic(wc->w_this_page, KM_USER1); |
819 | memcpy(dst + from, src + src_from, bytes); | 819 | memcpy(dst + from, src + src_from, bytes); |
@@ -890,6 +890,11 @@ int ocfs2_map_and_write_user_data(struct inode *inode, | |||
890 | 890 | ||
891 | to = from + bytes; | 891 | to = from + bytes; |
892 | 892 | ||
893 | BUG_ON(from > PAGE_CACHE_SIZE); | ||
894 | BUG_ON(to > PAGE_CACHE_SIZE); | ||
895 | BUG_ON(from < cluster_start); | ||
896 | BUG_ON(to > cluster_end); | ||
897 | |||
893 | if (wc->w_this_page_new) | 898 | if (wc->w_this_page_new) |
894 | ret = ocfs2_map_page_blocks(wc->w_this_page, p_blkno, inode, | 899 | ret = ocfs2_map_page_blocks(wc->w_this_page, p_blkno, inode, |
895 | cluster_start, cluster_end, 1); | 900 | cluster_start, cluster_end, 1); |
@@ -901,11 +906,6 @@ int ocfs2_map_and_write_user_data(struct inode *inode, | |||
901 | goto out; | 906 | goto out; |
902 | } | 907 | } |
903 | 908 | ||
904 | BUG_ON(from > PAGE_CACHE_SIZE); | ||
905 | BUG_ON(to > PAGE_CACHE_SIZE); | ||
906 | BUG_ON(from > osb->s_clustersize); | ||
907 | BUG_ON(to > osb->s_clustersize); | ||
908 | |||
909 | dst = kmap(wc->w_this_page); | 909 | dst = kmap(wc->w_this_page); |
910 | memcpy(dst + from, bp->b_src_buf + src_from, bytes); | 910 | memcpy(dst + from, bp->b_src_buf + src_from, bytes); |
911 | kunmap(wc->w_this_page); | 911 | kunmap(wc->w_this_page); |