#include <linux/lustre_fsfilt.h>
#include "filter_internal.h"
-#warning "implement writeback mode -bzzz"
-
/* 512byte block min */
#define MAX_BLOCKS_PER_PAGE (PAGE_SIZE / 512)
struct dio_request {
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,
rc = dreq->dr_error;
RETURN(rc);
}
-
+
/* 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
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,
rc2 = filter_finish_transno(exp, oti, 0);
if (rc2 != 0)
CERROR("can't close transaction: %d\n", rc);
+ rc = (rc == 0) ? rc2 : rc;
+
+ rc2 = fsfilt_commit_async(obd,inode,oti->oti_handle,wait_handle);
+ rc = (rc == 0) ? rc2 : rc;
- if (rc == 0)
- rc = rc2;
if (rc != 0)
RETURN(rc);
}
unsigned long now = jiffies;
int i, err, cleanup_phase = 0;
struct obd_device *obd = exp->exp_obd;
+ void *wait_handle = NULL;
int total_size = 0;
+ loff_t old_size;
ENTRY;
LASSERT(oti != NULL);
cleanup_phase = 2;
down(&inode->i_sem);
+ old_size = inode->i_size;
oti->oti_handle = fsfilt_brw_start(obd, objcount, &fso, niocount, res,
oti);
if (IS_ERR(oti->oti_handle)) {
iattr_from_obdo(&iattr,oa,OBD_MD_FLATIME|OBD_MD_FLMTIME|OBD_MD_FLCTIME);
/* filter_direct_io drops i_sem */
rc = filter_direct_io(OBD_BRW_WRITE, res->dentry, dreq, exp, &iattr,
- oti, NULL);
+ oti, &wait_handle);
+
+#if 0
+ if (inode->i_size != old_size) {
+ struct llog_cookie *cookie = obdo_logcookie(oa);
+ struct lustre_id *id = obdo_id(oa);
+ filter_log_sz_change(obd, id, oa->o_easize, cookie, inode);
+ }
+#endif
+
if (rc == 0)
obdo_from_inode(oa, inode, FILTER_VALID_FLAGS);
fsfilt_check_slow(now, obd_timeout, "direct_io");
- err = fsfilt_commit(obd, obd->u.filter.fo_sb, inode, oti->oti_handle,
- obd_sync_filter);
- if (err)
+ err = fsfilt_commit_wait(obd, inode, wait_handle);
+ if (rc == 0)
rc = err;
- if (obd_sync_filter && !err)
- LASSERTF(oti->oti_transno <= obd->obd_last_committed,
- "oti_transno "LPU64" last_committed "LPU64"\n",
- oti->oti_transno, obd->obd_last_committed);
-
fsfilt_check_slow(now, obd_timeout, "commitrw commit");
cleanup: