diff options
Diffstat (limited to 'mm/backing-dev.c')
| -rw-r--r-- | mm/backing-dev.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 0e8ca034770..707d0dc6da0 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -11,6 +11,8 @@  #include <linux/writeback.h>  #include <linux/device.h> +static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); +  void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)  {  } @@ -25,6 +27,11 @@ struct backing_dev_info default_backing_dev_info = {  };  EXPORT_SYMBOL_GPL(default_backing_dev_info); +struct backing_dev_info noop_backing_dev_info = { +	.name		= "noop", +}; +EXPORT_SYMBOL_GPL(noop_backing_dev_info); +  static struct class *bdi_class;  /* @@ -227,6 +234,9 @@ static struct device_attribute bdi_dev_attrs[] = {  static __init int bdi_class_init(void)  {  	bdi_class = class_create(THIS_MODULE, "bdi"); +	if (IS_ERR(bdi_class)) +		return PTR_ERR(bdi_class); +  	bdi_class->dev_attrs = bdi_dev_attrs;  	bdi_debug_init();  	return 0; @@ -712,6 +722,33 @@ void bdi_destroy(struct backing_dev_info *bdi)  }  EXPORT_SYMBOL(bdi_destroy); +/* + * For use from filesystems to quickly init and register a bdi associated + * with dirty writeback + */ +int bdi_setup_and_register(struct backing_dev_info *bdi, char *name, +			   unsigned int cap) +{ +	char tmp[32]; +	int err; + +	bdi->name = name; +	bdi->capabilities = cap; +	err = bdi_init(bdi); +	if (err) +		return err; + +	sprintf(tmp, "%.28s%s", name, "-%d"); +	err = bdi_register(bdi, NULL, tmp, atomic_long_inc_return(&bdi_seq)); +	if (err) { +		bdi_destroy(bdi); +		return err; +	} + +	return 0; +} +EXPORT_SYMBOL(bdi_setup_and_register); +  static wait_queue_head_t congestion_wqh[2] = {  		__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),  		__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])  |