vserver 1.9.3
[linux-2.6.git] / include / linux / writeback.h
index e445007..7c165c3 100644 (file)
@@ -29,7 +29,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,10 +42,19 @@ 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 */
+
+       /*
+        * 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 */
 };
 
 /*
@@ -64,6 +75,7 @@ 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)
 {
+       might_sleep();
        if (inode->i_state & I_LOCK)
                __wait_on_inode(inode);
 }
@@ -92,6 +104,8 @@ void page_writeback_init(void);
 void balance_dirty_pages_ratelimited(struct address_space *mapping);
 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, size_t count);
 
 /* pdflush.c */
 extern int nr_pdflush_threads; /* Global so it can be exported to sysctl