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) {