+static int obdfs_enqueue_pages(struct inode *inode, struct obdo **obdo,
+ int nr_slots, struct page **pages, char **bufs,
+ obd_size *counts, obd_off *offsets,
+ obd_flag *flag, int check_time)
+{
+ struct list_head *page_list = obdfs_iplist(inode);
+ struct list_head *tmp;
+ int i = 0;
+
+ ENTRY;
+ if (list_empty(obdfs_iplist(inode))) {
+ list_del(obdfs_islist(inode));
+ CDEBUG(D_INODE, "empty list\n");
+ EXIT;
+ return 0;
+ }
+
+ *obdo = obdo_fromid(IID(inode), inode->i_ino, OBD_MD_FLNOTOBD);
+ if ( IS_ERR(*obdo) ) {
+ EXIT;
+ return PTR_ERR(*obdo);
+ }
+
+ obdfs_from_inode(*obdo, inode);
+ *flag = OBD_BRW_CREATE;
+
+ tmp = page_list;
+ while ( (tmp = tmp->next) != page_list && (i < nr_slots) ) {
+ struct obdfs_pgrq *req;
+ struct page *page;
+
+ req = list_entry(tmp, struct obdfs_pgrq, rq_plist);
+ /* remove request from list before write to avoid conflict */
+ obdfs_pgrq_del(req);
+ page = req->rq_page;
+
+ if ( !page ) {
+ CDEBUG(D_INODE, "no page \n");
+ EXIT;
+ return 0;
+ }
+
+ if (check_time &&
+ req->rq_jiffies > (jiffies - pupd_prm.age_buffer))
+ continue;
+
+ CDEBUG(D_INODE, "adding page %p to vector\n", page);
+ bufs[i] = (char *)page_address(page);
+ pages[i] = page;
+ counts[i] = PAGE_SIZE;
+ offsets[i] = ((obd_off)page->index) << PAGE_SHIFT;
+ i++;
+ }
+
+ /* If no more pages for this inode, remove from superblock list */
+ if ( list_empty(obdfs_iplist(inode)) )
+ list_del(obdfs_islist(inode));
+
+ EXIT;
+ return i;
+}
+
+