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
);
118 static bool offset_in_map(u64 offset
, struct pnfs_block_dev_map
*map
)
120 return offset
>= map
->start
&& offset
< map
->start
+ map
->len
;
124 do_add_page_to_bio(struct bio
*bio
, int npg
, enum req_op op
, sector_t isect
,
125 struct page
*page
, struct pnfs_block_dev_map
*map
,
126 struct pnfs_block_extent
*be
, bio_end_io_t end_io
,
127 struct parallel_io
*par
, unsigned int offset
, int *len
)
129 struct pnfs_block_dev
*dev
=
130 container_of(be
->be_device
, struct pnfs_block_dev
, node
);
133 dprintk("%s: npg %d rw %d isect %llu offset %u len %d\n", __func__
,
134 npg
, (__force u32
)op
, (unsigned long long)isect
, offset
, *len
);
136 /* translate to device offset */
137 isect
+= be
->be_v_offset
;
138 isect
-= be
->be_f_offset
;
140 /* translate to physical disk offset */
141 disk_addr
= (u64
)isect
<< SECTOR_SHIFT
;
142 if (!offset_in_map(disk_addr
, map
)) {
143 if (!dev
->map(dev
, disk_addr
, map
) || !offset_in_map(disk_addr
, map
))
144 return ERR_PTR(-EIO
);
145 bio
= bl_submit_bio(bio
);
147 disk_addr
+= map
->disk_offset
;
148 disk_addr
-= map
->start
;
150 /* limit length to what the device mapping allows */
151 end
= disk_addr
+ *len
;
152 if (end
>= map
->start
+ map
->len
)
153 *len
= map
->start
+ map
->len
- disk_addr
;
157 bio
= bio_alloc(map
->bdev
, bio_max_segs(npg
), op
, GFP_NOIO
);
158 bio
->bi_iter
.bi_sector
= disk_addr
>> SECTOR_SHIFT
;
159 bio
->bi_end_io
= end_io
;
160 bio
->bi_private
= par
;
162 if (bio_add_page(bio
, page
, *len
, offset
) < *len
) {
163 bio
= bl_submit_bio(bio
);
169 static void bl_mark_devices_unavailable(struct nfs_pgio_header
*header
, bool rw
)
171 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
172 size_t bytes_left
= header
->args
.count
;
173 sector_t isect
, extent_length
= 0;
174 struct pnfs_block_extent be
;
176 isect
= header
->args
.offset
>> SECTOR_SHIFT
;
177 bytes_left
+= header
->args
.offset
- (isect
<< SECTOR_SHIFT
);
179 while (bytes_left
> 0) {
180 if (!ext_tree_lookup(bl
, isect
, &be
, rw
))
182 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
183 nfs4_mark_deviceid_unavailable(be
.be_device
);
184 isect
+= extent_length
;
185 if (bytes_left
> extent_length
<< SECTOR_SHIFT
)
186 bytes_left
-= extent_length
<< SECTOR_SHIFT
;
192 static void bl_end_io_read(struct bio
*bio
)
194 struct parallel_io
*par
= bio
->bi_private
;
196 if (bio
->bi_status
) {
197 struct nfs_pgio_header
*header
= par
->data
;
199 if (!header
->pnfs_error
)
200 header
->pnfs_error
= -EIO
;
201 pnfs_set_lo_fail(header
->lseg
);
202 bl_mark_devices_unavailable(header
, false);
209 static void bl_read_cleanup(struct work_struct
*work
)
211 struct rpc_task
*task
;
212 struct nfs_pgio_header
*hdr
;
213 dprintk("%s enter\n", __func__
);
214 task
= container_of(work
, struct rpc_task
, u
.tk_work
);
215 hdr
= container_of(task
, struct nfs_pgio_header
, task
);
216 pnfs_ld_read_done(hdr
);
220 bl_end_par_io_read(void *data
)
222 struct nfs_pgio_header
*hdr
= data
;
224 hdr
->task
.tk_status
= hdr
->pnfs_error
;
225 INIT_WORK(&hdr
->task
.u
.tk_work
, bl_read_cleanup
);
226 schedule_work(&hdr
->task
.u
.tk_work
);
229 static enum pnfs_try_status
230 bl_read_pagelist(struct nfs_pgio_header
*header
)
232 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
233 struct pnfs_block_dev_map map
= { .start
= NFS4_MAX_UINT64
};
234 struct bio
*bio
= NULL
;
235 struct pnfs_block_extent be
;
236 sector_t isect
, extent_length
= 0;
237 struct parallel_io
*par
;
238 loff_t f_offset
= header
->args
.offset
;
239 size_t bytes_left
= header
->args
.count
;
240 unsigned int pg_offset
= header
->args
.pgbase
, pg_len
;
241 struct page
**pages
= header
->args
.pages
;
242 int pg_index
= header
->args
.pgbase
>> PAGE_SHIFT
;
243 const bool is_dio
= (header
->dreq
!= NULL
);
244 struct blk_plug plug
;
247 dprintk("%s enter nr_pages %u offset %lld count %u\n", __func__
,
248 header
->page_array
.npages
, f_offset
,
249 (unsigned int)header
->args
.count
);
251 par
= alloc_parallel(header
);
253 return PNFS_NOT_ATTEMPTED
;
254 par
->pnfs_callback
= bl_end_par_io_read
;
256 blk_start_plug(&plug
);
258 isect
= (sector_t
) (f_offset
>> SECTOR_SHIFT
);
259 /* Code assumes extents are page-aligned */
260 for (i
= pg_index
; i
< header
->page_array
.npages
; i
++) {
261 if (extent_length
<= 0) {
262 /* We've used up the previous extent */
263 bio
= bl_submit_bio(bio
);
265 /* Get the next one */
266 if (!ext_tree_lookup(bl
, isect
, &be
, false)) {
267 header
->pnfs_error
= -EIO
;
270 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
274 if (pg_offset
+ bytes_left
> PAGE_SIZE
)
275 pg_len
= PAGE_SIZE
- pg_offset
;
279 BUG_ON(pg_offset
!= 0);
284 bio
= bl_submit_bio(bio
);
285 /* Fill hole w/ zeroes w/o accessing device */
286 dprintk("%s Zeroing page for hole\n", __func__
);
287 zero_user_segment(pages
[i
], pg_offset
, pg_len
);
290 map
.start
= NFS4_MAX_UINT64
;
292 bio
= do_add_page_to_bio(bio
,
293 header
->page_array
.npages
- i
,
295 isect
, pages
[i
], &map
, &be
,
299 header
->pnfs_error
= PTR_ERR(bio
);
304 isect
+= (pg_len
>> SECTOR_SHIFT
);
305 extent_length
-= (pg_len
>> SECTOR_SHIFT
);
307 bytes_left
-= pg_len
;
310 if ((isect
<< SECTOR_SHIFT
) >= header
->inode
->i_size
) {
312 header
->res
.count
= header
->inode
->i_size
- header
->args
.offset
;
314 header
->res
.count
= (isect
<< SECTOR_SHIFT
) - header
->args
.offset
;
318 blk_finish_plug(&plug
);
320 return PNFS_ATTEMPTED
;
323 static void bl_end_io_write(struct bio
*bio
)
325 struct parallel_io
*par
= bio
->bi_private
;
326 struct nfs_pgio_header
*header
= par
->data
;
328 if (bio
->bi_status
) {
329 if (!header
->pnfs_error
)
330 header
->pnfs_error
= -EIO
;
331 pnfs_set_lo_fail(header
->lseg
);
332 bl_mark_devices_unavailable(header
, true);
338 /* Function scheduled for call during bl_end_par_io_write,
339 * it marks sectors as written and extends the commitlist.
341 static void bl_write_cleanup(struct work_struct
*work
)
343 struct rpc_task
*task
= container_of(work
, struct rpc_task
, u
.tk_work
);
344 struct nfs_pgio_header
*hdr
=
345 container_of(task
, struct nfs_pgio_header
, task
);
347 dprintk("%s enter\n", __func__
);
349 if (likely(!hdr
->pnfs_error
)) {
350 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(hdr
->lseg
);
351 u64 start
= hdr
->args
.offset
& (loff_t
)PAGE_MASK
;
352 u64 end
= (hdr
->args
.offset
+ hdr
->args
.count
+
353 PAGE_SIZE
- 1) & (loff_t
)PAGE_MASK
;
354 u64 lwb
= hdr
->args
.offset
+ hdr
->args
.count
;
356 ext_tree_mark_written(bl
, start
>> SECTOR_SHIFT
,
357 (end
- start
) >> SECTOR_SHIFT
, lwb
);
360 pnfs_ld_write_done(hdr
);
363 /* Called when last of bios associated with a bl_write_pagelist call finishes */
364 static void bl_end_par_io_write(void *data
)
366 struct nfs_pgio_header
*hdr
= data
;
368 hdr
->task
.tk_status
= hdr
->pnfs_error
;
369 hdr
->verf
.committed
= NFS_FILE_SYNC
;
370 INIT_WORK(&hdr
->task
.u
.tk_work
, bl_write_cleanup
);
371 schedule_work(&hdr
->task
.u
.tk_work
);
374 static enum pnfs_try_status
375 bl_write_pagelist(struct nfs_pgio_header
*header
, int sync
)
377 struct pnfs_block_layout
*bl
= BLK_LSEG2EXT(header
->lseg
);
378 struct pnfs_block_dev_map map
= { .start
= NFS4_MAX_UINT64
};
379 struct bio
*bio
= NULL
;
380 struct pnfs_block_extent be
;
381 sector_t isect
, extent_length
= 0;
382 struct parallel_io
*par
= NULL
;
383 loff_t offset
= header
->args
.offset
;
384 size_t count
= header
->args
.count
;
385 struct page
**pages
= header
->args
.pages
;
386 int pg_index
= header
->args
.pgbase
>> PAGE_SHIFT
;
388 struct blk_plug plug
;
391 dprintk("%s enter, %zu@%lld\n", __func__
, count
, offset
);
393 /* At this point, header->page_aray is a (sequential) list of nfs_pages.
394 * We want to write each, and if there is an error set pnfs_error
395 * to have it redone using nfs.
397 par
= alloc_parallel(header
);
399 return PNFS_NOT_ATTEMPTED
;
400 par
->pnfs_callback
= bl_end_par_io_write
;
402 blk_start_plug(&plug
);
404 /* we always write out the whole page */
405 offset
= offset
& (loff_t
)PAGE_MASK
;
406 isect
= offset
>> SECTOR_SHIFT
;
408 for (i
= pg_index
; i
< header
->page_array
.npages
; i
++) {
409 if (extent_length
<= 0) {
410 /* We've used up the previous extent */
411 bio
= bl_submit_bio(bio
);
412 /* Get the next one */
413 if (!ext_tree_lookup(bl
, isect
, &be
, true)) {
414 header
->pnfs_error
= -EINVAL
;
418 extent_length
= be
.be_length
- (isect
- be
.be_f_offset
);
422 bio
= do_add_page_to_bio(bio
, header
->page_array
.npages
- i
,
423 REQ_OP_WRITE
, isect
, pages
[i
], &map
,
424 &be
, bl_end_io_write
, par
, 0, &pg_len
);
426 header
->pnfs_error
= PTR_ERR(bio
);
433 isect
+= (pg_len
>> SECTOR_SHIFT
);
434 extent_length
-= (pg_len
>> SECTOR_SHIFT
);
437 header
->res
.count
= header
->args
.count
;
440 blk_finish_plug(&plug
);
442 return PNFS_ATTEMPTED
;
445 static void bl_free_layout_hdr(struct pnfs_layout_hdr
*lo
)
447 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
450 dprintk("%s enter\n", __func__
);
452 err
= ext_tree_remove(bl
, true, 0, LLONG_MAX
);
455 kfree_rcu(bl
, bl_layout
.plh_rcu
);
458 static struct pnfs_layout_hdr
*__bl_alloc_layout_hdr(struct inode
*inode
,
459 gfp_t gfp_flags
, bool is_scsi_layout
)
461 struct pnfs_block_layout
*bl
;
463 dprintk("%s enter\n", __func__
);
464 bl
= kzalloc(sizeof(*bl
), gfp_flags
);
468 bl
->bl_ext_rw
= RB_ROOT
;
469 bl
->bl_ext_ro
= RB_ROOT
;
470 spin_lock_init(&bl
->bl_ext_lock
);
472 bl
->bl_scsi_layout
= is_scsi_layout
;
473 return &bl
->bl_layout
;
476 static struct pnfs_layout_hdr
*bl_alloc_layout_hdr(struct inode
*inode
,
479 return __bl_alloc_layout_hdr(inode
, gfp_flags
, false);
482 static struct pnfs_layout_hdr
*sl_alloc_layout_hdr(struct inode
*inode
,
485 return __bl_alloc_layout_hdr(inode
, gfp_flags
, true);
488 static void bl_free_lseg(struct pnfs_layout_segment
*lseg
)
490 dprintk("%s enter\n", __func__
);
494 /* Tracks info needed to ensure extents in layout obey constraints of spec */
495 struct layout_verification
{
496 u32 mode
; /* R or RW */
497 u64 start
; /* Expected start of next non-COW extent */
498 u64 inval
; /* Start of INVAL coverage */
499 u64 cowread
; /* End of COW read coverage */
502 /* Verify the extent meets the layout requirements of the pnfs-block draft,
505 static int verify_extent(struct pnfs_block_extent
*be
,
506 struct layout_verification
*lv
)
508 if (lv
->mode
== IOMODE_READ
) {
509 if (be
->be_state
== PNFS_BLOCK_READWRITE_DATA
||
510 be
->be_state
== PNFS_BLOCK_INVALID_DATA
)
512 if (be
->be_f_offset
!= lv
->start
)
514 lv
->start
+= be
->be_length
;
517 /* lv->mode == IOMODE_RW */
518 if (be
->be_state
== PNFS_BLOCK_READWRITE_DATA
) {
519 if (be
->be_f_offset
!= lv
->start
)
521 if (lv
->cowread
> lv
->start
)
523 lv
->start
+= be
->be_length
;
524 lv
->inval
= lv
->start
;
526 } else if (be
->be_state
== PNFS_BLOCK_INVALID_DATA
) {
527 if (be
->be_f_offset
!= lv
->start
)
529 lv
->start
+= be
->be_length
;
531 } else if (be
->be_state
== PNFS_BLOCK_READ_DATA
) {
532 if (be
->be_f_offset
> lv
->start
)
534 if (be
->be_f_offset
< lv
->inval
)
536 if (be
->be_f_offset
< lv
->cowread
)
538 /* It looks like you might want to min this with lv->start,
539 * but you really don't.
541 lv
->inval
= lv
->inval
+ be
->be_length
;
542 lv
->cowread
= be
->be_f_offset
+ be
->be_length
;
548 static int decode_sector_number(__be32
**rp
, sector_t
*sp
)
552 *rp
= xdr_decode_hyper(*rp
, &s
);
554 printk(KERN_WARNING
"NFS: %s: sector not aligned\n", __func__
);
557 *sp
= s
>> SECTOR_SHIFT
;
561 static struct nfs4_deviceid_node
*
562 bl_find_get_deviceid(struct nfs_server
*server
,
563 const struct nfs4_deviceid
*id
, const struct cred
*cred
,
566 struct nfs4_deviceid_node
*node
;
570 node
= nfs4_find_get_deviceid(server
, id
, cred
, gfp_mask
);
572 return ERR_PTR(-ENODEV
);
575 * Devices that are marked unavailable are left in the cache with a
576 * timeout to avoid sending GETDEVINFO after every LAYOUTGET, or
577 * constantly attempting to register the device. Once marked as
578 * unavailable they must be deleted and never reused.
580 if (test_bit(NFS_DEVICEID_UNAVAILABLE
, &node
->flags
)) {
581 unsigned long end
= jiffies
;
582 unsigned long start
= end
- PNFS_DEVICE_RETRY_TIMEOUT
;
584 if (!time_in_range(node
->timestamp_unavailable
, start
, end
)) {
585 /* Uncork subsequent GETDEVINFO operations for this device */
586 nfs4_delete_deviceid(node
->ld
, node
->nfs_client
, id
);
592 if (!bl_register_dev(container_of(node
, struct pnfs_block_dev
, node
))) {
594 * If we cannot register, treat this device as transient:
595 * Make a negative cache entry for the device
597 nfs4_mark_deviceid_unavailable(node
);
604 nfs4_put_deviceid_node(node
);
609 bl_alloc_extent(struct xdr_stream
*xdr
, struct pnfs_layout_hdr
*lo
,
610 struct layout_verification
*lv
, struct list_head
*extents
,
613 struct pnfs_block_extent
*be
;
614 struct nfs4_deviceid id
;
618 p
= xdr_inline_decode(xdr
, 28 + NFS4_DEVICEID4_SIZE
);
622 be
= kzalloc(sizeof(*be
), GFP_NOFS
);
626 memcpy(&id
, p
, NFS4_DEVICEID4_SIZE
);
627 p
+= XDR_QUADLEN(NFS4_DEVICEID4_SIZE
);
629 be
->be_device
= bl_find_get_deviceid(NFS_SERVER(lo
->plh_inode
), &id
,
630 lo
->plh_lc_cred
, gfp_mask
);
631 if (IS_ERR(be
->be_device
)) {
632 error
= PTR_ERR(be
->be_device
);
637 * The next three values are read in as bytes, but stored in the
638 * extent structure in 512-byte granularity.
641 if (decode_sector_number(&p
, &be
->be_f_offset
) < 0)
642 goto out_put_deviceid
;
643 if (decode_sector_number(&p
, &be
->be_length
) < 0)
644 goto out_put_deviceid
;
645 if (decode_sector_number(&p
, &be
->be_v_offset
) < 0)
646 goto out_put_deviceid
;
647 be
->be_state
= be32_to_cpup(p
++);
649 error
= verify_extent(be
, lv
);
651 dprintk("%s: extent verification failed\n", __func__
);
652 goto out_put_deviceid
;
655 list_add_tail(&be
->be_list
, extents
);
659 nfs4_put_deviceid_node(be
->be_device
);
665 static struct pnfs_layout_segment
*
666 bl_alloc_lseg(struct pnfs_layout_hdr
*lo
, struct nfs4_layoutget_res
*lgr
,
669 struct layout_verification lv
= {
670 .mode
= lgr
->range
.iomode
,
671 .start
= lgr
->range
.offset
>> SECTOR_SHIFT
,
672 .inval
= lgr
->range
.offset
>> SECTOR_SHIFT
,
673 .cowread
= lgr
->range
.offset
>> SECTOR_SHIFT
,
675 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
676 struct pnfs_layout_segment
*lseg
;
678 struct xdr_stream xdr
;
679 struct page
*scratch
;
685 dprintk("---> %s\n", __func__
);
687 lseg
= kzalloc(sizeof(*lseg
), gfp_mask
);
689 return ERR_PTR(-ENOMEM
);
692 scratch
= alloc_page(gfp_mask
);
696 xdr_init_decode_pages(&xdr
, &buf
,
697 lgr
->layoutp
->pages
, lgr
->layoutp
->len
);
698 xdr_set_scratch_page(&xdr
, scratch
);
701 p
= xdr_inline_decode(&xdr
, 4);
703 goto out_free_scratch
;
705 count
= be32_to_cpup(p
++);
706 dprintk("%s: number of extents %d\n", __func__
, count
);
709 * Decode individual extents, putting them in temporary staging area
710 * until whole layout is decoded to make error recovery easier.
712 for (i
= 0; i
< count
; i
++) {
713 status
= bl_alloc_extent(&xdr
, lo
, &lv
, &extents
, gfp_mask
);
715 goto process_extents
;
718 if (lgr
->range
.offset
+ lgr
->range
.length
!=
719 lv
.start
<< SECTOR_SHIFT
) {
720 dprintk("%s Final length mismatch\n", __func__
);
722 goto process_extents
;
725 if (lv
.start
< lv
.cowread
) {
726 dprintk("%s Final uncovered COW extent\n", __func__
);
731 while (!list_empty(&extents
)) {
732 struct pnfs_block_extent
*be
=
733 list_first_entry(&extents
, struct pnfs_block_extent
,
735 list_del(&be
->be_list
);
738 status
= ext_tree_insert(bl
, be
);
741 nfs4_put_deviceid_node(be
->be_device
);
747 __free_page(scratch
);
749 dprintk("%s returns %d\n", __func__
, status
);
752 /* Our extent block devices are unavailable */
753 set_bit(NFS_LSEG_UNAVAILABLE
, &lseg
->pls_flags
);
759 return ERR_PTR(status
);
764 bl_return_range(struct pnfs_layout_hdr
*lo
,
765 struct pnfs_layout_range
*range
)
767 struct pnfs_block_layout
*bl
= BLK_LO2EXT(lo
);
768 sector_t offset
= range
->offset
>> SECTOR_SHIFT
, end
;
770 if (range
->offset
% 8) {
771 dprintk("%s: offset %lld not block size aligned\n",
772 __func__
, range
->offset
);
776 if (range
->length
!= NFS4_MAX_UINT64
) {
777 if (range
->length
% 8) {
778 dprintk("%s: length %lld not block size aligned\n",
779 __func__
, range
->length
);
783 end
= offset
+ (range
->length
>> SECTOR_SHIFT
);
785 end
= round_down(NFS4_MAX_UINT64
, PAGE_SIZE
);
788 ext_tree_remove(bl
, range
->iomode
& IOMODE_RW
, offset
, end
);
792 bl_prepare_layoutcommit(struct nfs4_layoutcommit_args
*arg
)
794 return ext_tree_prepare_commit(arg
);
798 bl_cleanup_layoutcommit(struct nfs4_layoutcommit_data
*lcdata
)
800 ext_tree_mark_committed(&lcdata
->args
, lcdata
->res
.status
);
804 bl_set_layoutdriver(struct nfs_server
*server
, const struct nfs_fh
*fh
)
806 dprintk("%s enter\n", __func__
);
808 if (server
->pnfs_blksize
== 0) {
809 dprintk("%s Server did not return blksize\n", __func__
);
812 if (server
->pnfs_blksize
> PAGE_SIZE
) {
813 printk(KERN_ERR
"%s: pNFS blksize %d not supported.\n",
814 __func__
, server
->pnfs_blksize
);
822 is_aligned_req(struct nfs_pageio_descriptor
*pgio
,
823 struct nfs_page
*req
, unsigned int alignment
, bool is_write
)
826 * Always accept buffered writes, higher layers take care of the
829 if (pgio
->pg_dreq
== NULL
)
832 if (!IS_ALIGNED(req
->wb_offset
, alignment
))
835 if (IS_ALIGNED(req
->wb_bytes
, alignment
))
839 (req_offset(req
) + req
->wb_bytes
== i_size_read(pgio
->pg_inode
))) {
841 * If the write goes up to the inode size, just write
842 * the full page. Data past the inode size is
843 * guaranteed to be zeroed by the higher level client
844 * code, and this behaviour is mandated by RFC 5663
854 bl_pg_init_read(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*req
)
856 if (!is_aligned_req(pgio
, req
, SECTOR_SIZE
, false)) {
857 nfs_pageio_reset_read_mds(pgio
);
861 pnfs_generic_pg_init_read(pgio
, req
);
864 test_bit(NFS_LSEG_UNAVAILABLE
, &pgio
->pg_lseg
->pls_flags
)) {
865 pnfs_error_mark_layout_for_return(pgio
->pg_inode
, pgio
->pg_lseg
);
866 pnfs_set_lo_fail(pgio
->pg_lseg
);
867 nfs_pageio_reset_read_mds(pgio
);
872 * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
873 * of bytes (maximum @req->wb_bytes) that can be coalesced.
876 bl_pg_test_read(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*prev
,
877 struct nfs_page
*req
)
879 if (!is_aligned_req(pgio
, req
, SECTOR_SIZE
, false))
881 return pnfs_generic_pg_test(pgio
, prev
, req
);
885 * Return the number of contiguous bytes for a given inode
886 * starting at page frame idx.
888 static u64
pnfs_num_cont_bytes(struct inode
*inode
, pgoff_t idx
)
890 struct address_space
*mapping
= inode
->i_mapping
;
893 /* Optimize common case that writes from 0 to end of file */
894 end
= DIV_ROUND_UP(i_size_read(inode
), PAGE_SIZE
);
895 if (end
!= inode
->i_mapping
->nrpages
) {
897 end
= page_cache_next_miss(mapping
, idx
+ 1, ULONG_MAX
);
902 return i_size_read(inode
) - (idx
<< PAGE_SHIFT
);
904 return (end
- idx
) << PAGE_SHIFT
;
908 bl_pg_init_write(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*req
)
912 if (!is_aligned_req(pgio
, req
, PAGE_SIZE
, true)) {
913 nfs_pageio_reset_write_mds(pgio
);
917 if (pgio
->pg_dreq
== NULL
)
918 wb_size
= pnfs_num_cont_bytes(pgio
->pg_inode
, req
->wb_index
);
920 wb_size
= nfs_dreq_bytes_left(pgio
->pg_dreq
, req_offset(req
));
922 pnfs_generic_pg_init_write(pgio
, req
, wb_size
);
925 test_bit(NFS_LSEG_UNAVAILABLE
, &pgio
->pg_lseg
->pls_flags
)) {
927 pnfs_error_mark_layout_for_return(pgio
->pg_inode
, pgio
->pg_lseg
);
928 pnfs_set_lo_fail(pgio
->pg_lseg
);
929 nfs_pageio_reset_write_mds(pgio
);
934 * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
935 * of bytes (maximum @req->wb_bytes) that can be coalesced.
938 bl_pg_test_write(struct nfs_pageio_descriptor
*pgio
, struct nfs_page
*prev
,
939 struct nfs_page
*req
)
941 if (!is_aligned_req(pgio
, req
, PAGE_SIZE
, true))
943 return pnfs_generic_pg_test(pgio
, prev
, req
);
946 static const struct nfs_pageio_ops bl_pg_read_ops
= {
947 .pg_init
= bl_pg_init_read
,
948 .pg_test
= bl_pg_test_read
,
949 .pg_doio
= pnfs_generic_pg_readpages
,
950 .pg_cleanup
= pnfs_generic_pg_cleanup
,
953 static const struct nfs_pageio_ops bl_pg_write_ops
= {
954 .pg_init
= bl_pg_init_write
,
955 .pg_test
= bl_pg_test_write
,
956 .pg_doio
= pnfs_generic_pg_writepages
,
957 .pg_cleanup
= pnfs_generic_pg_cleanup
,
960 static struct pnfs_layoutdriver_type blocklayout_type
= {
961 .id
= LAYOUT_BLOCK_VOLUME
,
962 .name
= "LAYOUT_BLOCK_VOLUME",
963 .owner
= THIS_MODULE
,
964 .flags
= PNFS_LAYOUTRET_ON_SETATTR
|
965 PNFS_LAYOUTRET_ON_ERROR
|
966 PNFS_READ_WHOLE_PAGE
,
967 .read_pagelist
= bl_read_pagelist
,
968 .write_pagelist
= bl_write_pagelist
,
969 .alloc_layout_hdr
= bl_alloc_layout_hdr
,
970 .free_layout_hdr
= bl_free_layout_hdr
,
971 .alloc_lseg
= bl_alloc_lseg
,
972 .free_lseg
= bl_free_lseg
,
973 .return_range
= bl_return_range
,
974 .prepare_layoutcommit
= bl_prepare_layoutcommit
,
975 .cleanup_layoutcommit
= bl_cleanup_layoutcommit
,
976 .set_layoutdriver
= bl_set_layoutdriver
,
977 .alloc_deviceid_node
= bl_alloc_deviceid_node
,
978 .free_deviceid_node
= bl_free_deviceid_node
,
979 .pg_read_ops
= &bl_pg_read_ops
,
980 .pg_write_ops
= &bl_pg_write_ops
,
981 .sync
= pnfs_generic_sync
,
984 static struct pnfs_layoutdriver_type scsilayout_type
= {
986 .name
= "LAYOUT_SCSI",
987 .owner
= THIS_MODULE
,
988 .flags
= PNFS_LAYOUTRET_ON_SETATTR
|
989 PNFS_LAYOUTRET_ON_ERROR
|
990 PNFS_READ_WHOLE_PAGE
,
991 .read_pagelist
= bl_read_pagelist
,
992 .write_pagelist
= bl_write_pagelist
,
993 .alloc_layout_hdr
= sl_alloc_layout_hdr
,
994 .free_layout_hdr
= bl_free_layout_hdr
,
995 .alloc_lseg
= bl_alloc_lseg
,
996 .free_lseg
= bl_free_lseg
,
997 .return_range
= bl_return_range
,
998 .prepare_layoutcommit
= bl_prepare_layoutcommit
,
999 .cleanup_layoutcommit
= bl_cleanup_layoutcommit
,
1000 .set_layoutdriver
= bl_set_layoutdriver
,
1001 .alloc_deviceid_node
= bl_alloc_deviceid_node
,
1002 .free_deviceid_node
= bl_free_deviceid_node
,
1003 .pg_read_ops
= &bl_pg_read_ops
,
1004 .pg_write_ops
= &bl_pg_write_ops
,
1005 .sync
= pnfs_generic_sync
,
1009 static int __init
nfs4blocklayout_init(void)
1013 dprintk("%s: NFSv4 Block Layout Driver Registering...\n", __func__
);
1015 ret
= bl_init_pipefs();
1019 ret
= pnfs_register_layoutdriver(&blocklayout_type
);
1021 goto out_cleanup_pipe
;
1023 ret
= pnfs_register_layoutdriver(&scsilayout_type
);
1025 goto out_unregister_block
;
1028 out_unregister_block
:
1029 pnfs_unregister_layoutdriver(&blocklayout_type
);
1031 bl_cleanup_pipefs();
1036 static void __exit
nfs4blocklayout_exit(void)
1038 dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n",
1041 pnfs_unregister_layoutdriver(&scsilayout_type
);
1042 pnfs_unregister_layoutdriver(&blocklayout_type
);
1043 bl_cleanup_pipefs();
1046 MODULE_ALIAS("nfs-layouttype4-3");
1047 MODULE_ALIAS("nfs-layouttype4-5");
1049 module_init(nfs4blocklayout_init
);
1050 module_exit(nfs4blocklayout_exit
);