2 * linux/fs/nfs/blocklayout/blocklayout.c
4 * Module for the NFSv4.1 pNFS block layout driver.
6 * Copyright (c) 2006 The Regents of the University of Michigan.
9 * Andy Adamson <andros@citi.umich.edu>
10 * Fred Isaman <iisaman@umich.edu>
12 * permission is granted to use, copy, create derivative works and
13 * redistribute this software and such derivative works for any purpose,
14 * so long as the name of the university of michigan is not used in
15 * any advertising or publicity pertaining to the use or distribution
16 * of this software without specific, written prior authorization. if
17 * the above copyright notice or any other identification of the
18 * university of michigan is included in any copy of any portion of
19 * this software, then the disclaimer below must also be included.
21 * this software is provided as is, without representation from the
22 * university of michigan as to its fitness for any purpose, and without
23 * warranty by the university of michigan of any kind, either express
24 * or implied, including without limitation the implied warranties of
25 * merchantability and fitness for a particular purpose. the regents
26 * of the university of michigan shall not be liable for any damages,
27 * including special, indirect, incidental, or consequential damages,
28 * with respect to any claim arising out or in connection with the use
29 * of the software, even if it has been or is hereafter advised of the
30 * possibility of such damages.
33 #include <linux/module.h>
34 #include <linux/init.h>
35 #include <linux/mount.h>
36 #include <linux/namei.h>
37 #include <linux/bio.h> /* struct bio */
38 #include <linux/prefetch.h>
39 #include <linux/pagevec.h>
42 #include "../nfs4session.h"
43 #include "../internal.h"
44 #include "blocklayout.h"
46 #define NFSDBG_FACILITY NFSDBG_PNFS_LD
48 MODULE_LICENSE("GPL");
49 MODULE_AUTHOR("Andy Adamson <andros@citi.umich.edu>");
50 MODULE_DESCRIPTION("The NFSv4.1 pNFS Block layout driver");
52 static bool is_hole(struct pnfs_block_extent
*be
)
54 switch (be
->be_state
) {
55 case PNFS_BLOCK_NONE_DATA
:
57 case PNFS_BLOCK_INVALID_DATA
:
58 return be
->be_tag
? false : true;
64 /* The data we are handed might be spread across several bios. We need
65 * to track when the last one is finished.
69 void (*pnfs_callback
) (void *data
);
73 static inline struct parallel_io
*alloc_parallel(void *data
)
75 struct parallel_io
*rv
;
77 rv
= kmalloc(sizeof(*rv
), GFP_NOFS
);
80 kref_init(&rv
->refcnt
);
85 static inline void get_parallel(struct parallel_io
*p
)
90 static void destroy_parallel(struct kref
*kref
)
92 struct parallel_io
*p
= container_of(kref
, struct parallel_io
, refcnt
);
94 dprintk("%s enter\n", __func__
);
95 p
->pnfs_callback(p
->data
);
99 static inline void put_parallel(struct parallel_io
*p
)
101 kref_put(&p
->refcnt
, destroy_parallel
);
105 bl_submit_bio(struct bio
*bio
)
108 get_parallel(bio
->bi_private
);
109 dprintk("%s submitting %s bio %u@%llu\n", __func__
,
110 bio_op(bio
) == READ
? "read" : "write",
111 bio
->bi_iter
.bi_size
,
112 (unsigned long long)bio
->bi_iter
.bi_sector
);
119 bl_alloc_init_bio(int npg
, struct block_device
*bdev
, sector_t disk_sector
,
120 bio_end_io_t end_io
, struct parallel_io
*par
)
124 npg
= min(npg
, BIO_MAX_PAGES
);
125 bio
= bio_alloc(GFP_NOIO
, npg
);
126 if (!bio
&& (current
->flags
& PF_MEMALLOC
)) {
127 while (!bio
&& (npg
/= 2))
128 bio
= bio_alloc(GFP_NOIO
, npg
);
132 bio
->bi_iter
.bi_sector
= disk_sector
;
134 bio
->bi_end_io
= end_io
;
135 bio
->bi_private
= par
;
141 do_add_page_to_bio(struct bio
*bio
, int npg
, int rw
, sector_t isect
,
142 struct page
*page
, struct pnfs_block_dev_map
*map
,
143 struct pnfs_block_extent
*be
, bio_end_io_t end_io
,
144 struct parallel_io
*par
, unsigned int offset
, int *len
)
146 struct pnfs_block_dev
*dev
=
147 container_of(be
->be_device
, struct pnfs_block_dev
, node
);
150 dprintk("%s: npg %d rw %d isect %llu offset %u len %d\n", __func__
,
151 npg
, rw
, (unsigned long long)isect
, offset
, *len
);
153 /* translate to device offset */
154 isect
+= be
->be_v_offset
;
155 isect
-= be
->be_f_offset
;
157 /* translate to physical disk offset */
158 disk_addr
= (u64
)isect
<< SECTOR_SHIFT
;
159 if (disk_addr
< map
->start
|| disk_addr
>= map
->start
+ map
->len
) {
160 if (!dev
->map(dev
, disk_addr
, map
))
161 return ERR_PTR(-EIO
);
162 bio
= bl_submit_bio(bio
);
164 disk_addr
+= map
->disk_offset
;
165 disk_addr
-= map
->start
;
167 /* limit length to what the device mapping allows */
168 end
= disk_addr
+ *len
;
169 if (end
>= map
->start
+ map
->len
)
170 *len
= map
->start
+ map
->len
- disk_addr
;
174 bio
= bl_alloc_init_bio(npg
, map
->bdev
,
175 disk_addr
>> SECTOR_SHIFT
, end_io
, par
);
177 return ERR_PTR(-ENOMEM
);
178 bio_set_op_attrs(bio
, rw
, 0);
180 if (bio_add_page(bio
, page
, *len
, offset
) < *len
) {
181 bio
= bl_submit_bio(bio
);
187 static void bl_end_io_read(struct bio
*bio
)
189 struct parallel_io
*par
= bio
->bi_private
;
192 struct nfs_pgio_header
*header
= par
->data
;
194 if (!header
->pnfs_error
)
195 header
->pnfs_error
= -EIO
;
196 pnfs_set_lo_fail(header
->lseg
);
203 static void bl_read_cleanup(struct work_struct
*work
)
205 struct rpc_task
*task
;
206 struct nfs_pgio_header
*hdr
;
207 dprintk("%s enter\n", __func__
);
208 task
= container_of(work
, struct rpc_task
, u
.tk_work
);
209 hdr
= container_of(task
, struct nfs_pgio_header
, task
);
210 pnfs_ld_read_done(hdr
);
214 bl_end_par_io_read(void *data
)
216 struct nfs_pgio_header
*hdr
= data
;
218 hdr
->task
.tk_status
= hdr
->pnfs_error
;
219 INIT_WORK(&hdr
->task
.u
.tk_work
, bl_read_cleanup
);
220 schedule_work(&hdr
->task
.u
.tk_work
);
223 static enum pnfs_try_status
224 bl_read_pagelist(struct nfs_pgio_header
*header
)
226 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
227 struct pnfs_block_dev_map map
= { .start
= NFS4_MAX_UINT64
};
228 struct bio
*bio
= NULL
;
229 struct pnfs_block_extent be
;
230 sector_t isect
, extent_length
= 0;
231 struct parallel_io
*par
;
232 loff_t f_offset
= header
->args
.offset
;
233 size_t bytes_left
= header
->args
.count
;
234 unsigned int pg_offset
= header
->args
.pgbase
, pg_len
;
235 struct page
**pages
= header
->args
.pages
;
236 int pg_index
= header
->args
.pgbase
>> PAGE_SHIFT
;
237 const bool is_dio
= (header
->dreq
!= NULL
);
238 struct blk_plug plug
;
241 dprintk("%s enter nr_pages %u offset %lld count %u\n", __func__
,
242 header
->page_array
.npages
, f_offset
,
243 (unsigned int)header
->args
.count
);
245 par
= alloc_parallel(header
);
247 return PNFS_NOT_ATTEMPTED
;
248 par
->pnfs_callback
= bl_end_par_io_read
;
250 blk_start_plug(&plug
);
252 isect
= (sector_t
) (f_offset
>> SECTOR_SHIFT
);
253 /* Code assumes extents are page-aligned */
254 for (i
= pg_index
; i
< header
->page_array
.npages
; i
++) {
255 if (extent_length
<= 0) {
256 /* We've used up the previous extent */
257 bio
= bl_submit_bio(bio
);
259 /* Get the next one */
260 if (!ext_tree_lookup(bl
, isect
, &be
, false)) {
261 header
->pnfs_error
= -EIO
;
264 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
268 if (pg_offset
+ bytes_left
> PAGE_SIZE
)
269 pg_len
= PAGE_SIZE
- pg_offset
;
273 BUG_ON(pg_offset
!= 0);
278 bio
= bl_submit_bio(bio
);
279 /* Fill hole w/ zeroes w/o accessing device */
280 dprintk("%s Zeroing page for hole\n", __func__
);
281 zero_user_segment(pages
[i
], pg_offset
, pg_len
);
284 map
.start
= NFS4_MAX_UINT64
;
286 bio
= do_add_page_to_bio(bio
,
287 header
->page_array
.npages
- i
,
289 isect
, pages
[i
], &map
, &be
,
293 header
->pnfs_error
= PTR_ERR(bio
);
298 isect
+= (pg_len
>> SECTOR_SHIFT
);
299 extent_length
-= (pg_len
>> SECTOR_SHIFT
);
301 bytes_left
-= pg_len
;
304 if ((isect
<< SECTOR_SHIFT
) >= header
->inode
->i_size
) {
306 header
->res
.count
= header
->inode
->i_size
- header
->args
.offset
;
308 header
->res
.count
= (isect
<< SECTOR_SHIFT
) - header
->args
.offset
;
312 blk_finish_plug(&plug
);
314 return PNFS_ATTEMPTED
;
317 static void bl_end_io_write(struct bio
*bio
)
319 struct parallel_io
*par
= bio
->bi_private
;
320 struct nfs_pgio_header
*header
= par
->data
;
323 if (!header
->pnfs_error
)
324 header
->pnfs_error
= -EIO
;
325 pnfs_set_lo_fail(header
->lseg
);
331 /* Function scheduled for call during bl_end_par_io_write,
332 * it marks sectors as written and extends the commitlist.
334 static void bl_write_cleanup(struct work_struct
*work
)
336 struct rpc_task
*task
= container_of(work
, struct rpc_task
, u
.tk_work
);
337 struct nfs_pgio_header
*hdr
=
338 container_of(task
, struct nfs_pgio_header
, task
);
340 dprintk("%s enter\n", __func__
);
342 if (likely(!hdr
->pnfs_error
)) {
343 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(hdr
->lseg
);
344 u64 start
= hdr
->args
.offset
& (loff_t
)PAGE_MASK
;
345 u64 end
= (hdr
->args
.offset
+ hdr
->args
.count
+
346 PAGE_SIZE
- 1) & (loff_t
)PAGE_MASK
;
348 ext_tree_mark_written(bl
, start
>> SECTOR_SHIFT
,
349 (end
- start
) >> SECTOR_SHIFT
);
352 pnfs_ld_write_done(hdr
);
355 /* Called when last of bios associated with a bl_write_pagelist call finishes */
356 static void bl_end_par_io_write(void *data
)
358 struct nfs_pgio_header
*hdr
= data
;
360 hdr
->task
.tk_status
= hdr
->pnfs_error
;
361 hdr
->verf
.committed
= NFS_FILE_SYNC
;
362 INIT_WORK(&hdr
->task
.u
.tk_work
, bl_write_cleanup
);
363 schedule_work(&hdr
->task
.u
.tk_work
);
366 static enum pnfs_try_status
367 bl_write_pagelist(struct nfs_pgio_header
*header
, int sync
)
369 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
370 struct pnfs_block_dev_map map
= { .start
= NFS4_MAX_UINT64
};
371 struct bio
*bio
= NULL
;
372 struct pnfs_block_extent be
;
373 sector_t isect
, extent_length
= 0;
374 struct parallel_io
*par
= NULL
;
375 loff_t offset
= header
->args
.offset
;
376 size_t count
= header
->args
.count
;
377 struct page
**pages
= header
->args
.pages
;
378 int pg_index
= header
->args
.pgbase
>> PAGE_SHIFT
;
380 struct blk_plug plug
;
383 dprintk("%s enter, %Zu@%lld\n", __func__
, count
, offset
);
385 /* At this point, header->page_aray is a (sequential) list of nfs_pages.
386 * We want to write each, and if there is an error set pnfs_error
387 * to have it redone using nfs.
389 par
= alloc_parallel(header
);
391 return PNFS_NOT_ATTEMPTED
;
392 par
->pnfs_callback
= bl_end_par_io_write
;
394 blk_start_plug(&plug
);
396 /* we always write out the whole page */
397 offset
= offset
& (loff_t
)PAGE_MASK
;
398 isect
= offset
>> SECTOR_SHIFT
;
400 for (i
= pg_index
; i
< header
->page_array
.npages
; i
++) {
401 if (extent_length
<= 0) {
402 /* We've used up the previous extent */
403 bio
= bl_submit_bio(bio
);
404 /* Get the next one */
405 if (!ext_tree_lookup(bl
, isect
, &be
, true)) {
406 header
->pnfs_error
= -EINVAL
;
410 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
414 bio
= do_add_page_to_bio(bio
, header
->page_array
.npages
- i
,
415 WRITE
, isect
, pages
[i
], &map
, &be
,
416 bl_end_io_write
, par
,
419 header
->pnfs_error
= PTR_ERR(bio
);
426 isect
+= (pg_len
>> SECTOR_SHIFT
);
427 extent_length
-= (pg_len
>> SECTOR_SHIFT
);
430 header
->res
.count
= header
->args
.count
;
433 blk_finish_plug(&plug
);
435 return PNFS_ATTEMPTED
;
438 static void bl_free_layout_hdr(struct pnfs_layout_hdr
*lo
)
440 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
443 dprintk("%s enter\n", __func__
);
445 err
= ext_tree_remove(bl
, true, 0, LLONG_MAX
);
451 static struct pnfs_layout_hdr
*__bl_alloc_layout_hdr(struct inode
*inode
,
452 gfp_t gfp_flags
, bool is_scsi_layout
)
454 struct pnfs_block_layout
*bl
;
456 dprintk("%s enter\n", __func__
);
457 bl
= kzalloc(sizeof(*bl
), gfp_flags
);
461 bl
->bl_ext_rw
= RB_ROOT
;
462 bl
->bl_ext_ro
= RB_ROOT
;
463 spin_lock_init(&bl
->bl_ext_lock
);
465 bl
->bl_scsi_layout
= is_scsi_layout
;
466 return &bl
->bl_layout
;
469 static struct pnfs_layout_hdr
*bl_alloc_layout_hdr(struct inode
*inode
,
472 return __bl_alloc_layout_hdr(inode
, gfp_flags
, false);
475 static struct pnfs_layout_hdr
*sl_alloc_layout_hdr(struct inode
*inode
,
478 return __bl_alloc_layout_hdr(inode
, gfp_flags
, true);
481 static void bl_free_lseg(struct pnfs_layout_segment
*lseg
)
483 dprintk("%s enter\n", __func__
);
487 /* Tracks info needed to ensure extents in layout obey constraints of spec */
488 struct layout_verification
{
489 u32 mode
; /* R or RW */
490 u64 start
; /* Expected start of next non-COW extent */
491 u64 inval
; /* Start of INVAL coverage */
492 u64 cowread
; /* End of COW read coverage */
495 /* Verify the extent meets the layout requirements of the pnfs-block draft,
498 static int verify_extent(struct pnfs_block_extent
*be
,
499 struct layout_verification
*lv
)
501 if (lv
->mode
== IOMODE_READ
) {
502 if (be
->be_state
== PNFS_BLOCK_READWRITE_DATA
||
503 be
->be_state
== PNFS_BLOCK_INVALID_DATA
)
505 if (be
->be_f_offset
!= lv
->start
)
507 lv
->start
+= be
->be_length
;
510 /* lv->mode == IOMODE_RW */
511 if (be
->be_state
== PNFS_BLOCK_READWRITE_DATA
) {
512 if (be
->be_f_offset
!= lv
->start
)
514 if (lv
->cowread
> lv
->start
)
516 lv
->start
+= be
->be_length
;
517 lv
->inval
= lv
->start
;
519 } else if (be
->be_state
== PNFS_BLOCK_INVALID_DATA
) {
520 if (be
->be_f_offset
!= lv
->start
)
522 lv
->start
+= be
->be_length
;
524 } else if (be
->be_state
== PNFS_BLOCK_READ_DATA
) {
525 if (be
->be_f_offset
> lv
->start
)
527 if (be
->be_f_offset
< lv
->inval
)
529 if (be
->be_f_offset
< lv
->cowread
)
531 /* It looks like you might want to min this with lv->start,
532 * but you really don't.
534 lv
->inval
= lv
->inval
+ be
->be_length
;
535 lv
->cowread
= be
->be_f_offset
+ be
->be_length
;
541 static int decode_sector_number(__be32
**rp
, sector_t
*sp
)
545 *rp
= xdr_decode_hyper(*rp
, &s
);
547 printk(KERN_WARNING
"NFS: %s: sector not aligned\n", __func__
);
550 *sp
= s
>> SECTOR_SHIFT
;
555 bl_alloc_extent(struct xdr_stream
*xdr
, struct pnfs_layout_hdr
*lo
,
556 struct layout_verification
*lv
, struct list_head
*extents
,
559 struct pnfs_block_extent
*be
;
560 struct nfs4_deviceid id
;
564 p
= xdr_inline_decode(xdr
, 28 + NFS4_DEVICEID4_SIZE
);
568 be
= kzalloc(sizeof(*be
), GFP_NOFS
);
572 memcpy(&id
, p
, NFS4_DEVICEID4_SIZE
);
573 p
+= XDR_QUADLEN(NFS4_DEVICEID4_SIZE
);
576 be
->be_device
= nfs4_find_get_deviceid(NFS_SERVER(lo
->plh_inode
), &id
,
577 lo
->plh_lc_cred
, gfp_mask
);
582 * The next three values are read in as bytes, but stored in the
583 * extent structure in 512-byte granularity.
585 if (decode_sector_number(&p
, &be
->be_f_offset
) < 0)
586 goto out_put_deviceid
;
587 if (decode_sector_number(&p
, &be
->be_length
) < 0)
588 goto out_put_deviceid
;
589 if (decode_sector_number(&p
, &be
->be_v_offset
) < 0)
590 goto out_put_deviceid
;
591 be
->be_state
= be32_to_cpup(p
++);
593 error
= verify_extent(be
, lv
);
595 dprintk("%s: extent verification failed\n", __func__
);
596 goto out_put_deviceid
;
599 list_add_tail(&be
->be_list
, extents
);
603 nfs4_put_deviceid_node(be
->be_device
);
609 static struct pnfs_layout_segment
*
610 bl_alloc_lseg(struct pnfs_layout_hdr
*lo
, struct nfs4_layoutget_res
*lgr
,
613 struct layout_verification lv
= {
614 .mode
= lgr
->range
.iomode
,
615 .start
= lgr
->range
.offset
>> SECTOR_SHIFT
,
616 .inval
= lgr
->range
.offset
>> SECTOR_SHIFT
,
617 .cowread
= lgr
->range
.offset
>> SECTOR_SHIFT
,
619 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
620 struct pnfs_layout_segment
*lseg
;
622 struct xdr_stream xdr
;
623 struct page
*scratch
;
629 dprintk("---> %s\n", __func__
);
631 lseg
= kzalloc(sizeof(*lseg
), gfp_mask
);
633 return ERR_PTR(-ENOMEM
);
636 scratch
= alloc_page(gfp_mask
);
640 xdr_init_decode_pages(&xdr
, &buf
,
641 lgr
->layoutp
->pages
, lgr
->layoutp
->len
);
642 xdr_set_scratch_buffer(&xdr
, page_address(scratch
), PAGE_SIZE
);
645 p
= xdr_inline_decode(&xdr
, 4);
647 goto out_free_scratch
;
649 count
= be32_to_cpup(p
++);
650 dprintk("%s: number of extents %d\n", __func__
, count
);
653 * Decode individual extents, putting them in temporary staging area
654 * until whole layout is decoded to make error recovery easier.
656 for (i
= 0; i
< count
; i
++) {
657 status
= bl_alloc_extent(&xdr
, lo
, &lv
, &extents
, gfp_mask
);
659 goto process_extents
;
662 if (lgr
->range
.offset
+ lgr
->range
.length
!=
663 lv
.start
<< SECTOR_SHIFT
) {
664 dprintk("%s Final length mismatch\n", __func__
);
666 goto process_extents
;
669 if (lv
.start
< lv
.cowread
) {
670 dprintk("%s Final uncovered COW extent\n", __func__
);
675 while (!list_empty(&extents
)) {
676 struct pnfs_block_extent
*be
=
677 list_first_entry(&extents
, struct pnfs_block_extent
,
679 list_del(&be
->be_list
);
682 status
= ext_tree_insert(bl
, be
);
685 nfs4_put_deviceid_node(be
->be_device
);
691 __free_page(scratch
);
693 dprintk("%s returns %d\n", __func__
, status
);
696 return ERR_PTR(status
);
702 bl_return_range(struct pnfs_layout_hdr
*lo
,
703 struct pnfs_layout_range
*range
)
705 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
706 sector_t offset
= range
->offset
>> SECTOR_SHIFT
, end
;
708 if (range
->offset
% 8) {
709 dprintk("%s: offset %lld not block size aligned\n",
710 __func__
, range
->offset
);
714 if (range
->length
!= NFS4_MAX_UINT64
) {
715 if (range
->length
% 8) {
716 dprintk("%s: length %lld not block size aligned\n",
717 __func__
, range
->length
);
721 end
= offset
+ (range
->length
>> SECTOR_SHIFT
);
723 end
= round_down(NFS4_MAX_UINT64
, PAGE_SIZE
);
726 ext_tree_remove(bl
, range
->iomode
& IOMODE_RW
, offset
, end
);
730 bl_prepare_layoutcommit(struct nfs4_layoutcommit_args
*arg
)
732 return ext_tree_prepare_commit(arg
);
736 bl_cleanup_layoutcommit(struct nfs4_layoutcommit_data
*lcdata
)
738 ext_tree_mark_committed(&lcdata
->args
, lcdata
->res
.status
);
742 bl_set_layoutdriver(struct nfs_server
*server
, const struct nfs_fh
*fh
)
744 dprintk("%s enter\n", __func__
);
746 if (server
->pnfs_blksize
== 0) {
747 dprintk("%s Server did not return blksize\n", __func__
);
750 if (server
->pnfs_blksize
> PAGE_SIZE
) {
751 printk(KERN_ERR
"%s: pNFS blksize %d not supported.\n",
752 __func__
, server
->pnfs_blksize
);
760 is_aligned_req(struct nfs_pageio_descriptor
*pgio
,
761 struct nfs_page
*req
, unsigned int alignment
, bool is_write
)
764 * Always accept buffered writes, higher layers take care of the
767 if (pgio
->pg_dreq
== NULL
)
770 if (!IS_ALIGNED(req
->wb_offset
, alignment
))
773 if (IS_ALIGNED(req
->wb_bytes
, alignment
))
777 (req_offset(req
) + req
->wb_bytes
== i_size_read(pgio
->pg_inode
))) {
779 * If the write goes up to the inode size, just write
780 * the full page. Data past the inode size is
781 * guaranteed to be zeroed by the higher level client
782 * code, and this behaviour is mandated by RFC 5663
792 bl_pg_init_read(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*req
)
794 if (!is_aligned_req(pgio
, req
, SECTOR_SIZE
, false)) {
795 nfs_pageio_reset_read_mds(pgio
);
799 pnfs_generic_pg_init_read(pgio
, req
);
803 * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
804 * of bytes (maximum @req->wb_bytes) that can be coalesced.
807 bl_pg_test_read(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*prev
,
808 struct nfs_page
*req
)
810 if (!is_aligned_req(pgio
, req
, SECTOR_SIZE
, false))
812 return pnfs_generic_pg_test(pgio
, prev
, req
);
816 * Return the number of contiguous bytes for a given inode
817 * starting at page frame idx.
819 static u64
pnfs_num_cont_bytes(struct inode
*inode
, pgoff_t idx
)
821 struct address_space
*mapping
= inode
->i_mapping
;
824 /* Optimize common case that writes from 0 to end of file */
825 end
= DIV_ROUND_UP(i_size_read(inode
), PAGE_SIZE
);
826 if (end
!= inode
->i_mapping
->nrpages
) {
828 end
= page_cache_next_hole(mapping
, idx
+ 1, ULONG_MAX
);
833 return i_size_read(inode
) - (idx
<< PAGE_SHIFT
);
835 return (end
- idx
) << PAGE_SHIFT
;
839 bl_pg_init_write(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*req
)
843 if (!is_aligned_req(pgio
, req
, PAGE_SIZE
, true)) {
844 nfs_pageio_reset_write_mds(pgio
);
848 if (pgio
->pg_dreq
== NULL
)
849 wb_size
= pnfs_num_cont_bytes(pgio
->pg_inode
,
852 wb_size
= nfs_dreq_bytes_left(pgio
->pg_dreq
);
854 pnfs_generic_pg_init_write(pgio
, req
, wb_size
);
858 * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
859 * of bytes (maximum @req->wb_bytes) that can be coalesced.
862 bl_pg_test_write(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*prev
,
863 struct nfs_page
*req
)
865 if (!is_aligned_req(pgio
, req
, PAGE_SIZE
, true))
867 return pnfs_generic_pg_test(pgio
, prev
, req
);
870 static const struct nfs_pageio_ops bl_pg_read_ops
= {
871 .pg_init
= bl_pg_init_read
,
872 .pg_test
= bl_pg_test_read
,
873 .pg_doio
= pnfs_generic_pg_readpages
,
874 .pg_cleanup
= pnfs_generic_pg_cleanup
,
877 static const struct nfs_pageio_ops bl_pg_write_ops
= {
878 .pg_init
= bl_pg_init_write
,
879 .pg_test
= bl_pg_test_write
,
880 .pg_doio
= pnfs_generic_pg_writepages
,
881 .pg_cleanup
= pnfs_generic_pg_cleanup
,
884 static struct pnfs_layoutdriver_type blocklayout_type
= {
885 .id
= LAYOUT_BLOCK_VOLUME
,
886 .name
= "LAYOUT_BLOCK_VOLUME",
887 .owner
= THIS_MODULE
,
888 .flags
= PNFS_LAYOUTRET_ON_SETATTR
|
889 PNFS_READ_WHOLE_PAGE
,
890 .read_pagelist
= bl_read_pagelist
,
891 .write_pagelist
= bl_write_pagelist
,
892 .alloc_layout_hdr
= bl_alloc_layout_hdr
,
893 .free_layout_hdr
= bl_free_layout_hdr
,
894 .alloc_lseg
= bl_alloc_lseg
,
895 .free_lseg
= bl_free_lseg
,
896 .return_range
= bl_return_range
,
897 .prepare_layoutcommit
= bl_prepare_layoutcommit
,
898 .cleanup_layoutcommit
= bl_cleanup_layoutcommit
,
899 .set_layoutdriver
= bl_set_layoutdriver
,
900 .alloc_deviceid_node
= bl_alloc_deviceid_node
,
901 .free_deviceid_node
= bl_free_deviceid_node
,
902 .pg_read_ops
= &bl_pg_read_ops
,
903 .pg_write_ops
= &bl_pg_write_ops
,
904 .sync
= pnfs_generic_sync
,
907 static struct pnfs_layoutdriver_type scsilayout_type
= {
909 .name
= "LAYOUT_SCSI",
910 .owner
= THIS_MODULE
,
911 .flags
= PNFS_LAYOUTRET_ON_SETATTR
|
912 PNFS_READ_WHOLE_PAGE
,
913 .read_pagelist
= bl_read_pagelist
,
914 .write_pagelist
= bl_write_pagelist
,
915 .alloc_layout_hdr
= sl_alloc_layout_hdr
,
916 .free_layout_hdr
= bl_free_layout_hdr
,
917 .alloc_lseg
= bl_alloc_lseg
,
918 .free_lseg
= bl_free_lseg
,
919 .return_range
= bl_return_range
,
920 .prepare_layoutcommit
= bl_prepare_layoutcommit
,
921 .cleanup_layoutcommit
= bl_cleanup_layoutcommit
,
922 .set_layoutdriver
= bl_set_layoutdriver
,
923 .alloc_deviceid_node
= bl_alloc_deviceid_node
,
924 .free_deviceid_node
= bl_free_deviceid_node
,
925 .pg_read_ops
= &bl_pg_read_ops
,
926 .pg_write_ops
= &bl_pg_write_ops
,
927 .sync
= pnfs_generic_sync
,
931 static int __init
nfs4blocklayout_init(void)
935 dprintk("%s: NFSv4 Block Layout Driver Registering...\n", __func__
);
937 ret
= bl_init_pipefs();
941 ret
= pnfs_register_layoutdriver(&blocklayout_type
);
943 goto out_cleanup_pipe
;
945 ret
= pnfs_register_layoutdriver(&scsilayout_type
);
947 goto out_unregister_block
;
950 out_unregister_block
:
951 pnfs_unregister_layoutdriver(&blocklayout_type
);
958 static void __exit
nfs4blocklayout_exit(void)
960 dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n",
963 pnfs_unregister_layoutdriver(&scsilayout_type
);
964 pnfs_unregister_layoutdriver(&blocklayout_type
);
968 MODULE_ALIAS("nfs-layouttype4-3");
970 module_init(nfs4blocklayout_init
);
971 module_exit(nfs4blocklayout_exit
);