diff options
| -rw-r--r-- | block/cfq-iosched.c | 7 | ||||
| -rw-r--r-- | block/compat_ioctl.c | 2 | ||||
| -rw-r--r-- | block/ll_rw_blk.c | 41 | ||||
| -rw-r--r-- | drivers/block/cciss.c | 14 | ||||
| -rw-r--r-- | drivers/block/cciss_scsi.c | 14 | ||||
| -rw-r--r-- | drivers/block/cciss_scsi.h | 14 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 2 | ||||
| -rw-r--r-- | mm/filemap.c | 1 |
8 files changed, 48 insertions, 47 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 54dc05439009..e47a9309eb48 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -1443,8 +1443,11 @@ cfq_get_queue(struct cfq_data *cfqd, int is_sync, struct task_struct *tsk, | |||
| 1443 | cfqq = *async_cfqq; | 1443 | cfqq = *async_cfqq; |
| 1444 | } | 1444 | } |
| 1445 | 1445 | ||
| 1446 | if (!cfqq) | 1446 | if (!cfqq) { |
| 1447 | cfqq = cfq_find_alloc_queue(cfqd, is_sync, tsk, gfp_mask); | 1447 | cfqq = cfq_find_alloc_queue(cfqd, is_sync, tsk, gfp_mask); |
| 1448 | if (!cfqq) | ||
| 1449 | return NULL; | ||
| 1450 | } | ||
| 1448 | 1451 | ||
| 1449 | /* | 1452 | /* |
| 1450 | * pin the queue now that it's allocated, scheduler exit will prune it | 1453 | * pin the queue now that it's allocated, scheduler exit will prune it |
| @@ -2053,7 +2056,7 @@ static void cfq_shutdown_timer_wq(struct cfq_data *cfqd) | |||
| 2053 | { | 2056 | { |
| 2054 | del_timer_sync(&cfqd->idle_slice_timer); | 2057 | del_timer_sync(&cfqd->idle_slice_timer); |
| 2055 | del_timer_sync(&cfqd->idle_class_timer); | 2058 | del_timer_sync(&cfqd->idle_class_timer); |
| 2056 | blk_sync_queue(cfqd->queue); | 2059 | kblockd_flush_work(&cfqd->unplug_work); |
| 2057 | } | 2060 | } |
| 2058 | 2061 | ||
| 2059 | static void cfq_put_async_queues(struct cfq_data *cfqd) | 2062 | static void cfq_put_async_queues(struct cfq_data *cfqd) |
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index f84093b97f70..cae0a852619e 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c | |||
| @@ -581,7 +581,7 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file, | |||
| 581 | { | 581 | { |
| 582 | int ret; | 582 | int ret; |
| 583 | 583 | ||
| 584 | switch (arg) { | 584 | switch (cmd) { |
| 585 | case HDIO_GET_UNMASKINTR: | 585 | case HDIO_GET_UNMASKINTR: |
| 586 | case HDIO_GET_MULTCOUNT: | 586 | case HDIO_GET_MULTCOUNT: |
| 587 | case HDIO_GET_KEEPSETTINGS: | 587 | case HDIO_GET_KEEPSETTINGS: |
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index b01dee3ae7f3..56f2646612e6 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | 39 | ||
| 40 | static void blk_unplug_work(struct work_struct *work); | 40 | static void blk_unplug_work(struct work_struct *work); |
| 41 | static void blk_unplug_timeout(unsigned long data); | 41 | static void blk_unplug_timeout(unsigned long data); |
| 42 | static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io); | 42 | static void drive_stat_acct(struct request *rq, int new_io); |
| 43 | static void init_request_from_bio(struct request *req, struct bio *bio); | 43 | static void init_request_from_bio(struct request *req, struct bio *bio); |
| 44 | static int __make_request(struct request_queue *q, struct bio *bio); | 44 | static int __make_request(struct request_queue *q, struct bio *bio); |
| 45 | static struct io_context *current_io_context(gfp_t gfp_flags, int node); | 45 | static struct io_context *current_io_context(gfp_t gfp_flags, int node); |
| @@ -791,7 +791,6 @@ static int __blk_free_tags(struct blk_queue_tag *bqt) | |||
| 791 | retval = atomic_dec_and_test(&bqt->refcnt); | 791 | retval = atomic_dec_and_test(&bqt->refcnt); |
| 792 | if (retval) { | 792 | if (retval) { |
| 793 | BUG_ON(bqt->busy); | 793 | BUG_ON(bqt->busy); |
| 794 | BUG_ON(!list_empty(&bqt->busy_list)); | ||
| 795 | 794 | ||
| 796 | kfree(bqt->tag_index); | 795 | kfree(bqt->tag_index); |
| 797 | bqt->tag_index = NULL; | 796 | bqt->tag_index = NULL; |
| @@ -903,7 +902,6 @@ static struct blk_queue_tag *__blk_queue_init_tags(struct request_queue *q, | |||
| 903 | if (init_tag_map(q, tags, depth)) | 902 | if (init_tag_map(q, tags, depth)) |
| 904 | goto fail; | 903 | goto fail; |
| 905 | 904 | ||
| 906 | INIT_LIST_HEAD(&tags->busy_list); | ||
| 907 | tags->busy = 0; | 905 | tags->busy = 0; |
| 908 | atomic_set(&tags->refcnt, 1); | 906 | atomic_set(&tags->refcnt, 1); |
| 909 | return tags; | 907 | return tags; |
| @@ -954,6 +952,7 @@ int blk_queue_init_tags(struct request_queue *q, int depth, | |||
| 954 | */ | 952 | */ |
| 955 | q->queue_tags = tags; | 953 | q->queue_tags = tags; |
| 956 | q->queue_flags |= (1 << QUEUE_FLAG_QUEUED); | 954 | q->queue_flags |= (1 << QUEUE_FLAG_QUEUED); |
| 955 | INIT_LIST_HEAD(&q->tag_busy_list); | ||
| 957 | return 0; | 956 | return 0; |
| 958 | fail: | 957 | fail: |
| 959 | kfree(tags); | 958 | kfree(tags); |
| @@ -1057,18 +1056,16 @@ void blk_queue_end_tag(struct request_queue *q, struct request *rq) | |||
| 1057 | 1056 | ||
| 1058 | bqt->tag_index[tag] = NULL; | 1057 | bqt->tag_index[tag] = NULL; |
| 1059 | 1058 | ||
| 1060 | /* | 1059 | if (unlikely(!test_bit(tag, bqt->tag_map))) { |
| 1061 | * We use test_and_clear_bit's memory ordering properties here. | ||
| 1062 | * The tag_map bit acts as a lock for tag_index[bit], so we need | ||
| 1063 | * a barrer before clearing the bit (precisely: release semantics). | ||
| 1064 | * Could use clear_bit_unlock when it is merged. | ||
| 1065 | */ | ||
| 1066 | if (unlikely(!test_and_clear_bit(tag, bqt->tag_map))) { | ||
| 1067 | printk(KERN_ERR "%s: attempt to clear non-busy tag (%d)\n", | 1060 | printk(KERN_ERR "%s: attempt to clear non-busy tag (%d)\n", |
| 1068 | __FUNCTION__, tag); | 1061 | __FUNCTION__, tag); |
| 1069 | return; | 1062 | return; |
| 1070 | } | 1063 | } |
| 1071 | 1064 | /* | |
| 1065 | * The tag_map bit acts as a lock for tag_index[bit], so we need | ||
| 1066 | * unlock memory barrier semantics. | ||
| 1067 | */ | ||
| 1068 | clear_bit_unlock(tag, bqt->tag_map); | ||
| 1072 | bqt->busy--; | 1069 | bqt->busy--; |
| 1073 | } | 1070 | } |
| 1074 | 1071 | ||
| @@ -1114,17 +1111,17 @@ int blk_queue_start_tag(struct request_queue *q, struct request *rq) | |||
| 1114 | if (tag >= bqt->max_depth) | 1111 | if (tag >= bqt->max_depth) |
| 1115 | return 1; | 1112 | return 1; |
| 1116 | 1113 | ||
| 1117 | } while (test_and_set_bit(tag, bqt->tag_map)); | 1114 | } while (test_and_set_bit_lock(tag, bqt->tag_map)); |
| 1118 | /* | 1115 | /* |
| 1119 | * We rely on test_and_set_bit providing lock memory ordering semantics | 1116 | * We need lock ordering semantics given by test_and_set_bit_lock. |
| 1120 | * (could use test_and_set_bit_lock when it is merged). | 1117 | * See blk_queue_end_tag for details. |
| 1121 | */ | 1118 | */ |
| 1122 | 1119 | ||
| 1123 | rq->cmd_flags |= REQ_QUEUED; | 1120 | rq->cmd_flags |= REQ_QUEUED; |
| 1124 | rq->tag = tag; | 1121 | rq->tag = tag; |
| 1125 | bqt->tag_index[tag] = rq; | 1122 | bqt->tag_index[tag] = rq; |
| 1126 | blkdev_dequeue_request(rq); | 1123 | blkdev_dequeue_request(rq); |
| 1127 | list_add(&rq->queuelist, &bqt->busy_list); | 1124 | list_add(&rq->queuelist, &q->tag_busy_list); |
| 1128 | bqt->busy++; | 1125 | bqt->busy++; |
| 1129 | return 0; | 1126 | return 0; |
| 1130 | } | 1127 | } |
| @@ -1145,11 +1142,10 @@ EXPORT_SYMBOL(blk_queue_start_tag); | |||
| 1145 | **/ | 1142 | **/ |
| 1146 | void blk_queue_invalidate_tags(struct request_queue *q) | 1143 | void blk_queue_invalidate_tags(struct request_queue *q) |
| 1147 | { | 1144 | { |
| 1148 | struct blk_queue_tag *bqt = q->queue_tags; | ||
| 1149 | struct list_head *tmp, *n; | 1145 | struct list_head *tmp, *n; |
| 1150 | struct request *rq; | 1146 | struct request *rq; |
| 1151 | 1147 | ||
| 1152 | list_for_each_safe(tmp, n, &bqt->busy_list) { | 1148 | list_for_each_safe(tmp, n, &q->tag_busy_list) { |
| 1153 | rq = list_entry_rq(tmp); | 1149 | rq = list_entry_rq(tmp); |
| 1154 | 1150 | ||
| 1155 | if (rq->tag == -1) { | 1151 | if (rq->tag == -1) { |
| @@ -1738,6 +1734,7 @@ EXPORT_SYMBOL(blk_stop_queue); | |||
| 1738 | void blk_sync_queue(struct request_queue *q) | 1734 | void blk_sync_queue(struct request_queue *q) |
| 1739 | { | 1735 | { |
| 1740 | del_timer_sync(&q->unplug_timer); | 1736 | del_timer_sync(&q->unplug_timer); |
| 1737 | kblockd_flush_work(&q->unplug_work); | ||
| 1741 | } | 1738 | } |
| 1742 | EXPORT_SYMBOL(blk_sync_queue); | 1739 | EXPORT_SYMBOL(blk_sync_queue); |
| 1743 | 1740 | ||
| @@ -2341,7 +2338,7 @@ void blk_insert_request(struct request_queue *q, struct request *rq, | |||
| 2341 | if (blk_rq_tagged(rq)) | 2338 | if (blk_rq_tagged(rq)) |
| 2342 | blk_queue_end_tag(q, rq); | 2339 | blk_queue_end_tag(q, rq); |
| 2343 | 2340 | ||
| 2344 | drive_stat_acct(rq, rq->nr_sectors, 1); | 2341 | drive_stat_acct(rq, 1); |
| 2345 | __elv_add_request(q, rq, where, 0); | 2342 | __elv_add_request(q, rq, where, 0); |
| 2346 | blk_start_queueing(q); | 2343 | blk_start_queueing(q); |
| 2347 | spin_unlock_irqrestore(q->queue_lock, flags); | 2344 | spin_unlock_irqrestore(q->queue_lock, flags); |
| @@ -2736,7 +2733,7 @@ int blkdev_issue_flush(struct block_device *bdev, sector_t *error_sector) | |||
| 2736 | 2733 | ||
| 2737 | EXPORT_SYMBOL(blkdev_issue_flush); | 2734 | EXPORT_SYMBOL(blkdev_issue_flush); |
| 2738 | 2735 | ||
| 2739 | static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io) | 2736 | static void drive_stat_acct(struct request *rq, int new_io) |
| 2740 | { | 2737 | { |
| 2741 | int rw = rq_data_dir(rq); | 2738 | int rw = rq_data_dir(rq); |
| 2742 | 2739 | ||
| @@ -2758,7 +2755,7 @@ static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io) | |||
| 2758 | */ | 2755 | */ |
| 2759 | static inline void add_request(struct request_queue * q, struct request * req) | 2756 | static inline void add_request(struct request_queue * q, struct request * req) |
| 2760 | { | 2757 | { |
| 2761 | drive_stat_acct(req, req->nr_sectors, 1); | 2758 | drive_stat_acct(req, 1); |
| 2762 | 2759 | ||
| 2763 | /* | 2760 | /* |
| 2764 | * elevator indicated where it wants this request to be | 2761 | * elevator indicated where it wants this request to be |
| @@ -3015,7 +3012,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) | |||
| 3015 | req->biotail = bio; | 3012 | req->biotail = bio; |
| 3016 | req->nr_sectors = req->hard_nr_sectors += nr_sectors; | 3013 | req->nr_sectors = req->hard_nr_sectors += nr_sectors; |
| 3017 | req->ioprio = ioprio_best(req->ioprio, prio); | 3014 | req->ioprio = ioprio_best(req->ioprio, prio); |
| 3018 | drive_stat_acct(req, nr_sectors, 0); | 3015 | drive_stat_acct(req, 0); |
| 3019 | if (!attempt_back_merge(q, req)) | 3016 | if (!attempt_back_merge(q, req)) |
| 3020 | elv_merged_request(q, req, el_ret); | 3017 | elv_merged_request(q, req, el_ret); |
| 3021 | goto out; | 3018 | goto out; |
| @@ -3042,7 +3039,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) | |||
| 3042 | req->sector = req->hard_sector = bio->bi_sector; | 3039 | req->sector = req->hard_sector = bio->bi_sector; |
| 3043 | req->nr_sectors = req->hard_nr_sectors += nr_sectors; | 3040 | req->nr_sectors = req->hard_nr_sectors += nr_sectors; |
| 3044 | req->ioprio = ioprio_best(req->ioprio, prio); | 3041 | req->ioprio = ioprio_best(req->ioprio, prio); |
| 3045 | drive_stat_acct(req, nr_sectors, 0); | 3042 | drive_stat_acct(req, 0); |
| 3046 | if (!attempt_front_merge(q, req)) | 3043 | if (!attempt_front_merge(q, req)) |
| 3047 | elv_merged_request(q, req, el_ret); | 3044 | elv_merged_request(q, req, el_ret); |
| 3048 | goto out; | 3045 | goto out; |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 5a6fe17fc638..7d704968765f 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -1,20 +1,20 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Disk Array driver for HP SA 5xxx and 6xxx Controllers | 2 | * Disk Array driver for HP Smart Array controllers. |
| 3 | * Copyright 2000, 2006 Hewlett-Packard Development Company, L.P. | 3 | * (C) Copyright 2000, 2007 Hewlett-Packard Development Company, L.P. |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; version 2 of the License. |
| 8 | * (at your option) any later version. | ||
| 9 | * | 8 | * |
| 10 | * This program is distributed in the hope that it will be useful, | 9 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | 11 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 | * NON INFRINGEMENT. See the GNU General Public License for more details. | 12 | * General Public License for more details. |
| 14 | * | 13 | * |
| 15 | * You should have received a copy of the GNU General Public License | 14 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software | 15 | * along with this program; if not, write to the Free Software |
| 17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 17 | * 02111-1307, USA. | ||
| 18 | * | 18 | * |
| 19 | * Questions/Comments/Bugfixes to iss_storagedev@hp.com | 19 | * Questions/Comments/Bugfixes to iss_storagedev@hp.com |
| 20 | * | 20 | * |
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c index 4aca7ddfdddf..63ee6c076cb3 100644 --- a/drivers/block/cciss_scsi.c +++ b/drivers/block/cciss_scsi.c | |||
| @@ -1,20 +1,20 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Disk Array driver for Compaq SA53xx Controllers, SCSI Tape module | 2 | * Disk Array driver for HP Smart Array controllers, SCSI Tape module. |
| 3 | * Copyright 2001 Compaq Computer Corporation | 3 | * (C) Copyright 2001, 2007 Hewlett-Packard Development Company, L.P. |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; version 2 of the License. |
| 8 | * (at your option) any later version. | ||
| 9 | * | 8 | * |
| 10 | * This program is distributed in the hope that it will be useful, | 9 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | 11 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 | * NON INFRINGEMENT. See the GNU General Public License for more details. | 12 | * General Public License for more details. |
| 14 | * | 13 | * |
| 15 | * You should have received a copy of the GNU General Public License | 14 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software | 15 | * along with this program; if not, write to the Free Software |
| 17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 16 | * Foundation, Inc., 59 Temple Place, Suite 300, Boston, MA |
| 17 | * 02111-1307, USA. | ||
| 18 | * | 18 | * |
| 19 | * Questions/Comments/Bugfixes to iss_storagedev@hp.com | 19 | * Questions/Comments/Bugfixes to iss_storagedev@hp.com |
| 20 | * | 20 | * |
diff --git a/drivers/block/cciss_scsi.h b/drivers/block/cciss_scsi.h index 5e7e06c07d6c..d9c2c586502f 100644 --- a/drivers/block/cciss_scsi.h +++ b/drivers/block/cciss_scsi.h | |||
| @@ -1,20 +1,20 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Disk Array driver for Compaq SA53xx Controllers, SCSI Tape module | 2 | * Disk Array driver for HP Smart Array controllers, SCSI Tape module. |
| 3 | * Copyright 2001 Compaq Computer Corporation | 3 | * (C) Copyright 2001, 2007 Hewlett-Packard Development Company, L.P. |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; version 2 of the License. |
| 8 | * (at your option) any later version. | ||
| 9 | * | 8 | * |
| 10 | * This program is distributed in the hope that it will be useful, | 9 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | 11 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 | * NON INFRINGEMENT. See the GNU General Public License for more details. | 12 | * General Public License for more details. |
| 14 | * | 13 | * |
| 15 | * You should have received a copy of the GNU General Public License | 14 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software | 15 | * along with this program; if not, write to the Free Software |
| 17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 16 | * Foundation, Inc., 59 Temple Place, Suite 300, Boston, MA |
| 17 | * 02111-1307, USA. | ||
| 18 | * | 18 | * |
| 19 | * Questions/Comments/Bugfixes to iss_storagedev@hp.com | 19 | * Questions/Comments/Bugfixes to iss_storagedev@hp.com |
| 20 | * | 20 | * |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index bbf906a0b419..8396db24d019 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -341,7 +341,6 @@ enum blk_queue_state { | |||
| 341 | struct blk_queue_tag { | 341 | struct blk_queue_tag { |
| 342 | struct request **tag_index; /* map of busy tags */ | 342 | struct request **tag_index; /* map of busy tags */ |
| 343 | unsigned long *tag_map; /* bit map of free/busy tags */ | 343 | unsigned long *tag_map; /* bit map of free/busy tags */ |
| 344 | struct list_head busy_list; /* fifo list of busy tags */ | ||
| 345 | int busy; /* current depth */ | 344 | int busy; /* current depth */ |
| 346 | int max_depth; /* what we will send to device */ | 345 | int max_depth; /* what we will send to device */ |
| 347 | int real_max_depth; /* what the array can hold */ | 346 | int real_max_depth; /* what the array can hold */ |
| @@ -435,6 +434,7 @@ struct request_queue | |||
| 435 | unsigned int dma_alignment; | 434 | unsigned int dma_alignment; |
| 436 | 435 | ||
| 437 | struct blk_queue_tag *queue_tags; | 436 | struct blk_queue_tag *queue_tags; |
| 437 | struct list_head tag_busy_list; | ||
| 438 | 438 | ||
| 439 | unsigned int nr_sorted; | 439 | unsigned int nr_sorted; |
| 440 | unsigned int in_flight; | 440 | unsigned int in_flight; |
diff --git a/mm/filemap.c b/mm/filemap.c index 5209e47b7fe3..7c8643630023 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/backing-dev.h> | 28 | #include <linux/backing-dev.h> |
| 29 | #include <linux/pagevec.h> | 29 | #include <linux/pagevec.h> |
| 30 | #include <linux/blkdev.h> | 30 | #include <linux/blkdev.h> |
| 31 | #include <linux/backing-dev.h> | ||
| 31 | #include <linux/security.h> | 32 | #include <linux/security.h> |
| 32 | #include <linux/syscalls.h> | 33 | #include <linux/syscalls.h> |
| 33 | #include <linux/cpuset.h> | 34 | #include <linux/cpuset.h> |
