writeback.h 5.5 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
struct backing_dev_info;

extern spinlock_t inode_lock;
extern struct list_head inode_in_use;
extern struct list_head inode_unused;

/*
 * Yes, writeback.h requires sched.h
 * No, sched.h is not included from here.
 */
20
static inline int task_is_pdflush(struct task_struct *task)
L
Linus Torvalds 已提交
21
{
22
	return task->flags & PF_FLUSHER;
L
Linus Torvalds 已提交
23 24
}

25 26
#define current_is_pdflush()	task_is_pdflush(current)

L
Linus Torvalds 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/*
 * 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 {
	struct backing_dev_info *bdi;	/* If !NULL, only write back this
					   queue */
	enum writeback_sync_modes sync_mode;
	unsigned long *older_than_this;	/* If !NULL, only write back inodes
					   older than this */
	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.
	 */
55 56
	loff_t range_start;
	loff_t range_end;
L
Linus Torvalds 已提交
57

58 59 60 61 62
	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 */
63
	unsigned range_cyclic:1;	/* range_start is cyclic */
64
	unsigned more_io:1;		/* more io to be dispatched */
65 66 67 68 69 70 71 72 73
	/*
	 * write_cache_pages() won't update wbc->nr_to_write and
	 * mapping->writeback_index if no_nrwrite_index_update
	 * is set.  write_cache_pages() may write more than we
	 * requested and we want to make sure nr_to_write and
	 * writeback_index are updated in a consistent manner
	 * so we use a single control to update them
	 */
	unsigned no_nrwrite_index_update:1;
L
Linus Torvalds 已提交
74 75 76 77 78 79 80
};

/*
 * fs/fs-writeback.c
 */	
void writeback_inodes(struct writeback_control *wbc);
int inode_wait(void *);
81 82
long writeback_inodes_sb(struct super_block *);
long sync_inodes_sb(struct super_block *);
L
Linus Torvalds 已提交
83 84 85 86 87 88 89 90

/* writeback.h requires fs.h; it, too, is not included from here. */
static inline void wait_on_inode(struct inode *inode)
{
	might_sleep();
	wait_on_bit(&inode->i_state, __I_LOCK, inode_wait,
							TASK_UNINTERRUPTIBLE);
}
J
Joern Engel 已提交
91 92 93 94 95 96 97
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 已提交
98 99 100 101

/*
 * mm/page-writeback.c
 */
102
int wakeup_pdflush(long nr_pages);
L
Linus Torvalds 已提交
103 104
void laptop_io_completion(void);
void laptop_sync_completion(void);
105
void throttle_vm_writeout(gfp_t gfp_mask);
L
Linus Torvalds 已提交
106 107 108

/* These are exported to sysctl. */
extern int dirty_background_ratio;
109
extern unsigned long dirty_background_bytes;
L
Linus Torvalds 已提交
110
extern int vm_dirty_ratio;
111
extern unsigned long vm_dirty_bytes;
112 113
extern unsigned int dirty_writeback_interval;
extern unsigned int dirty_expire_interval;
114
extern int vm_highmem_is_dirtyable;
L
Linus Torvalds 已提交
115 116 117
extern int block_dump;
extern int laptop_mode;

S
Steven Rostedt 已提交
118 119
extern unsigned long determine_dirtyable_memory(void);

120 121 122 123 124 125
extern int dirty_background_ratio_handler(struct ctl_table *table, int write,
		struct file *filp, void __user *buffer, size_t *lenp,
		loff_t *ppos);
extern int dirty_background_bytes_handler(struct ctl_table *table, int write,
		struct file *filp, void __user *buffer, size_t *lenp,
		loff_t *ppos);
P
Peter Zijlstra 已提交
126 127 128
extern int dirty_ratio_handler(struct ctl_table *table, int write,
		struct file *filp, void __user *buffer, size_t *lenp,
		loff_t *ppos);
129 130 131
extern int dirty_bytes_handler(struct ctl_table *table, int write,
		struct file *filp, void __user *buffer, size_t *lenp,
		loff_t *ppos);
P
Peter Zijlstra 已提交
132

L
Linus Torvalds 已提交
133 134 135 136 137
struct ctl_table;
struct file;
int dirty_writeback_centisecs_handler(struct ctl_table *, int, struct file *,
				      void __user *, size_t *, loff_t *);

138 139
void get_dirty_limits(unsigned long *pbackground, unsigned long *pdirty,
		      unsigned long *pbdi_dirty, struct backing_dev_info *bdi);
140

L
Linus Torvalds 已提交
141
void page_writeback_init(void);
142 143 144 145 146 147 148 149 150
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);
}

151 152 153
typedef int (*writepage_t)(struct page *page, struct writeback_control *wbc,
				void *data);

L
Linus Torvalds 已提交
154
int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
155 156 157 158 159
int generic_writepages(struct address_space *mapping,
		       struct writeback_control *wbc);
int write_cache_pages(struct address_space *mapping,
		      struct writeback_control *wbc, writepage_t writepage,
		      void *data);
L
Linus Torvalds 已提交
160 161
int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
int sync_page_range(struct inode *inode, struct address_space *mapping,
162 163 164
			loff_t pos, loff_t count);
int sync_page_range_nolock(struct inode *inode, struct address_space *mapping,
			   loff_t pos, loff_t count);
165
void set_page_dirty_balance(struct page *page, int page_mkwrite);
166
void writeback_set_ratelimit(void);
L
Linus Torvalds 已提交
167 168 169 170 171 172 173

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


#endif		/* WRITEBACK_H */