Whamcloud - gitweb
- debug info to investigate a source of small writes
[fs/lustre-release.git] / lustre / obdfilter / filter_io_26.c
index 15de692..5577c03 100644 (file)
@@ -233,7 +233,7 @@ int filter_do_bio(struct obd_device *obd, struct inode *inode,
                                 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,
@@ -296,43 +296,6 @@ int filter_do_bio(struct obd_device *obd, struct inode *inode,
         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
@@ -379,9 +342,6 @@ static int filter_clear_page_cache(struct inode *inode,
   
                 unlock_page(page);
                 page_cache_release(page);
-
-                if (iobuf->dr_blocks[i])
-                        check_metadata(inode->i_sb, iobuf->dr_blocks[i]);
         }
         return 0;
 }
@@ -393,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);
@@ -406,21 +367,23 @@ 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) {
-#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, 
@@ -574,7 +537,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
         err = fsfilt_commit_wait(obd, inode, wait_handle);
         if (rc == 0)
                 rc = err;
-   
+
         fsfilt_check_slow(now, obd_timeout, "commitrw commit");
 
 cleanup: