request_queue_t *q = bdev_get_queue(bio->bi_bdev);
/* Dang! I have to fragment this I/O */
- CDEBUG(D_INODE, "bio++ sz %d vcnt %d(%d) "
+ CDEBUG(D_INODE|D_ERROR, "bio++ sz %d vcnt %d(%d) "
"sectors %d(%d) psg %d(%d) hsg %d(%d)\n",
bio->bi_size,
bio->bi_vcnt, bio->bi_max_vecs,
RETURN(rc);
}
-static void check_metadata(struct super_block *sb, sector_t block)
-{
- struct inode *bd_inode = sb->s_bdev->bd_inode;
- struct address_space *bd_mapping = bd_inode->i_mapping;
- pgoff_t index;
- struct buffer_head *bh;
- struct buffer_head *head;
- struct page *page;
-
- index = block >> (PAGE_CACHE_SHIFT - bd_inode->i_blkbits);
- page = find_get_page(bd_mapping, index);
- if (!page)
- return;
-
- if (PageDirty(page))
- CERROR("page 0x%p/%lu in mapping 0x%p is dirty\n",
- page, page->index, bd_mapping);
-
- spin_lock(&bd_mapping->private_lock);
- if (!page_has_buffers(page))
- goto out_unlock;
- head = page_buffers(page);
- bh = head;
- do {
- if (buffer_dirty(bh))
- CERROR("buffer 0x%p in page 0x%p/%lu/%u is dirty (0x%p)\n",
- bh, page, page->index, (unsigned) block,
- page->mapping);
- bh = bh->b_this_page;
- } while (bh != head);
-
-out_unlock:
- spin_unlock(&bd_mapping->private_lock);
- page_cache_release(page);
- return;
-}
-
/* These are our hacks to keep our directio/bh IO coherent with ext3's
* page cache use. Most notably ext3 reads file data into the page
* cache when it is zeroing the tail of partial-block truncates and
unlock_page(page);
page_cache_release(page);
-
- if (iobuf->dr_blocks[i])
- check_metadata(inode->i_sb, iobuf->dr_blocks[i]);
}
return 0;
}
struct obd_device *obd = exp->exp_obd;
struct inode *inode = dchild->d_inode;
struct dio_request *dreq = iobuf;
- int rc, rc2;
+ struct semaphore *sem = NULL;
+ int rc, rc2, create = 0;
ENTRY;
LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw);
if (dreq->dr_npages > OBDFILTER_CREATED_SCRATCHPAD_ENTRIES)
RETURN(-EINVAL);
+ if (rw == OBD_BRW_WRITE) {
+ create = 1;
+ //sem = &obd->u.filter.fo_alloc_lock;
+ }
+
rc = fsfilt_map_inode_pages(obd, inode,
dreq->dr_pages, dreq->dr_npages,
dreq->dr_blocks,
obdfilter_created_scratchpad,
- rw == OBD_BRW_WRITE, NULL);
+ create, sem);
if (rw == OBD_BRW_WRITE) {
if (rc == 0) {
-#if 0
- filter_tally_write(&obd->u.filter,
- dreq->dr_pages,
- dreq->dr_page_idx,
- dreq->dr_blocks,
+ int blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
+ filter_tally_write(&obd->u.filter, dreq->dr_pages,
+ dreq->dr_npages, dreq->dr_blocks,
blocks_per_page);
-#endif
if (attr->ia_size > inode->i_size)
attr->ia_valid |= ATTR_SIZE;
rc = fsfilt_setattr(obd, dchild,
err = fsfilt_commit_wait(obd, inode, wait_handle);
if (rc == 0)
rc = err;
-
+
fsfilt_check_slow(now, obd_timeout, "commitrw commit");
cleanup: