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

Commit 035cfc61 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes:
  [GFS2] fix gfs2 block allocation (cleaned up)
  [GFS2] BUG: unable to handle kernel paging request at ffff81002690e000
parents 919c0d14 5af4e7a0
Loading
Loading
Loading
Loading
+9 −14
Original line number Diff line number Diff line
@@ -246,15 +246,11 @@ static void find_metapath(const struct gfs2_sbd *sdp, u64 block,

}

static inline unsigned int zero_metapath_length(const struct metapath *mp,
						unsigned height)
static inline unsigned int metapath_branch_start(const struct metapath *mp)
{
	unsigned int i;
	for (i = 0; i < height - 1; i++) {
		if (mp->mp_list[i] != 0)
			return i;
	}
	return height;
	if (mp->mp_list[0] == 0)
		return 2;
	return 1;
}

/**
@@ -436,7 +432,7 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock,
	struct gfs2_sbd *sdp = GFS2_SB(inode);
	struct buffer_head *dibh = mp->mp_bh[0];
	u64 bn, dblock = 0;
	unsigned n, i, blks, alloced = 0, iblks = 0, zmpl = 0;
	unsigned n, i, blks, alloced = 0, iblks = 0, branch_start = 0;
	unsigned dblks = 0;
	unsigned ptrs_per_blk;
	const unsigned end_of_metadata = height - 1;
@@ -471,9 +467,8 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock,
			/* Building up tree height */
			state = ALLOC_GROW_HEIGHT;
			iblks = height - ip->i_height;
			zmpl = zero_metapath_length(mp, height);
			iblks -= zmpl;
			iblks += height;
			branch_start = metapath_branch_start(mp);
			iblks += (height - branch_start);
		}
	}

@@ -509,13 +504,13 @@ static int gfs2_bmap_alloc(struct inode *inode, const sector_t lblock,
					sizeof(struct gfs2_meta_header));
				*ptr = zero_bn;
				state = ALLOC_GROW_DEPTH;
				for(i = zmpl; i < height; i++) {
				for(i = branch_start; i < height; i++) {
					if (mp->mp_bh[i] == NULL)
						break;
					brelse(mp->mp_bh[i]);
					mp->mp_bh[i] = NULL;
				}
				i = zmpl;
				i = branch_start;
			}
			if (n == 0)
				break;
+1 −1
Original line number Diff line number Diff line
@@ -195,7 +195,7 @@ ulong_aligned:
	   depending on architecture.  I've experimented with several ways
	   of writing this section such as using an else before the goto
	   but this one seems to be the fastest. */
	while ((unsigned char *)plong < end - 1) {
	while ((unsigned char *)plong < end - sizeof(unsigned long)) {
		prefetch(plong + 1);
		if (((*plong) & LBITMASK) != lskipval)
			break;