diff --git a/lustre/obdfilter/filter_io_26.c b/lustre/obdfilter/filter_io_26.c index 848025d66d02f92ebcb28578933e131505027963..7b860920ee0799828a8c798dc85225565f4de2b2 100644 --- a/lustre/obdfilter/filter_io_26.c +++ b/lustre/obdfilter/filter_io_26.c @@ -353,7 +353,8 @@ int filter_direct_io(int rw, struct dentry *dchild, void *iobuf, 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); @@ -366,11 +367,16 @@ int filter_direct_io(int rw, struct dentry *dchild, void *iobuf, 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) {