writeback.h 4.9 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * include/linux/writeback.h
L
Linus Torvalds 已提交
3 4 5 6
 */
#ifndef WRITEBACK_H
#define WRITEBACK_H

A
Alexey Dobriyan 已提交
7
#include <linux/sched.h>
J
Jens Axboe 已提交
8
#include <linux/fs.h>
A
Alexey Dobriyan 已提交
9

L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
struct backing_dev_info;

/*
 * fs/fs-writeback.c
 */
enum writeback_sync_modes {
	WB_SYNC_NONE,	/* Don't wait on anything */
	WB_SYNC_ALL,	/* Wait on every mapping */
};

/*
 * 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 {
	enum writeback_sync_modes sync_mode;
	long nr_to_write;		/* Write this many pages, and decrement
					   this for each page written */
	long pages_skipped;		/* Pages which were not written */

	/*
	 * 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.
	 */
36 37
	loff_t range_start;
	loff_t range_end;
L
Linus Torvalds 已提交
38

39
	unsigned for_kupdate:1;		/* A kupdate writeback */
40
	unsigned for_background:1;	/* A background writeback */
41
	unsigned tagged_writepages:1;	/* tag-and-write to avoid livelock */
42
	unsigned for_reclaim:1;		/* Invoked from the page allocator */
43
	unsigned range_cyclic:1;	/* range_start is cyclic */
L
Linus Torvalds 已提交
44 45 46 47 48
};

/*
 * fs/fs-writeback.c
 */	
49
struct bdi_writeback;
L
Linus Torvalds 已提交
50
int inode_wait(void *);
51
void writeback_inodes_sb(struct super_block *);
52
void writeback_inodes_sb_nr(struct super_block *, unsigned long nr);
53
int writeback_inodes_sb_if_idle(struct super_block *);
54
int writeback_inodes_sb_nr_if_idle(struct super_block *, unsigned long nr);
55
void sync_inodes_sb(struct super_block *);
56
long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages);
57 58
long wb_do_writeback(struct bdi_writeback *wb, int force_wait);
void wakeup_flusher_threads(long nr_pages);
L
Linus Torvalds 已提交
59 60 61 62 63

/* writeback.h requires fs.h; it, too, is not included from here. */
static inline void wait_on_inode(struct inode *inode)
{
	might_sleep();
C
Christoph Hellwig 已提交
64
	wait_on_bit(&inode->i_state, __I_NEW, inode_wait, TASK_UNINTERRUPTIBLE);
L
Linus Torvalds 已提交
65
}
J
Joern Engel 已提交
66 67 68 69 70 71 72
static inline void inode_sync_wait(struct inode *inode)
{
	might_sleep();
	wait_on_bit(&inode->i_state, __I_SYNC, inode_wait,
							TASK_UNINTERRUPTIBLE);
}

L
Linus Torvalds 已提交
73 74 75 76

/*
 * mm/page-writeback.c
 */
77
#ifdef CONFIG_BLOCK
78
void laptop_io_completion(struct backing_dev_info *info);
L
Linus Torvalds 已提交
79
void laptop_sync_completion(void);
80 81
void laptop_mode_sync(struct work_struct *work);
void laptop_mode_timer_fn(unsigned long data);
82 83 84
#else
static inline void laptop_sync_completion(void) { }
#endif
85
void throttle_vm_writeout(gfp_t gfp_mask);
L
Linus Torvalds 已提交
86 87 88

/* These are exported to sysctl. */
extern int dirty_background_ratio;
89
extern unsigned long dirty_background_bytes;
L
Linus Torvalds 已提交
90
extern int vm_dirty_ratio;
91
extern unsigned long vm_dirty_bytes;
92 93
extern unsigned int dirty_writeback_interval;
extern unsigned int dirty_expire_interval;
94
extern int vm_highmem_is_dirtyable;
L
Linus Torvalds 已提交
95 96 97
extern int block_dump;
extern int laptop_mode;

S
Steven Rostedt 已提交
98 99
extern unsigned long determine_dirtyable_memory(void);

100
extern int dirty_background_ratio_handler(struct ctl_table *table, int write,
101
		void __user *buffer, size_t *lenp,
102 103
		loff_t *ppos);
extern int dirty_background_bytes_handler(struct ctl_table *table, int write,
104
		void __user *buffer, size_t *lenp,
105
		loff_t *ppos);
P
Peter Zijlstra 已提交
106
extern int dirty_ratio_handler(struct ctl_table *table, int write,
107
		void __user *buffer, size_t *lenp,
P
Peter Zijlstra 已提交
108
		loff_t *ppos);
109
extern int dirty_bytes_handler(struct ctl_table *table, int write,
110
		void __user *buffer, size_t *lenp,
111
		loff_t *ppos);
P
Peter Zijlstra 已提交
112

L
Linus Torvalds 已提交
113
struct ctl_table;
114
int dirty_writeback_centisecs_handler(struct ctl_table *, int,
L
Linus Torvalds 已提交
115 116
				      void __user *, size_t *, loff_t *);

117 118 119
void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty);
unsigned long bdi_dirty_limit(struct backing_dev_info *bdi,
			       unsigned long dirty);
120

121 122 123
void __bdi_update_bandwidth(struct backing_dev_info *bdi,
			    unsigned long start_time);

L
Linus Torvalds 已提交
124
void page_writeback_init(void);
125 126 127 128 129 130 131 132 133
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);
}

134 135 136 137 138
typedef int (*writepage_t)(struct page *page, struct writeback_control *wbc,
				void *data);

int generic_writepages(struct address_space *mapping,
		       struct writeback_control *wbc);
139 140
void tag_pages_for_writeback(struct address_space *mapping,
			     pgoff_t start, pgoff_t end);
141 142 143
int write_cache_pages(struct address_space *mapping,
		      struct writeback_control *wbc, writepage_t writepage,
		      void *data);
L
Linus Torvalds 已提交
144
int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
145
void set_page_dirty_balance(struct page *page, int page_mkwrite);
146
void writeback_set_ratelimit(void);
N
Namhyung Kim 已提交
147 148
void tag_pages_for_writeback(struct address_space *mapping,
			     pgoff_t start, pgoff_t end);
L
Linus Torvalds 已提交
149 150 151 152 153 154 155

/* pdflush.c */
extern int nr_pdflush_threads;	/* Global so it can be exported to sysctl
				   read-only. */


#endif		/* WRITEBACK_H */