X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Frw24.c;h=cd1b1ce806bc22ff8705d3eacd40185976b24ec9;hb=4bed0a39e0528261b6b7f1546256e592a09fc0bc;hp=cda014eb87063026fc85598e934206c58b2c66b0;hpb=30c3a18963d1d6d70175fbbbdd9554e1eb2fa40d;p=fs%2Flustre-release.git diff --git a/lustre/llite/rw24.c b/lustre/llite/rw24.c index cda014e..cd1b1ce 100644 --- a/lustre/llite/rw24.c +++ b/lustre/llite/rw24.c @@ -49,95 +49,13 @@ #include "llite_internal.h" #include -/* called for each page in a completed rpc.*/ -void ll_ap_completion_24(void *data, int cmd, int rc) -{ - struct ll_async_page *llap; - struct page *page; - - llap = llap_from_cookie(data); - if (IS_ERR(llap)) { - EXIT; - return; - } - - page = llap->llap_page; - LASSERT(PageLocked(page)); - - if (rc == 0) { - if (cmd == OBD_BRW_READ) { - if (!llap->llap_defer_uptodate) - SetPageUptodate(page); - } else { - llap->llap_write_queued = 0; - } - } else { - SetPageError(page); - } - - LL_CDEBUG_PAGE(page, "io complete, unlocking\n"); - - unlock_page(page); - - if (0 && cmd == OBD_BRW_WRITE) { - llap_write_complete(page->mapping->host, llap); - ll_try_done_writing(page->mapping->host); - } - - page_cache_release(page); -} - -static int ll_writepage_24(struct page *page) -{ - struct inode *inode = page->mapping->host; - struct obd_export *exp; - struct ll_async_page *llap; - int rc = 0; - ENTRY; - - LASSERT(!PageDirty(page)); - LASSERT(PageLocked(page)); - - exp = ll_i2obdexp(inode); - if (exp == NULL) - GOTO(out, rc = -EINVAL); - - llap = llap_from_page(page); - if (IS_ERR(llap)) - GOTO(out, rc = PTR_ERR(llap)); - - page_cache_get(page); - if (llap->llap_write_queued) { - LL_CDEBUG_PAGE(page, "marking urgent\n"); - rc = obd_set_async_flags(exp, ll_i2info(inode)->lli_smd, NULL, - llap->llap_cookie, - ASYNC_READY | ASYNC_URGENT); - } else { - llap->llap_write_queued = 1; - rc = obd_queue_async_io(exp, ll_i2info(inode)->lli_smd, NULL, - llap->llap_cookie, OBD_BRW_WRITE, 0, 0, - 0, ASYNC_READY | ASYNC_URGENT); - if (rc == 0) - LL_CDEBUG_PAGE(page, "mmap write queued\n"); - else - llap->llap_write_queued = 0; - } - if (rc) - page_cache_release(page); -out: - if (rc) - unlock_page(page); - RETURN(rc); -} - -static int ll_direct_IO_24(int rw, #ifdef HAVE_DIO_FILE - struct file *file, +static int ll_direct_IO_24(int rw, struct file *file, struct kiobuf *iobuf, + unsigned long blocknr, int blocksize) #else - struct inode *inode, +static int ll_direct_IO_24(int rw, struct inode *inode, struct kiobuf *iobuf, + unsigned long blocknr, int blocksize) #endif - struct kiobuf *iobuf, unsigned long blocknr, - int blocksize) { #ifdef HAVE_DIO_FILE struct inode *inode = file->f_dentry->d_inode; @@ -146,7 +64,7 @@ static int ll_direct_IO_24(int rw, struct lov_stripe_md *lsm = lli->lli_smd; struct brw_page *pga; struct ptlrpc_request_set *set; - struct obdo oa; + struct obdo *oa = NULL; int length, i, flags, rc = 0; loff_t offset; ENTRY; @@ -154,11 +72,6 @@ static int ll_direct_IO_24(int rw, if (!lsm || !lsm->lsm_object_id) RETURN(-EBADF); - /* FIXME: io smaller than PAGE_SIZE is broken on ia64 */ - if ((iobuf->offset & (PAGE_SIZE - 1)) || - (iobuf->length & (PAGE_SIZE - 1))) - RETURN(-EINVAL); - set = ptlrpc_prep_set(); if (set == NULL) RETURN(-ENOMEM); @@ -170,22 +83,29 @@ static int ll_direct_IO_24(int rw, } flags = 0 /* | OBD_BRW_DIRECTIO */; - offset = ((obd_off)blocknr << inode->i_blkbits); + offset = ((obd_off)blocknr * blocksize); length = iobuf->length; + pga[0].page_offset = iobuf->offset; + LASSERT(iobuf->offset < PAGE_SIZE); for (i = 0, length = iobuf->length; length > 0; length -= pga[i].count, offset += pga[i].count, i++) { /*i last!*/ pga[i].pg = iobuf->maplist[i]; - pga[i].off = offset; + pga[i].disk_offset = offset; /* To the end of the page, or the length, whatever is less */ - pga[i].count = min_t(int, PAGE_SIZE - (offset & ~PAGE_MASK), + pga[i].count = min_t(int, PAGE_SIZE - pga[i].page_offset, length); pga[i].flag = flags; if (rw == READ) POISON_PAGE(iobuf->maplist[i], 0x0d); } - ll_inode_fill_obdo(inode, rw, &oa); + oa = obdo_alloc(); + if (oa == NULL) { + ptlrpc_set_destroy(set); + GOTO(out_free_pga, -ENOMEM); + } + ll_inode_fill_obdo(inode, rw, oa); if (rw == WRITE) lprocfs_counter_add(ll_i2sbi(inode)->ll_stats, @@ -194,7 +114,7 @@ static int ll_direct_IO_24(int rw, lprocfs_counter_add(ll_i2sbi(inode)->ll_stats, LPROC_LL_DIRECT_READ, iobuf->length); rc = obd_brw_async(rw == WRITE ? OBD_BRW_WRITE : OBD_BRW_READ, - ll_i2obdexp(inode), &oa, lsm, iobuf->nr_pages, pga, + ll_i2obdexp(inode), oa, lsm, iobuf->nr_pages, pga, set, NULL); if (rc) { CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR, @@ -205,22 +125,32 @@ static int ll_direct_IO_24(int rw, CERROR("error from callback: rc = %d\n", rc); } ptlrpc_set_destroy(set); + if (rc == 0 && rw == WRITE) { + void lov_increase_kms(struct obd_export *, + struct lov_stripe_md *, obd_off size); + obd_off size = offset + length; + lov_increase_kms(ll_i2obdexp(inode), lsm, size); + if (size > inode->i_size) + inode->i_size = size; + } if (rc == 0) { rc = iobuf->length; - obdo_to_inode(inode, &oa, OBD_MD_FLBLOCKS); + obdo_to_inode(inode, oa, OBD_MD_FLBLOCKS); } - + obdo_free(oa); + EXIT; +out_free_pga: OBD_FREE(pga, sizeof(*pga) * iobuf->nr_pages); - RETURN(rc); + return rc; } struct address_space_operations ll_aops = { - readpage: ll_readpage, - direct_IO: ll_direct_IO_24, - writepage: ll_writepage_24, - prepare_write: ll_prepare_write, - commit_write: ll_commit_write, - removepage: ll_removepage, - sync_page: ll_sync_page, - bmap: NULL + .readpage = ll_readpage, + .direct_IO = ll_direct_IO_24, + .writepage = ll_writepage, + .prepare_write = ll_prepare_write, + .commit_write = ll_commit_write, + .removepage = ll_removepage, + .sync_page = NULL, + .bmap = NULL };