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(int rw
, struct bio
*bio
)
108 get_parallel(bio
->bi_private
);
109 dprintk("%s submitting %s bio %u@%llu\n", __func__
,
110 rw
== READ
? "read" : "write", bio
->bi_iter
.bi_size
,
111 (unsigned long long)bio
->bi_iter
.bi_sector
);
118 bl_alloc_init_bio(int npg
, struct block_device
*bdev
, sector_t disk_sector
,
119 bio_end_io_t end_io
, struct parallel_io
*par
)
123 npg
= min(npg
, BIO_MAX_PAGES
);
124 bio
= bio_alloc(GFP_NOIO
, npg
);
125 if (!bio
&& (current
->flags
& PF_MEMALLOC
)) {
126 while (!bio
&& (npg
/= 2))
127 bio
= bio_alloc(GFP_NOIO
, npg
);
131 bio
->bi_iter
.bi_sector
= disk_sector
;
133 bio
->bi_end_io
= end_io
;
134 bio
->bi_private
= par
;
140 do_add_page_to_bio(struct bio
*bio
, int npg
, int rw
, sector_t isect
,
141 struct page
*page
, struct pnfs_block_dev_map
*map
,
142 struct pnfs_block_extent
*be
, bio_end_io_t end_io
,
143 struct parallel_io
*par
, unsigned int offset
, int *len
)
145 struct pnfs_block_dev
*dev
=
146 container_of(be
->be_device
, struct pnfs_block_dev
, node
);
149 dprintk("%s: npg %d rw %d isect %llu offset %u len %d\n", __func__
,
150 npg
, rw
, (unsigned long long)isect
, offset
, *len
);
152 /* translate to device offset */
153 isect
+= be
->be_v_offset
;
154 isect
-= be
->be_f_offset
;
156 /* translate to physical disk offset */
157 disk_addr
= (u64
)isect
<< SECTOR_SHIFT
;
158 if (disk_addr
< map
->start
|| disk_addr
>= map
->start
+ map
->len
) {
159 if (!dev
->map(dev
, disk_addr
, map
))
160 return ERR_PTR(-EIO
);
161 bio
= bl_submit_bio(rw
, bio
);
163 disk_addr
+= map
->disk_offset
;
164 disk_addr
-= map
->start
;
166 /* limit length to what the device mapping allows */
167 end
= disk_addr
+ *len
;
168 if (end
>= map
->start
+ map
->len
)
169 *len
= map
->start
+ map
->len
- disk_addr
;
173 bio
= bl_alloc_init_bio(npg
, map
->bdev
,
174 disk_addr
>> SECTOR_SHIFT
, end_io
, par
);
176 return ERR_PTR(-ENOMEM
);
178 if (bio_add_page(bio
, page
, *len
, offset
) < *len
) {
179 bio
= bl_submit_bio(rw
, bio
);
185 static void bl_end_io_read(struct bio
*bio
)
187 struct parallel_io
*par
= bio
->bi_private
;
190 struct nfs_pgio_header
*header
= par
->data
;
192 if (!header
->pnfs_error
)
193 header
->pnfs_error
= -EIO
;
194 pnfs_set_lo_fail(header
->lseg
);
201 static void bl_read_cleanup(struct work_struct
*work
)
203 struct rpc_task
*task
;
204 struct nfs_pgio_header
*hdr
;
205 dprintk("%s enter\n", __func__
);
206 task
= container_of(work
, struct rpc_task
, u
.tk_work
);
207 hdr
= container_of(task
, struct nfs_pgio_header
, task
);
208 pnfs_ld_read_done(hdr
);
212 bl_end_par_io_read(void *data
)
214 struct nfs_pgio_header
*hdr
= data
;
216 hdr
->task
.tk_status
= hdr
->pnfs_error
;
217 INIT_WORK(&hdr
->task
.u
.tk_work
, bl_read_cleanup
);
218 schedule_work(&hdr
->task
.u
.tk_work
);
221 static enum pnfs_try_status
222 bl_read_pagelist(struct nfs_pgio_header
*header
)
224 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
225 struct pnfs_block_dev_map map
= { .start
= NFS4_MAX_UINT64
};
226 struct bio
*bio
= NULL
;
227 struct pnfs_block_extent be
;
228 sector_t isect
, extent_length
= 0;
229 struct parallel_io
*par
;
230 loff_t f_offset
= header
->args
.offset
;
231 size_t bytes_left
= header
->args
.count
;
232 unsigned int pg_offset
= header
->args
.pgbase
, pg_len
;
233 struct page
**pages
= header
->args
.pages
;
234 int pg_index
= header
->args
.pgbase
>> PAGE_SHIFT
;
235 const bool is_dio
= (header
->dreq
!= NULL
);
236 struct blk_plug plug
;
239 dprintk("%s enter nr_pages %u offset %lld count %u\n", __func__
,
240 header
->page_array
.npages
, f_offset
,
241 (unsigned int)header
->args
.count
);
243 par
= alloc_parallel(header
);
245 return PNFS_NOT_ATTEMPTED
;
246 par
->pnfs_callback
= bl_end_par_io_read
;
248 blk_start_plug(&plug
);
250 isect
= (sector_t
) (f_offset
>> SECTOR_SHIFT
);
251 /* Code assumes extents are page-aligned */
252 for (i
= pg_index
; i
< header
->page_array
.npages
; i
++) {
253 if (extent_length
<= 0) {
254 /* We've used up the previous extent */
255 bio
= bl_submit_bio(READ
, bio
);
257 /* Get the next one */
258 if (!ext_tree_lookup(bl
, isect
, &be
, false)) {
259 header
->pnfs_error
= -EIO
;
262 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
266 if (pg_offset
+ bytes_left
> PAGE_SIZE
)
267 pg_len
= PAGE_SIZE
- pg_offset
;
271 BUG_ON(pg_offset
!= 0);
276 bio
= bl_submit_bio(READ
, bio
);
277 /* Fill hole w/ zeroes w/o accessing device */
278 dprintk("%s Zeroing page for hole\n", __func__
);
279 zero_user_segment(pages
[i
], pg_offset
, pg_len
);
282 map
.start
= NFS4_MAX_UINT64
;
284 bio
= do_add_page_to_bio(bio
,
285 header
->page_array
.npages
- i
,
287 isect
, pages
[i
], &map
, &be
,
291 header
->pnfs_error
= PTR_ERR(bio
);
296 isect
+= (pg_len
>> SECTOR_SHIFT
);
297 extent_length
-= (pg_len
>> SECTOR_SHIFT
);
299 bytes_left
-= pg_len
;
302 if ((isect
<< SECTOR_SHIFT
) >= header
->inode
->i_size
) {
304 header
->res
.count
= header
->inode
->i_size
- header
->args
.offset
;
306 header
->res
.count
= (isect
<< SECTOR_SHIFT
) - header
->args
.offset
;
309 bl_submit_bio(READ
, bio
);
310 blk_finish_plug(&plug
);
312 return PNFS_ATTEMPTED
;
315 static void bl_end_io_write(struct bio
*bio
)
317 struct parallel_io
*par
= bio
->bi_private
;
318 struct nfs_pgio_header
*header
= par
->data
;
321 if (!header
->pnfs_error
)
322 header
->pnfs_error
= -EIO
;
323 pnfs_set_lo_fail(header
->lseg
);
329 /* Function scheduled for call during bl_end_par_io_write,
330 * it marks sectors as written and extends the commitlist.
332 static void bl_write_cleanup(struct work_struct
*work
)
334 struct rpc_task
*task
= container_of(work
, struct rpc_task
, u
.tk_work
);
335 struct nfs_pgio_header
*hdr
=
336 container_of(task
, struct nfs_pgio_header
, task
);
338 dprintk("%s enter\n", __func__
);
340 if (likely(!hdr
->pnfs_error
)) {
341 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(hdr
->lseg
);
342 u64 start
= hdr
->args
.offset
& (loff_t
)PAGE_MASK
;
343 u64 end
= (hdr
->args
.offset
+ hdr
->args
.count
+
344 PAGE_SIZE
- 1) & (loff_t
)PAGE_MASK
;
346 ext_tree_mark_written(bl
, start
>> SECTOR_SHIFT
,
347 (end
- start
) >> SECTOR_SHIFT
);
350 pnfs_ld_write_done(hdr
);
353 /* Called when last of bios associated with a bl_write_pagelist call finishes */
354 static void bl_end_par_io_write(void *data
)
356 struct nfs_pgio_header
*hdr
= data
;
358 hdr
->task
.tk_status
= hdr
->pnfs_error
;
359 hdr
->verf
.committed
= NFS_FILE_SYNC
;
360 INIT_WORK(&hdr
->task
.u
.tk_work
, bl_write_cleanup
);
361 schedule_work(&hdr
->task
.u
.tk_work
);
364 static enum pnfs_try_status
365 bl_write_pagelist(struct nfs_pgio_header
*header
, int sync
)
367 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
368 struct pnfs_block_dev_map map
= { .start
= NFS4_MAX_UINT64
};
369 struct bio
*bio
= NULL
;
370 struct pnfs_block_extent be
;
371 sector_t isect
, extent_length
= 0;
372 struct parallel_io
*par
= NULL
;
373 loff_t offset
= header
->args
.offset
;
374 size_t count
= header
->args
.count
;
375 struct page
**pages
= header
->args
.pages
;
376 int pg_index
= header
->args
.pgbase
>> PAGE_SHIFT
;
378 struct blk_plug plug
;
381 dprintk("%s enter, %Zu@%lld\n", __func__
, count
, offset
);
383 /* At this point, header->page_aray is a (sequential) list of nfs_pages.
384 * We want to write each, and if there is an error set pnfs_error
385 * to have it redone using nfs.
387 par
= alloc_parallel(header
);
389 return PNFS_NOT_ATTEMPTED
;
390 par
->pnfs_callback
= bl_end_par_io_write
;
392 blk_start_plug(&plug
);
394 /* we always write out the whole page */
395 offset
= offset
& (loff_t
)PAGE_MASK
;
396 isect
= offset
>> SECTOR_SHIFT
;
398 for (i
= pg_index
; i
< header
->page_array
.npages
; i
++) {
399 if (extent_length
<= 0) {
400 /* We've used up the previous extent */
401 bio
= bl_submit_bio(WRITE
, bio
);
402 /* Get the next one */
403 if (!ext_tree_lookup(bl
, isect
, &be
, true)) {
404 header
->pnfs_error
= -EINVAL
;
408 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
412 bio
= do_add_page_to_bio(bio
, header
->page_array
.npages
- i
,
413 WRITE
, isect
, pages
[i
], &map
, &be
,
414 bl_end_io_write
, par
,
417 header
->pnfs_error
= PTR_ERR(bio
);
424 isect
+= (pg_len
>> SECTOR_SHIFT
);
425 extent_length
-= (pg_len
>> SECTOR_SHIFT
);
428 header
->res
.count
= header
->args
.count
;
430 bl_submit_bio(WRITE
, bio
);
431 blk_finish_plug(&plug
);
433 return PNFS_ATTEMPTED
;
436 static void bl_free_layout_hdr(struct pnfs_layout_hdr
*lo
)
438 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
441 dprintk("%s enter\n", __func__
);
443 err
= ext_tree_remove(bl
, true, 0, LLONG_MAX
);
449 static struct pnfs_layout_hdr
*__bl_alloc_layout_hdr(struct inode
*inode
,
450 gfp_t gfp_flags
, bool is_scsi_layout
)
452 struct pnfs_block_layout
*bl
;
454 dprintk("%s enter\n", __func__
);
455 bl
= kzalloc(sizeof(*bl
), gfp_flags
);
459 bl
->bl_ext_rw
= RB_ROOT
;
460 bl
->bl_ext_ro
= RB_ROOT
;
461 spin_lock_init(&bl
->bl_ext_lock
);
463 bl
->bl_scsi_layout
= is_scsi_layout
;
464 return &bl
->bl_layout
;
467 static struct pnfs_layout_hdr
*bl_alloc_layout_hdr(struct inode
*inode
,
470 return __bl_alloc_layout_hdr(inode
, gfp_flags
, false);
473 static struct pnfs_layout_hdr
*sl_alloc_layout_hdr(struct inode
*inode
,
476 return __bl_alloc_layout_hdr(inode
, gfp_flags
, true);
479 static void bl_free_lseg(struct pnfs_layout_segment
*lseg
)
481 dprintk("%s enter\n", __func__
);
485 /* Tracks info needed to ensure extents in layout obey constraints of spec */
486 struct layout_verification
{
487 u32 mode
; /* R or RW */
488 u64 start
; /* Expected start of next non-COW extent */
489 u64 inval
; /* Start of INVAL coverage */
490 u64 cowread
; /* End of COW read coverage */
493 /* Verify the extent meets the layout requirements of the pnfs-block draft,
496 static int verify_extent(struct pnfs_block_extent
*be
,
497 struct layout_verification
*lv
)
499 if (lv
->mode
== IOMODE_READ
) {
500 if (be
->be_state
== PNFS_BLOCK_READWRITE_DATA
||
501 be
->be_state
== PNFS_BLOCK_INVALID_DATA
)
503 if (be
->be_f_offset
!= lv
->start
)
505 lv
->start
+= be
->be_length
;
508 /* lv->mode == IOMODE_RW */
509 if (be
->be_state
== PNFS_BLOCK_READWRITE_DATA
) {
510 if (be
->be_f_offset
!= lv
->start
)
512 if (lv
->cowread
> lv
->start
)
514 lv
->start
+= be
->be_length
;
515 lv
->inval
= lv
->start
;
517 } else if (be
->be_state
== PNFS_BLOCK_INVALID_DATA
) {
518 if (be
->be_f_offset
!= lv
->start
)
520 lv
->start
+= be
->be_length
;
522 } else if (be
->be_state
== PNFS_BLOCK_READ_DATA
) {
523 if (be
->be_f_offset
> lv
->start
)
525 if (be
->be_f_offset
< lv
->inval
)
527 if (be
->be_f_offset
< lv
->cowread
)
529 /* It looks like you might want to min this with lv->start,
530 * but you really don't.
532 lv
->inval
= lv
->inval
+ be
->be_length
;
533 lv
->cowread
= be
->be_f_offset
+ be
->be_length
;
539 static int decode_sector_number(__be32
**rp
, sector_t
*sp
)
543 *rp
= xdr_decode_hyper(*rp
, &s
);
545 printk(KERN_WARNING
"NFS: %s: sector not aligned\n", __func__
);
548 *sp
= s
>> SECTOR_SHIFT
;
553 bl_alloc_extent(struct xdr_stream
*xdr
, struct pnfs_layout_hdr
*lo
,
554 struct layout_verification
*lv
, struct list_head
*extents
,
557 struct pnfs_block_extent
*be
;
558 struct nfs4_deviceid id
;
562 p
= xdr_inline_decode(xdr
, 28 + NFS4_DEVICEID4_SIZE
);
566 be
= kzalloc(sizeof(*be
), GFP_NOFS
);
570 memcpy(&id
, p
, NFS4_DEVICEID4_SIZE
);
571 p
+= XDR_QUADLEN(NFS4_DEVICEID4_SIZE
);
574 be
->be_device
= nfs4_find_get_deviceid(NFS_SERVER(lo
->plh_inode
), &id
,
575 lo
->plh_lc_cred
, gfp_mask
);
580 * The next three values are read in as bytes, but stored in the
581 * extent structure in 512-byte granularity.
583 if (decode_sector_number(&p
, &be
->be_f_offset
) < 0)
584 goto out_put_deviceid
;
585 if (decode_sector_number(&p
, &be
->be_length
) < 0)
586 goto out_put_deviceid
;
587 if (decode_sector_number(&p
, &be
->be_v_offset
) < 0)
588 goto out_put_deviceid
;
589 be
->be_state
= be32_to_cpup(p
++);
591 error
= verify_extent(be
, lv
);
593 dprintk("%s: extent verification failed\n", __func__
);
594 goto out_put_deviceid
;
597 list_add_tail(&be
->be_list
, extents
);
601 nfs4_put_deviceid_node(be
->be_device
);
607 static struct pnfs_layout_segment
*
608 bl_alloc_lseg(struct pnfs_layout_hdr
*lo
, struct nfs4_layoutget_res
*lgr
,
611 struct layout_verification lv
= {
612 .mode
= lgr
->range
.iomode
,
613 .start
= lgr
->range
.offset
>> SECTOR_SHIFT
,
614 .inval
= lgr
->range
.offset
>> SECTOR_SHIFT
,
615 .cowread
= lgr
->range
.offset
>> SECTOR_SHIFT
,
617 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
618 struct pnfs_layout_segment
*lseg
;
620 struct xdr_stream xdr
;
621 struct page
*scratch
;
627 dprintk("---> %s\n", __func__
);
629 lseg
= kzalloc(sizeof(*lseg
), gfp_mask
);
631 return ERR_PTR(-ENOMEM
);
634 scratch
= alloc_page(gfp_mask
);
638 xdr_init_decode_pages(&xdr
, &buf
,
639 lgr
->layoutp
->pages
, lgr
->layoutp
->len
);
640 xdr_set_scratch_buffer(&xdr
, page_address(scratch
), PAGE_SIZE
);
643 p
= xdr_inline_decode(&xdr
, 4);
645 goto out_free_scratch
;
647 count
= be32_to_cpup(p
++);
648 dprintk("%s: number of extents %d\n", __func__
, count
);
651 * Decode individual extents, putting them in temporary staging area
652 * until whole layout is decoded to make error recovery easier.
654 for (i
= 0; i
< count
; i
++) {
655 status
= bl_alloc_extent(&xdr
, lo
, &lv
, &extents
, gfp_mask
);
657 goto process_extents
;
660 if (lgr
->range
.offset
+ lgr
->range
.length
!=
661 lv
.start
<< SECTOR_SHIFT
) {
662 dprintk("%s Final length mismatch\n", __func__
);
664 goto process_extents
;
667 if (lv
.start
< lv
.cowread
) {
668 dprintk("%s Final uncovered COW extent\n", __func__
);
673 while (!list_empty(&extents
)) {
674 struct pnfs_block_extent
*be
=
675 list_first_entry(&extents
, struct pnfs_block_extent
,
677 list_del(&be
->be_list
);
680 status
= ext_tree_insert(bl
, be
);
683 nfs4_put_deviceid_node(be
->be_device
);
689 __free_page(scratch
);
691 dprintk("%s returns %d\n", __func__
, status
);
694 return ERR_PTR(status
);
700 bl_return_range(struct pnfs_layout_hdr
*lo
,
701 struct pnfs_layout_range
*range
)
703 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
704 sector_t offset
= range
->offset
>> SECTOR_SHIFT
, end
;
706 if (range
->offset
% 8) {
707 dprintk("%s: offset %lld not block size aligned\n",
708 __func__
, range
->offset
);
712 if (range
->length
!= NFS4_MAX_UINT64
) {
713 if (range
->length
% 8) {
714 dprintk("%s: length %lld not block size aligned\n",
715 __func__
, range
->length
);
719 end
= offset
+ (range
->length
>> SECTOR_SHIFT
);
721 end
= round_down(NFS4_MAX_UINT64
, PAGE_SIZE
);
724 ext_tree_remove(bl
, range
->iomode
& IOMODE_RW
, offset
, end
);
728 bl_prepare_layoutcommit(struct nfs4_layoutcommit_args
*arg
)
730 return ext_tree_prepare_commit(arg
);
734 bl_cleanup_layoutcommit(struct nfs4_layoutcommit_data
*lcdata
)
736 ext_tree_mark_committed(&lcdata
->args
, lcdata
->res
.status
);
740 bl_set_layoutdriver(struct nfs_server
*server
, const struct nfs_fh
*fh
)
742 dprintk("%s enter\n", __func__
);
744 if (server
->pnfs_blksize
== 0) {
745 dprintk("%s Server did not return blksize\n", __func__
);
748 if (server
->pnfs_blksize
> PAGE_SIZE
) {
749 printk(KERN_ERR
"%s: pNFS blksize %d not supported.\n",
750 __func__
, server
->pnfs_blksize
);
758 is_aligned_req(struct nfs_pageio_descriptor
*pgio
,
759 struct nfs_page
*req
, unsigned int alignment
, bool is_write
)
762 * Always accept buffered writes, higher layers take care of the
765 if (pgio
->pg_dreq
== NULL
)
768 if (!IS_ALIGNED(req
->wb_offset
, alignment
))
771 if (IS_ALIGNED(req
->wb_bytes
, alignment
))
775 (req_offset(req
) + req
->wb_bytes
== i_size_read(pgio
->pg_inode
))) {
777 * If the write goes up to the inode size, just write
778 * the full page. Data past the inode size is
779 * guaranteed to be zeroed by the higher level client
780 * code, and this behaviour is mandated by RFC 5663
790 bl_pg_init_read(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*req
)
792 if (!is_aligned_req(pgio
, req
, SECTOR_SIZE
, false)) {
793 nfs_pageio_reset_read_mds(pgio
);
797 pnfs_generic_pg_init_read(pgio
, req
);
801 * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
802 * of bytes (maximum @req->wb_bytes) that can be coalesced.
805 bl_pg_test_read(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*prev
,
806 struct nfs_page
*req
)
808 if (!is_aligned_req(pgio
, req
, SECTOR_SIZE
, false))
810 return pnfs_generic_pg_test(pgio
, prev
, req
);
814 * Return the number of contiguous bytes for a given inode
815 * starting at page frame idx.
817 static u64
pnfs_num_cont_bytes(struct inode
*inode
, pgoff_t idx
)
819 struct address_space
*mapping
= inode
->i_mapping
;
822 /* Optimize common case that writes from 0 to end of file */
823 end
= DIV_ROUND_UP(i_size_read(inode
), PAGE_SIZE
);
824 if (end
!= inode
->i_mapping
->nrpages
) {
826 end
= page_cache_next_hole(mapping
, idx
+ 1, ULONG_MAX
);
831 return i_size_read(inode
) - (idx
<< PAGE_SHIFT
);
833 return (end
- idx
) << PAGE_SHIFT
;
837 bl_pg_init_write(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*req
)
841 if (!is_aligned_req(pgio
, req
, PAGE_SIZE
, true)) {
842 nfs_pageio_reset_write_mds(pgio
);
846 if (pgio
->pg_dreq
== NULL
)
847 wb_size
= pnfs_num_cont_bytes(pgio
->pg_inode
,
850 wb_size
= nfs_dreq_bytes_left(pgio
->pg_dreq
);
852 pnfs_generic_pg_init_write(pgio
, req
, wb_size
);
856 * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
857 * of bytes (maximum @req->wb_bytes) that can be coalesced.
860 bl_pg_test_write(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*prev
,
861 struct nfs_page
*req
)
863 if (!is_aligned_req(pgio
, req
, PAGE_SIZE
, true))
865 return pnfs_generic_pg_test(pgio
, prev
, req
);
868 static const struct nfs_pageio_ops bl_pg_read_ops
= {
869 .pg_init
= bl_pg_init_read
,
870 .pg_test
= bl_pg_test_read
,
871 .pg_doio
= pnfs_generic_pg_readpages
,
872 .pg_cleanup
= pnfs_generic_pg_cleanup
,
875 static const struct nfs_pageio_ops bl_pg_write_ops
= {
876 .pg_init
= bl_pg_init_write
,
877 .pg_test
= bl_pg_test_write
,
878 .pg_doio
= pnfs_generic_pg_writepages
,
879 .pg_cleanup
= pnfs_generic_pg_cleanup
,
882 static struct pnfs_layoutdriver_type blocklayout_type
= {
883 .id
= LAYOUT_BLOCK_VOLUME
,
884 .name
= "LAYOUT_BLOCK_VOLUME",
885 .owner
= THIS_MODULE
,
886 .flags
= PNFS_LAYOUTRET_ON_SETATTR
|
887 PNFS_READ_WHOLE_PAGE
,
888 .read_pagelist
= bl_read_pagelist
,
889 .write_pagelist
= bl_write_pagelist
,
890 .alloc_layout_hdr
= bl_alloc_layout_hdr
,
891 .free_layout_hdr
= bl_free_layout_hdr
,
892 .alloc_lseg
= bl_alloc_lseg
,
893 .free_lseg
= bl_free_lseg
,
894 .return_range
= bl_return_range
,
895 .prepare_layoutcommit
= bl_prepare_layoutcommit
,
896 .cleanup_layoutcommit
= bl_cleanup_layoutcommit
,
897 .set_layoutdriver
= bl_set_layoutdriver
,
898 .alloc_deviceid_node
= bl_alloc_deviceid_node
,
899 .free_deviceid_node
= bl_free_deviceid_node
,
900 .pg_read_ops
= &bl_pg_read_ops
,
901 .pg_write_ops
= &bl_pg_write_ops
,
902 .sync
= pnfs_generic_sync
,
905 static struct pnfs_layoutdriver_type scsilayout_type
= {
907 .name
= "LAYOUT_SCSI",
908 .owner
= THIS_MODULE
,
909 .flags
= PNFS_LAYOUTRET_ON_SETATTR
|
910 PNFS_READ_WHOLE_PAGE
,
911 .read_pagelist
= bl_read_pagelist
,
912 .write_pagelist
= bl_write_pagelist
,
913 .alloc_layout_hdr
= sl_alloc_layout_hdr
,
914 .free_layout_hdr
= bl_free_layout_hdr
,
915 .alloc_lseg
= bl_alloc_lseg
,
916 .free_lseg
= bl_free_lseg
,
917 .return_range
= bl_return_range
,
918 .prepare_layoutcommit
= bl_prepare_layoutcommit
,
919 .cleanup_layoutcommit
= bl_cleanup_layoutcommit
,
920 .set_layoutdriver
= bl_set_layoutdriver
,
921 .alloc_deviceid_node
= bl_alloc_deviceid_node
,
922 .free_deviceid_node
= bl_free_deviceid_node
,
923 .pg_read_ops
= &bl_pg_read_ops
,
924 .pg_write_ops
= &bl_pg_write_ops
,
925 .sync
= pnfs_generic_sync
,
929 static int __init
nfs4blocklayout_init(void)
933 dprintk("%s: NFSv4 Block Layout Driver Registering...\n", __func__
);
935 ret
= bl_init_pipefs();
939 ret
= pnfs_register_layoutdriver(&blocklayout_type
);
941 goto out_cleanup_pipe
;
943 ret
= pnfs_register_layoutdriver(&scsilayout_type
);
945 goto out_unregister_block
;
948 out_unregister_block
:
949 pnfs_unregister_layoutdriver(&blocklayout_type
);
956 static void __exit
nfs4blocklayout_exit(void)
958 dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n",
961 pnfs_unregister_layoutdriver(&scsilayout_type
);
962 pnfs_unregister_layoutdriver(&blocklayout_type
);
966 MODULE_ALIAS("nfs-layouttype4-3");
968 module_init(nfs4blocklayout_init
);
969 module_exit(nfs4blocklayout_exit
);