int ext3_map_inode_page(struct inode *inode, struct page *page,
unsigned long *blocks, int *created, int create);
/* Must be called with i_sem taken; this will drop it */
-static int filter_direct_io(int rw, struct inode *inode, struct kiobuf *iobuf)
+static int filter_direct_io(int rw, struct inode *inode, struct kiobuf *iobuf,
+ struct obd_device *obd, struct obd_trans_info *oti)
{
struct page *page;
unsigned long *b = iobuf->blocks;
up(&inode->i_sem);
cleanup_phase = 3;
+ rc = fsfilt_commit_async(obd, inode, &oti->oti_handle);
+ GOTO(cleanup, rc);
+
rc = brw_kiovec(WRITE, 1, &iobuf, inode->i_dev, iobuf->blocks,
1 << inode->i_blkbits);
CDEBUG(D_INFO, "tried to write %d pages, rc = %d\n",
if (time_after(jiffies, now + 15 * HZ))
CERROR("slow brw_start %lus\n", (jiffies - now) / HZ);
- rc = filter_direct_io(OBD_BRW_WRITE, inode, iobuf);
+ rc = filter_direct_io(OBD_BRW_WRITE, inode, iobuf, obd, oti);
if (rc == 0) {
lock_kernel();
inode_update_time(inode, 1);
CERROR("slow direct_io %lus\n", (jiffies - now) / HZ);
rc = filter_finish_transno(exp, oti, rc);
- err = fsfilt_commit(obd, inode, oti->oti_handle, obd_sync_filter);
+ err = fsfilt_commit_wait(obd, inode, oti->oti_handle);
if (err)
rc = err;
if (obd_sync_filter)