All of lore.kernel.org
 help / color / mirror / Atom feed
* [Ocfs2-devel] [PATCH 2/2] Ocfs2/move_extents: Validate moving goal after the adjustment.
@ 2011-06-11 19:57 Mariusz Kozlowski
  2011-04-27 22:06 ` Tristan Ye
  0 siblings, 1 reply; 3+ messages in thread
From: Mariusz Kozlowski @ 2011-06-11 19:57 UTC (permalink / raw)
  To: ocfs2-devel

Hi,

  I think this one (ea5e1675 upstream) is wrong. Validation was moved
before 'bg' was assinged any sane value. Also 'bg' is defined with NULL
now so it hides real problem that 'bg' is used uninitialized. So currently
as 'bg' is NULL from the begining it will blow up with null pointer
dereference somewhere around test in line 489:

489:        if (range->me_goal == le64_to_cpu(bg->bg_blkno))
490:	                range->me_goal += c_to_b;

Sorry for reply with no context but I'm not subscribed to ocfs2-devel.
-- 
Mariusz Kozlowski

^ permalink raw reply	[flat|nested] 3+ messages in thread
* [Ocfs2-devel] [PATCH 1/2] Ocfs2/move_extents: Avoid doing division in extent moving.
@ 2011-05-27  6:32 Tristan Ye
  2011-05-27  6:32 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2/move_extents: Validate moving goal after the adjustment Tristan Ye
  0 siblings, 1 reply; 3+ messages in thread
From: Tristan Ye @ 2011-05-27  6:32 UTC (permalink / raw)
  To: ocfs2-devel

It's not wise enough to do a 64bits division anywhere in kernside, replace it
with a decent helper or proper shifts.

Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
---
 fs/ocfs2/move_extents.c |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c
index 4c54884..d184e0b 100644
--- a/fs/ocfs2/move_extents.c
+++ b/fs/ocfs2/move_extents.c
@@ -368,7 +368,7 @@ static int ocfs2_find_victim_alloc_group(struct inode *inode,
 					 int *vict_bit,
 					 struct buffer_head **ret_bh)
 {
-	int ret, i, blocks_per_unit = 1;
+	int ret, i, bits_per_unit = 0;
 	u64 blkno;
 	char namebuf[40];
 
@@ -398,14 +398,14 @@ static int ocfs2_find_victim_alloc_group(struct inode *inode,
 	rec = &(cl->cl_recs[0]);
 
 	if (type == GLOBAL_BITMAP_SYSTEM_INODE)
-		blocks_per_unit <<= (osb->s_clustersize_bits -
-						inode->i_sb->s_blocksize_bits);
+		bits_per_unit = osb->s_clustersize_bits -
+					inode->i_sb->s_blocksize_bits;
 	/*
 	 * 'vict_blkno' was out of the valid range.
 	 */
 	if ((vict_blkno < le64_to_cpu(rec->c_blkno)) ||
-	    (vict_blkno >= (le32_to_cpu(ac_dinode->id1.bitmap1.i_total) *
-				blocks_per_unit))) {
+	    (vict_blkno >= (le32_to_cpu(ac_dinode->id1.bitmap1.i_total) <<
+				bits_per_unit))) {
 		ret = -EINVAL;
 		goto out;
 	}
@@ -441,8 +441,8 @@ static int ocfs2_find_victim_alloc_group(struct inode *inode,
 						le16_to_cpu(bg->bg_bits))) {
 
 				*ret_bh = gd_bh;
-				*vict_bit = (vict_blkno - blkno) /
-							blocks_per_unit;
+				*vict_bit = (vict_blkno - blkno) >>
+							bits_per_unit;
 				mlog(0, "find the victim group: #%llu, "
 				     "total_bits: %u, vict_bit: %u\n",
 				     blkno, le16_to_cpu(bg->bg_bits),
@@ -493,9 +493,8 @@ static int ocfs2_validate_and_adjust_move_goal(struct inode *inode,
 	/*
 	 * make goal become cluster aligned.
 	 */
-	if (range->me_goal % c_to_b)
-		range->me_goal = range->me_goal / c_to_b * c_to_b;
-
+	range->me_goal = ocfs2_block_to_cluster_start(inode->i_sb,
+						      range->me_goal);
 	/*
 	 * moving goal is not allowd to start with a group desc blok(#0 blk)
 	 * let's compromise to the latter cluster.
-- 
1.5.5

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-06-11 19:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-11 19:57 [Ocfs2-devel] [PATCH 2/2] Ocfs2/move_extents: Validate moving goal after the adjustment Mariusz Kozlowski
2011-04-27 22:06 ` Tristan Ye
  -- strict thread matches above, loose matches on Subject: below --
2011-05-27  6:32 [Ocfs2-devel] [PATCH 1/2] Ocfs2/move_extents: Avoid doing division in extent moving Tristan Ye
2011-05-27  6:32 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2/move_extents: Validate moving goal after the adjustment Tristan Ye

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.