Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / include / linux / writeback.h
index e445007..56f92fc 100644 (file)
@@ -14,11 +14,13 @@ extern struct list_head inode_unused;
  * Yes, writeback.h requires sched.h
  * No, sched.h is not included from here.
  */
-static inline int current_is_pdflush(void)
+static inline int task_is_pdflush(struct task_struct *task)
 {
-       return current->flags & PF_FLUSHER;
+       return task->flags & PF_FLUSHER;
 }
 
+#define current_is_pdflush()   task_is_pdflush(current)
+
 /*
  * fs/fs-writeback.c
  */
@@ -29,7 +31,9 @@ enum writeback_sync_modes {
 };
 
 /*
- * A control structure which tells the writeback code what to do
+ * A control structure which tells the writeback code what to do.  These are
+ * always on the stack, and hence need no locking.  They are always initialised
+ * in a manner such that unspecified fields are set to zero.
  */
 struct writeback_control {
        struct backing_dev_info *bdi;   /* If !NULL, only write back this
@@ -40,46 +44,52 @@ struct writeback_control {
        long nr_to_write;               /* Write this many pages, and decrement
                                           this for each page written */
        long pages_skipped;             /* Pages which were not written */
-       int nonblocking;                /* Don't get stuck on request queues */
-       int encountered_congestion;     /* An output: a queue is full */
-       int for_kupdate;                /* A kupdate writeback */
-       int for_reclaim;                /* Invoked from the page allocator */
-};
 
-/*
- * ->writepage() return values (make these much larger than a pagesize, in
- * case some fs is returning number-of-bytes-written from writepage)
- */
-#define WRITEPAGE_ACTIVATE     0x80000 /* IO was not started: activate page */
+       /*
+        * For a_ops->writepages(): is start or end are non-zero then this is
+        * a hint that the filesystem need only write out the pages inside that
+        * byterange.  The byte at `end' is included in the writeout request.
+        */
+       loff_t start;
+       loff_t end;
+
+       unsigned nonblocking:1;         /* Don't get stuck on request queues */
+       unsigned encountered_congestion:1; /* An output: a queue is full */
+       unsigned for_kupdate:1;         /* A kupdate writeback */
+       unsigned for_reclaim:1;         /* Invoked from the page allocator */
+       unsigned for_writepages:1;      /* This is a writepages() call */
+};
 
 /*
  * fs/fs-writeback.c
  */    
 void writeback_inodes(struct writeback_control *wbc);
 void wake_up_inode(struct inode *inode);
-void __wait_on_inode(struct inode * inode);
+int inode_wait(void *);
 void sync_inodes_sb(struct super_block *, int wait);
 void sync_inodes(int wait);
 
 /* writeback.h requires fs.h; it, too, is not included from here. */
 static inline void wait_on_inode(struct inode *inode)
 {
-       if (inode->i_state & I_LOCK)
-               __wait_on_inode(inode);
+       might_sleep();
+       wait_on_bit(&inode->i_state, __I_LOCK, inode_wait,
+                                                       TASK_UNINTERRUPTIBLE);
 }
 
 /*
  * mm/page-writeback.c
  */
-int wakeup_bdflush(long nr_pages);
+int wakeup_pdflush(long nr_pages);
 void laptop_io_completion(void);
 void laptop_sync_completion(void);
+void throttle_vm_writeout(void);
 
 /* These are exported to sysctl. */
 extern int dirty_background_ratio;
 extern int vm_dirty_ratio;
-extern int dirty_writeback_centisecs;
-extern int dirty_expire_centisecs;
+extern int dirty_writeback_interval;
+extern int dirty_expire_interval;
 extern int block_dump;
 extern int laptop_mode;
 
@@ -89,9 +99,21 @@ int dirty_writeback_centisecs_handler(struct ctl_table *, int, struct file *,
                                      void __user *, size_t *, loff_t *);
 
 void page_writeback_init(void);
-void balance_dirty_pages_ratelimited(struct address_space *mapping);
+void balance_dirty_pages_ratelimited_nr(struct address_space *mapping,
+                                       unsigned long nr_pages_dirtied);
+
+static inline void
+balance_dirty_pages_ratelimited(struct address_space *mapping)
+{
+       balance_dirty_pages_ratelimited_nr(mapping, 1);
+}
+
 int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
 int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
+int sync_page_range(struct inode *inode, struct address_space *mapping,
+                       loff_t pos, loff_t count);
+int sync_page_range_nolock(struct inode *inode, struct address_space *mapping,
+                          loff_t pos, loff_t count);
 
 /* pdflush.c */
 extern int nr_pdflush_threads; /* Global so it can be exported to sysctl