diff options
author | Badari Pulavarty <pbadari@us.ibm.com> | 2006-03-26 04:38:02 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-26 11:57:01 -0500 |
commit | 1d8fa7a2b9a39d18727acc5c468e870df606c852 (patch) | |
tree | 41537fe9ea5478f3243e3301184dc13980f8201f /fs/direct-io.c | |
parent | fa30bd058b746c0e2318a77ff8b4977faa924c2c (diff) |
[PATCH] remove ->get_blocks() support
Now that get_block() can handle mapping multiple disk blocks, no need to have
->get_blocks(). This patch removes fs specific ->get_blocks() added for DIO
and makes it users use get_block() instead.
Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r-- | fs/direct-io.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c index 235ed8d1f11e..9d1d2aa73e42 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -86,12 +86,12 @@ struct dio { | |||
86 | unsigned first_block_in_page; /* doesn't change, Used only once */ | 86 | unsigned first_block_in_page; /* doesn't change, Used only once */ |
87 | int boundary; /* prev block is at a boundary */ | 87 | int boundary; /* prev block is at a boundary */ |
88 | int reap_counter; /* rate limit reaping */ | 88 | int reap_counter; /* rate limit reaping */ |
89 | get_blocks_t *get_blocks; /* block mapping function */ | 89 | get_block_t *get_block; /* block mapping function */ |
90 | dio_iodone_t *end_io; /* IO completion function */ | 90 | dio_iodone_t *end_io; /* IO completion function */ |
91 | sector_t final_block_in_bio; /* current final block in bio + 1 */ | 91 | sector_t final_block_in_bio; /* current final block in bio + 1 */ |
92 | sector_t next_block_for_io; /* next block to be put under IO, | 92 | sector_t next_block_for_io; /* next block to be put under IO, |
93 | in dio_blocks units */ | 93 | in dio_blocks units */ |
94 | struct buffer_head map_bh; /* last get_blocks() result */ | 94 | struct buffer_head map_bh; /* last get_block() result */ |
95 | 95 | ||
96 | /* | 96 | /* |
97 | * Deferred addition of a page to the dio. These variables are | 97 | * Deferred addition of a page to the dio. These variables are |
@@ -211,9 +211,9 @@ static struct page *dio_get_page(struct dio *dio) | |||
211 | 211 | ||
212 | /* | 212 | /* |
213 | * Called when all DIO BIO I/O has been completed - let the filesystem | 213 | * Called when all DIO BIO I/O has been completed - let the filesystem |
214 | * know, if it registered an interest earlier via get_blocks. Pass the | 214 | * know, if it registered an interest earlier via get_block. Pass the |
215 | * private field of the map buffer_head so that filesystems can use it | 215 | * private field of the map buffer_head so that filesystems can use it |
216 | * to hold additional state between get_blocks calls and dio_complete. | 216 | * to hold additional state between get_block calls and dio_complete. |
217 | */ | 217 | */ |
218 | static void dio_complete(struct dio *dio, loff_t offset, ssize_t bytes) | 218 | static void dio_complete(struct dio *dio, loff_t offset, ssize_t bytes) |
219 | { | 219 | { |
@@ -493,7 +493,7 @@ static int dio_bio_reap(struct dio *dio) | |||
493 | * The fs is allowed to map lots of blocks at once. If it wants to do that, | 493 | * The fs is allowed to map lots of blocks at once. If it wants to do that, |
494 | * it uses the passed inode-relative block number as the file offset, as usual. | 494 | * it uses the passed inode-relative block number as the file offset, as usual. |
495 | * | 495 | * |
496 | * get_blocks() is passed the number of i_blkbits-sized blocks which direct_io | 496 | * get_block() is passed the number of i_blkbits-sized blocks which direct_io |
497 | * has remaining to do. The fs should not map more than this number of blocks. | 497 | * has remaining to do. The fs should not map more than this number of blocks. |
498 | * | 498 | * |
499 | * If the fs has mapped a lot of blocks, it should populate bh->b_size to | 499 | * If the fs has mapped a lot of blocks, it should populate bh->b_size to |
@@ -506,7 +506,7 @@ static int dio_bio_reap(struct dio *dio) | |||
506 | * In the case of filesystem holes: the fs may return an arbitrarily-large | 506 | * In the case of filesystem holes: the fs may return an arbitrarily-large |
507 | * hole by returning an appropriate value in b_size and by clearing | 507 | * hole by returning an appropriate value in b_size and by clearing |
508 | * buffer_mapped(). However the direct-io code will only process holes one | 508 | * buffer_mapped(). However the direct-io code will only process holes one |
509 | * block at a time - it will repeatedly call get_blocks() as it walks the hole. | 509 | * block at a time - it will repeatedly call get_block() as it walks the hole. |
510 | */ | 510 | */ |
511 | static int get_more_blocks(struct dio *dio) | 511 | static int get_more_blocks(struct dio *dio) |
512 | { | 512 | { |
@@ -548,7 +548,8 @@ static int get_more_blocks(struct dio *dio) | |||
548 | * at a higher level for inside-i_size block-instantiating | 548 | * at a higher level for inside-i_size block-instantiating |
549 | * writes. | 549 | * writes. |
550 | */ | 550 | */ |
551 | ret = (*dio->get_blocks)(dio->inode, fs_startblk, fs_count, | 551 | map_bh->b_size = fs_count << dio->blkbits; |
552 | ret = (*dio->get_block)(dio->inode, fs_startblk, | ||
552 | map_bh, create); | 553 | map_bh, create); |
553 | } | 554 | } |
554 | return ret; | 555 | return ret; |
@@ -783,11 +784,11 @@ static void dio_zero_block(struct dio *dio, int end) | |||
783 | * happily perform page-sized but 512-byte aligned IOs. It is important that | 784 | * happily perform page-sized but 512-byte aligned IOs. It is important that |
784 | * blockdev IO be able to have fine alignment and large sizes. | 785 | * blockdev IO be able to have fine alignment and large sizes. |
785 | * | 786 | * |
786 | * So what we do is to permit the ->get_blocks function to populate bh.b_size | 787 | * So what we do is to permit the ->get_block function to populate bh.b_size |
787 | * with the size of IO which is permitted at this offset and this i_blkbits. | 788 | * with the size of IO which is permitted at this offset and this i_blkbits. |
788 | * | 789 | * |
789 | * For best results, the blockdev should be set up with 512-byte i_blkbits and | 790 | * For best results, the blockdev should be set up with 512-byte i_blkbits and |
790 | * it should set b_size to PAGE_SIZE or more inside get_blocks(). This gives | 791 | * it should set b_size to PAGE_SIZE or more inside get_block(). This gives |
791 | * fine alignment but still allows this function to work in PAGE_SIZE units. | 792 | * fine alignment but still allows this function to work in PAGE_SIZE units. |
792 | */ | 793 | */ |
793 | static int do_direct_IO(struct dio *dio) | 794 | static int do_direct_IO(struct dio *dio) |
@@ -947,7 +948,7 @@ out: | |||
947 | static ssize_t | 948 | static ssize_t |
948 | direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, | 949 | direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, |
949 | const struct iovec *iov, loff_t offset, unsigned long nr_segs, | 950 | const struct iovec *iov, loff_t offset, unsigned long nr_segs, |
950 | unsigned blkbits, get_blocks_t get_blocks, dio_iodone_t end_io, | 951 | unsigned blkbits, get_block_t get_block, dio_iodone_t end_io, |
951 | struct dio *dio) | 952 | struct dio *dio) |
952 | { | 953 | { |
953 | unsigned long user_addr; | 954 | unsigned long user_addr; |
@@ -969,7 +970,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, | |||
969 | 970 | ||
970 | dio->boundary = 0; | 971 | dio->boundary = 0; |
971 | dio->reap_counter = 0; | 972 | dio->reap_counter = 0; |
972 | dio->get_blocks = get_blocks; | 973 | dio->get_block = get_block; |
973 | dio->end_io = end_io; | 974 | dio->end_io = end_io; |
974 | dio->map_bh.b_private = NULL; | 975 | dio->map_bh.b_private = NULL; |
975 | dio->final_block_in_bio = -1; | 976 | dio->final_block_in_bio = -1; |
@@ -1177,7 +1178,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, | |||
1177 | ssize_t | 1178 | ssize_t |
1178 | __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | 1179 | __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, |
1179 | struct block_device *bdev, const struct iovec *iov, loff_t offset, | 1180 | struct block_device *bdev, const struct iovec *iov, loff_t offset, |
1180 | unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io, | 1181 | unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, |
1181 | int dio_lock_type) | 1182 | int dio_lock_type) |
1182 | { | 1183 | { |
1183 | int seg; | 1184 | int seg; |
@@ -1273,7 +1274,7 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
1273 | (end > i_size_read(inode))); | 1274 | (end > i_size_read(inode))); |
1274 | 1275 | ||
1275 | retval = direct_io_worker(rw, iocb, inode, iov, offset, | 1276 | retval = direct_io_worker(rw, iocb, inode, iov, offset, |
1276 | nr_segs, blkbits, get_blocks, end_io, dio); | 1277 | nr_segs, blkbits, get_block, end_io, dio); |
1277 | 1278 | ||
1278 | if (rw == READ && dio_lock_type == DIO_LOCKING) | 1279 | if (rw == READ && dio_lock_type == DIO_LOCKING) |
1279 | release_i_mutex = 0; | 1280 | release_i_mutex = 0; |