Commit 22285049 authored by Stephen Lord's avatar Stephen Lord

Merge kernel.bkbits.net:/home/repos/linux-2.5

into kernel.bkbits.net:/home/lord/xfs-2.6
parents 7140df08 539c89b8
...@@ -225,7 +225,8 @@ probe_unwritten_page( ...@@ -225,7 +225,8 @@ probe_unwritten_page(
page_buf_bmap_t *mp, page_buf_bmap_t *mp,
page_buf_t *pb, page_buf_t *pb,
unsigned long max_offset, unsigned long max_offset,
unsigned long *fsbs) unsigned long *fsbs,
unsigned int bbits)
{ {
struct page *page; struct page *page;
...@@ -248,6 +249,7 @@ probe_unwritten_page( ...@@ -248,6 +249,7 @@ probe_unwritten_page(
break; break;
if (p_offset >= max_offset) if (p_offset >= max_offset)
break; break;
map_buffer_at_offset(page, bh, p_offset, bbits, mp);
set_buffer_unwritten_io(bh); set_buffer_unwritten_io(bh);
bh->b_private = pb; bh->b_private = pb;
p_offset += bh->b_size; p_offset += bh->b_size;
...@@ -455,13 +457,14 @@ map_unwritten( ...@@ -455,13 +457,14 @@ map_unwritten(
if (bh == head) { if (bh == head) {
struct address_space *mapping = inode->i_mapping; struct address_space *mapping = inode->i_mapping;
unsigned long tindex, tloff, tlast, bs; unsigned long tindex, tloff, tlast, bs;
unsigned int bbits = inode->i_blkbits;
struct page *page; struct page *page;
tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT; tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT;
tloff = min(tlast, start_page->index + pb->pb_page_count - 1); tloff = min(tlast, start_page->index + pb->pb_page_count - 1);
for (tindex = start_page->index + 1; tindex < tloff; tindex++) { for (tindex = start_page->index + 1; tindex < tloff; tindex++) {
page = probe_unwritten_page(mapping, tindex, mp, pb, page = probe_unwritten_page(mapping, tindex, mp, pb,
PAGE_CACHE_SIZE, &bs); PAGE_CACHE_SIZE, &bs, bbits);
if (!page) if (!page)
break; break;
nblocks += bs; nblocks += bs;
...@@ -472,7 +475,7 @@ map_unwritten( ...@@ -472,7 +475,7 @@ map_unwritten(
if (tindex == tlast && if (tindex == tlast &&
(tloff = (i_size_read(inode) & (PAGE_CACHE_SIZE - 1)))) { (tloff = (i_size_read(inode) & (PAGE_CACHE_SIZE - 1)))) {
page = probe_unwritten_page(mapping, tindex, mp, pb, page = probe_unwritten_page(mapping, tindex, mp, pb,
tloff, &bs); tloff, &bs, bbits);
if (page) { if (page) {
nblocks += bs; nblocks += bs;
atomic_add(bs, &pb->pb_io_remaining); atomic_add(bs, &pb->pb_io_remaining);
...@@ -560,7 +563,8 @@ convert_page( ...@@ -560,7 +563,8 @@ convert_page(
offset = i << bbits; offset = i << bbits;
if (!(PageUptodate(page) || buffer_uptodate(bh))) if (!(PageUptodate(page) || buffer_uptodate(bh)))
continue; continue;
if (buffer_mapped(bh) && !buffer_delay(bh) && all_bh) { if (buffer_mapped(bh) && all_bh &&
!buffer_unwritten(bh) && !buffer_delay(bh)) {
if (startio && (offset < end)) { if (startio && (offset < end)) {
lock_buffer(bh); lock_buffer(bh);
bh_arr[index++] = bh; bh_arr[index++] = bh;
...@@ -581,7 +585,7 @@ convert_page( ...@@ -581,7 +585,7 @@ convert_page(
ASSERT(tmp->pbm_flags & PBMF_UNWRITTEN); ASSERT(tmp->pbm_flags & PBMF_UNWRITTEN);
map_unwritten(inode, page, head, bh, map_unwritten(inode, page, head, bh,
offset, bbits, tmp, all_bh); offset, bbits, tmp, all_bh);
} else { } else if (! (buffer_unwritten(bh) && buffer_locked(bh))) {
map_buffer_at_offset(page, bh, offset, bbits, tmp); map_buffer_at_offset(page, bh, offset, bbits, tmp);
if (buffer_unwritten(bh)) { if (buffer_unwritten(bh)) {
set_buffer_unwritten_io(bh); set_buffer_unwritten_io(bh);
......
...@@ -156,7 +156,7 @@ xfs_iomap( ...@@ -156,7 +156,7 @@ xfs_iomap(
if (flags & BMAP_IGNSTATE) if (flags & BMAP_IGNSTATE)
bmap_flags |= XFS_BMAPI_IGSTATE; bmap_flags |= XFS_BMAPI_IGSTATE;
break; break;
case PBF_WRITE: case BMAP_WRITE:
lockmode = XFS_ILOCK_EXCL|XFS_EXTSIZE_WR; lockmode = XFS_ILOCK_EXCL|XFS_EXTSIZE_WR;
bmap_flags = 0; bmap_flags = 0;
XFS_ILOCK(mp, io, lockmode); XFS_ILOCK(mp, io, lockmode);
......
...@@ -156,12 +156,12 @@ xfs_lowbit64( ...@@ -156,12 +156,12 @@ xfs_lowbit64(
{ {
int n; int n;
n = ffs((unsigned)v); n = ffs((unsigned)v);
if (n == 0) { if (n <= 0) {
n = ffs(v >> 32); n = ffs(v >> 32);
if (n >= 0) if (n >= 0)
n+=32; n+=32;
} }
return n-1; return (n <= 0) ? n : n-1;
} }
/* /*
......
...@@ -189,10 +189,10 @@ typedef struct xfs_da_args { ...@@ -189,10 +189,10 @@ typedef struct xfs_da_args {
int index2; /* index of 2nd attr in blk */ int index2; /* index of 2nd attr in blk */
xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */
int rmtblkcnt2; /* remote attr value block count */ int rmtblkcnt2; /* remote attr value block count */
int justcheck : 1; /* T/F: check for ok with no space */ unsigned char justcheck; /* T/F: check for ok with no space */
int rename : 1; /* T/F: this is an atomic rename op */ unsigned char rename; /* T/F: this is an atomic rename op */
int addname : 1; /* T/F: this is an add operation */ unsigned char addname; /* T/F: this is an add operation */
int oknoent : 1; /* T/F: ok to return ENOENT, else die */ unsigned char oknoent; /* T/F: ok to return ENOENT, else die */
} xfs_da_args_t; } xfs_da_args_t;
/* /*
...@@ -252,10 +252,10 @@ typedef struct xfs_da_state { ...@@ -252,10 +252,10 @@ typedef struct xfs_da_state {
unsigned int node_ents; /* how many entries in danode */ unsigned int node_ents; /* how many entries in danode */
xfs_da_state_path_t path; /* search/split paths */ xfs_da_state_path_t path; /* search/split paths */
xfs_da_state_path_t altpath; /* alternate path for join */ xfs_da_state_path_t altpath; /* alternate path for join */
unsigned int inleaf : 1; /* insert into 1->lf, 0->splf */ unsigned char inleaf; /* insert into 1->lf, 0->splf */
unsigned int holeok : 1; /* T/F: can deal with a hole */ unsigned char holeok; /* T/F: can deal with a hole */
unsigned int extravalid : 1; /* T/F: extrablk is in use */ unsigned char extravalid; /* T/F: extrablk is in use */
unsigned int extraafter : 1; /* T/F: extrablk is after new */ unsigned char extraafter; /* T/F: extrablk is after new */
xfs_da_state_blk_t extrablk; /* for double-splits on leafs */ xfs_da_state_blk_t extrablk; /* for double-splits on leafs */
/* for dirv2 extrablk is data */ /* for dirv2 extrablk is data */
} xfs_da_state_t; } xfs_da_state_t;
......
...@@ -172,7 +172,7 @@ xfs_growfs_data_private( ...@@ -172,7 +172,7 @@ xfs_growfs_data_private(
if (nb < mp->m_sb.sb_dblocks) if (nb < mp->m_sb.sb_dblocks)
return XFS_ERROR(EINVAL); return XFS_ERROR(EINVAL);
} }
new = in->newblocks - mp->m_sb.sb_dblocks; new = nb - mp->m_sb.sb_dblocks;
oagcount = mp->m_sb.sb_agcount; oagcount = mp->m_sb.sb_agcount;
if (nagcount > oagcount) { if (nagcount > oagcount) {
down_write(&mp->m_peraglock); down_write(&mp->m_peraglock);
......
...@@ -3427,8 +3427,8 @@ xlog_verify_iclog(xlog_t *log, ...@@ -3427,8 +3427,8 @@ xlog_verify_iclog(xlog_t *log,
if (syncing == B_FALSE || (field_offset & 0x1ff)) { if (syncing == B_FALSE || (field_offset & 0x1ff)) {
clientid = ophead->oh_clientid; clientid = ophead->oh_clientid;
} else { } else {
idx = BTOBB((xfs_caddr_t)&(ophead->oh_clientid) - iclog->ic_datap); idx = BTOBBT((xfs_caddr_t)&(ophead->oh_clientid) - iclog->ic_datap);
if (idx > (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) { if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
clientid = GET_CLIENT_ID(xhdr[j].hic_xheader.xh_cycle_data[k], ARCH_CONVERT); clientid = GET_CLIENT_ID(xhdr[j].hic_xheader.xh_cycle_data[k], ARCH_CONVERT);
...@@ -3445,9 +3445,9 @@ xlog_verify_iclog(xlog_t *log, ...@@ -3445,9 +3445,9 @@ xlog_verify_iclog(xlog_t *log,
if (syncing == B_FALSE || (field_offset & 0x1ff)) { if (syncing == B_FALSE || (field_offset & 0x1ff)) {
op_len = INT_GET(ophead->oh_len, ARCH_CONVERT); op_len = INT_GET(ophead->oh_len, ARCH_CONVERT);
} else { } else {
idx = BTOBB((__psint_t)&ophead->oh_len - idx = BTOBBT((__psint_t)&ophead->oh_len -
(__psint_t)iclog->ic_datap); (__psint_t)iclog->ic_datap);
if (idx > (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) { if (idx >= (XLOG_HEADER_CYCLE_SIZE / BBSIZE)) {
j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); j = idx / (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); k = idx % (XLOG_HEADER_CYCLE_SIZE / BBSIZE);
op_len = INT_GET(xhdr[j].hic_xheader.xh_cycle_data[k], ARCH_CONVERT); op_len = INT_GET(xhdr[j].hic_xheader.xh_cycle_data[k], ARCH_CONVERT);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment