pNFS: Add a layoutreturn callback to performa layout-private setup
[linux-block.git] / fs / nfs / pnfs.c
1 /*
2  *  pNFS functions to call and manage layout drivers.
3  *
4  *  Copyright (c) 2002 [year of first publication]
5  *  The Regents of the University of Michigan
6  *  All Rights Reserved
7  *
8  *  Dean Hildebrand <dhildebz@umich.edu>
9  *
10  *  Permission is granted to use, copy, create derivative works, and
11  *  redistribute this software and such derivative works for any purpose,
12  *  so long as the name of the University of Michigan is not used in
13  *  any advertising or publicity pertaining to the use or distribution
14  *  of this software without specific, written prior authorization. If
15  *  the above copyright notice or any other identification of the
16  *  University of Michigan is included in any copy of any portion of
17  *  this software, then the disclaimer below must also be included.
18  *
19  *  This software is provided as is, without representation or warranty
20  *  of any kind either express or implied, including without limitation
21  *  the implied warranties of merchantability, fitness for a particular
22  *  purpose, or noninfringement.  The Regents of the University of
23  *  Michigan shall not be liable for any damages, including special,
24  *  indirect, incidental, or consequential damages, with respect to any
25  *  claim arising out of or in connection with the use of the software,
26  *  even if it has been or is hereafter advised of the possibility of
27  *  such damages.
28  */
29
30 #include <linux/nfs_fs.h>
31 #include <linux/nfs_page.h>
32 #include <linux/module.h>
33 #include <linux/sort.h>
34 #include "internal.h"
35 #include "pnfs.h"
36 #include "iostat.h"
37 #include "nfs4trace.h"
38 #include "delegation.h"
39 #include "nfs42.h"
40
41 #define NFSDBG_FACILITY         NFSDBG_PNFS
42 #define PNFS_LAYOUTGET_RETRY_TIMEOUT (120*HZ)
43
44 /* Locking:
45  *
46  * pnfs_spinlock:
47  *      protects pnfs_modules_tbl.
48  */
49 static DEFINE_SPINLOCK(pnfs_spinlock);
50
51 /*
52  * pnfs_modules_tbl holds all pnfs modules
53  */
54 static LIST_HEAD(pnfs_modules_tbl);
55
56 static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo);
57 static void pnfs_free_returned_lsegs(struct pnfs_layout_hdr *lo,
58                 struct list_head *free_me,
59                 const struct pnfs_layout_range *range,
60                 u32 seq);
61 static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg,
62                                 struct list_head *tmp_list);
63
64 /* Return the registered pnfs layout driver module matching given id */
65 static struct pnfs_layoutdriver_type *
66 find_pnfs_driver_locked(u32 id)
67 {
68         struct pnfs_layoutdriver_type *local;
69
70         list_for_each_entry(local, &pnfs_modules_tbl, pnfs_tblid)
71                 if (local->id == id)
72                         goto out;
73         local = NULL;
74 out:
75         dprintk("%s: Searching for id %u, found %p\n", __func__, id, local);
76         return local;
77 }
78
79 static struct pnfs_layoutdriver_type *
80 find_pnfs_driver(u32 id)
81 {
82         struct pnfs_layoutdriver_type *local;
83
84         spin_lock(&pnfs_spinlock);
85         local = find_pnfs_driver_locked(id);
86         if (local != NULL && !try_module_get(local->owner)) {
87                 dprintk("%s: Could not grab reference on module\n", __func__);
88                 local = NULL;
89         }
90         spin_unlock(&pnfs_spinlock);
91         return local;
92 }
93
94 void
95 unset_pnfs_layoutdriver(struct nfs_server *nfss)
96 {
97         if (nfss->pnfs_curr_ld) {
98                 if (nfss->pnfs_curr_ld->clear_layoutdriver)
99                         nfss->pnfs_curr_ld->clear_layoutdriver(nfss);
100                 /* Decrement the MDS count. Purge the deviceid cache if zero */
101                 if (atomic_dec_and_test(&nfss->nfs_client->cl_mds_count))
102                         nfs4_deviceid_purge_client(nfss->nfs_client);
103                 module_put(nfss->pnfs_curr_ld->owner);
104         }
105         nfss->pnfs_curr_ld = NULL;
106 }
107
108 /*
109  * When the server sends a list of layout types, we choose one in the order
110  * given in the list below.
111  *
112  * FIXME: should this list be configurable in some fashion? module param?
113  *        mount option? something else?
114  */
115 static const u32 ld_prefs[] = {
116         LAYOUT_SCSI,
117         LAYOUT_BLOCK_VOLUME,
118         LAYOUT_OSD2_OBJECTS,
119         LAYOUT_FLEX_FILES,
120         LAYOUT_NFSV4_1_FILES,
121         0
122 };
123
124 static int
125 ld_cmp(const void *e1, const void *e2)
126 {
127         u32 ld1 = *((u32 *)e1);
128         u32 ld2 = *((u32 *)e2);
129         int i;
130
131         for (i = 0; ld_prefs[i] != 0; i++) {
132                 if (ld1 == ld_prefs[i])
133                         return -1;
134
135                 if (ld2 == ld_prefs[i])
136                         return 1;
137         }
138         return 0;
139 }
140
141 /*
142  * Try to set the server's pnfs module to the pnfs layout type specified by id.
143  * Currently only one pNFS layout driver per filesystem is supported.
144  *
145  * @ids array of layout types supported by MDS.
146  */
147 void
148 set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,
149                       struct nfs_fsinfo *fsinfo)
150 {
151         struct pnfs_layoutdriver_type *ld_type = NULL;
152         u32 id;
153         int i;
154
155         if (fsinfo->nlayouttypes == 0)
156                 goto out_no_driver;
157         if (!(server->nfs_client->cl_exchange_flags &
158                  (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) {
159                 printk(KERN_ERR "NFS: %s: cl_exchange_flags 0x%x\n",
160                         __func__, server->nfs_client->cl_exchange_flags);
161                 goto out_no_driver;
162         }
163
164         sort(fsinfo->layouttype, fsinfo->nlayouttypes,
165                 sizeof(*fsinfo->layouttype), ld_cmp, NULL);
166
167         for (i = 0; i < fsinfo->nlayouttypes; i++) {
168                 id = fsinfo->layouttype[i];
169                 ld_type = find_pnfs_driver(id);
170                 if (!ld_type) {
171                         request_module("%s-%u", LAYOUT_NFSV4_1_MODULE_PREFIX,
172                                         id);
173                         ld_type = find_pnfs_driver(id);
174                 }
175                 if (ld_type)
176                         break;
177         }
178
179         if (!ld_type) {
180                 dprintk("%s: No pNFS module found!\n", __func__);
181                 goto out_no_driver;
182         }
183
184         server->pnfs_curr_ld = ld_type;
185         if (ld_type->set_layoutdriver
186             && ld_type->set_layoutdriver(server, mntfh)) {
187                 printk(KERN_ERR "NFS: %s: Error initializing pNFS layout "
188                         "driver %u.\n", __func__, id);
189                 module_put(ld_type->owner);
190                 goto out_no_driver;
191         }
192         /* Bump the MDS count */
193         atomic_inc(&server->nfs_client->cl_mds_count);
194
195         dprintk("%s: pNFS module for %u set\n", __func__, id);
196         return;
197
198 out_no_driver:
199         dprintk("%s: Using NFSv4 I/O\n", __func__);
200         server->pnfs_curr_ld = NULL;
201 }
202
203 int
204 pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *ld_type)
205 {
206         int status = -EINVAL;
207         struct pnfs_layoutdriver_type *tmp;
208
209         if (ld_type->id == 0) {
210                 printk(KERN_ERR "NFS: %s id 0 is reserved\n", __func__);
211                 return status;
212         }
213         if (!ld_type->alloc_lseg || !ld_type->free_lseg) {
214                 printk(KERN_ERR "NFS: %s Layout driver must provide "
215                        "alloc_lseg and free_lseg.\n", __func__);
216                 return status;
217         }
218
219         spin_lock(&pnfs_spinlock);
220         tmp = find_pnfs_driver_locked(ld_type->id);
221         if (!tmp) {
222                 list_add(&ld_type->pnfs_tblid, &pnfs_modules_tbl);
223                 status = 0;
224                 dprintk("%s Registering id:%u name:%s\n", __func__, ld_type->id,
225                         ld_type->name);
226         } else {
227                 printk(KERN_ERR "NFS: %s Module with id %d already loaded!\n",
228                         __func__, ld_type->id);
229         }
230         spin_unlock(&pnfs_spinlock);
231
232         return status;
233 }
234 EXPORT_SYMBOL_GPL(pnfs_register_layoutdriver);
235
236 void
237 pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *ld_type)
238 {
239         dprintk("%s Deregistering id:%u\n", __func__, ld_type->id);
240         spin_lock(&pnfs_spinlock);
241         list_del(&ld_type->pnfs_tblid);
242         spin_unlock(&pnfs_spinlock);
243 }
244 EXPORT_SYMBOL_GPL(pnfs_unregister_layoutdriver);
245
246 /*
247  * pNFS client layout cache
248  */
249
250 /* Need to hold i_lock if caller does not already hold reference */
251 void
252 pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo)
253 {
254         atomic_inc(&lo->plh_refcount);
255 }
256
257 static struct pnfs_layout_hdr *
258 pnfs_alloc_layout_hdr(struct inode *ino, gfp_t gfp_flags)
259 {
260         struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld;
261         return ld->alloc_layout_hdr(ino, gfp_flags);
262 }
263
264 static void
265 pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo)
266 {
267         struct nfs_server *server = NFS_SERVER(lo->plh_inode);
268         struct pnfs_layoutdriver_type *ld = server->pnfs_curr_ld;
269
270         if (!list_empty(&lo->plh_layouts)) {
271                 struct nfs_client *clp = server->nfs_client;
272
273                 spin_lock(&clp->cl_lock);
274                 list_del_init(&lo->plh_layouts);
275                 spin_unlock(&clp->cl_lock);
276         }
277         put_rpccred(lo->plh_lc_cred);
278         return ld->free_layout_hdr(lo);
279 }
280
281 static void
282 pnfs_detach_layout_hdr(struct pnfs_layout_hdr *lo)
283 {
284         struct nfs_inode *nfsi = NFS_I(lo->plh_inode);
285         dprintk("%s: freeing layout cache %p\n", __func__, lo);
286         nfsi->layout = NULL;
287         /* Reset MDS Threshold I/O counters */
288         nfsi->write_io = 0;
289         nfsi->read_io = 0;
290 }
291
292 void
293 pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo)
294 {
295         struct inode *inode = lo->plh_inode;
296
297         pnfs_layoutreturn_before_put_layout_hdr(lo);
298
299         if (atomic_dec_and_lock(&lo->plh_refcount, &inode->i_lock)) {
300                 if (!list_empty(&lo->plh_segs))
301                         WARN_ONCE(1, "NFS: BUG unfreed layout segments.\n");
302                 pnfs_detach_layout_hdr(lo);
303                 spin_unlock(&inode->i_lock);
304                 pnfs_free_layout_hdr(lo);
305         }
306 }
307
308 static void
309 pnfs_set_plh_return_info(struct pnfs_layout_hdr *lo, enum pnfs_iomode iomode,
310                          u32 seq)
311 {
312         if (lo->plh_return_iomode != 0 && lo->plh_return_iomode != iomode)
313                 iomode = IOMODE_ANY;
314         lo->plh_return_iomode = iomode;
315         set_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags);
316         if (seq != 0) {
317                 WARN_ON_ONCE(lo->plh_return_seq != 0 && lo->plh_return_seq != seq);
318                 lo->plh_return_seq = seq;
319         }
320 }
321
322 static void
323 pnfs_clear_layoutreturn_info(struct pnfs_layout_hdr *lo)
324 {
325         lo->plh_return_iomode = 0;
326         lo->plh_return_seq = 0;
327         clear_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags);
328 }
329
330 static void
331 pnfs_clear_lseg_state(struct pnfs_layout_segment *lseg,
332                 struct list_head *free_me)
333 {
334         clear_bit(NFS_LSEG_ROC, &lseg->pls_flags);
335         clear_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
336         if (test_and_clear_bit(NFS_LSEG_VALID, &lseg->pls_flags))
337                 pnfs_lseg_dec_and_remove_zero(lseg, free_me);
338         if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
339                 pnfs_lseg_dec_and_remove_zero(lseg, free_me);
340 }
341
342 /*
343  * Mark a pnfs_layout_hdr and all associated layout segments as invalid
344  *
345  * In order to continue using the pnfs_layout_hdr, a full recovery
346  * is required.
347  * Note that caller must hold inode->i_lock.
348  */
349 int
350 pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,
351                 struct list_head *lseg_list)
352 {
353         struct pnfs_layout_range range = {
354                 .iomode = IOMODE_ANY,
355                 .offset = 0,
356                 .length = NFS4_MAX_UINT64,
357         };
358         struct pnfs_layout_segment *lseg, *next;
359
360         set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags);
361         pnfs_clear_layoutreturn_info(lo);
362         list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
363                 pnfs_clear_lseg_state(lseg, lseg_list);
364         pnfs_free_returned_lsegs(lo, lseg_list, &range, 0);
365         return !list_empty(&lo->plh_segs);
366 }
367
368 static int
369 pnfs_iomode_to_fail_bit(u32 iomode)
370 {
371         return iomode == IOMODE_RW ?
372                 NFS_LAYOUT_RW_FAILED : NFS_LAYOUT_RO_FAILED;
373 }
374
375 static void
376 pnfs_layout_set_fail_bit(struct pnfs_layout_hdr *lo, int fail_bit)
377 {
378         lo->plh_retry_timestamp = jiffies;
379         if (!test_and_set_bit(fail_bit, &lo->plh_flags))
380                 atomic_inc(&lo->plh_refcount);
381 }
382
383 static void
384 pnfs_layout_clear_fail_bit(struct pnfs_layout_hdr *lo, int fail_bit)
385 {
386         if (test_and_clear_bit(fail_bit, &lo->plh_flags))
387                 atomic_dec(&lo->plh_refcount);
388 }
389
390 static void
391 pnfs_layout_io_set_failed(struct pnfs_layout_hdr *lo, u32 iomode)
392 {
393         struct inode *inode = lo->plh_inode;
394         struct pnfs_layout_range range = {
395                 .iomode = iomode,
396                 .offset = 0,
397                 .length = NFS4_MAX_UINT64,
398         };
399         LIST_HEAD(head);
400
401         spin_lock(&inode->i_lock);
402         pnfs_layout_set_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode));
403         pnfs_mark_matching_lsegs_invalid(lo, &head, &range, 0);
404         spin_unlock(&inode->i_lock);
405         pnfs_free_lseg_list(&head);
406         dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__,
407                         iomode == IOMODE_RW ?  "RW" : "READ");
408 }
409
410 static bool
411 pnfs_layout_io_test_failed(struct pnfs_layout_hdr *lo, u32 iomode)
412 {
413         unsigned long start, end;
414         int fail_bit = pnfs_iomode_to_fail_bit(iomode);
415
416         if (test_bit(fail_bit, &lo->plh_flags) == 0)
417                 return false;
418         end = jiffies;
419         start = end - PNFS_LAYOUTGET_RETRY_TIMEOUT;
420         if (!time_in_range(lo->plh_retry_timestamp, start, end)) {
421                 /* It is time to retry the failed layoutgets */
422                 pnfs_layout_clear_fail_bit(lo, fail_bit);
423                 return false;
424         }
425         return true;
426 }
427
428 static void
429 pnfs_init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg,
430                 const struct pnfs_layout_range *range,
431                 const nfs4_stateid *stateid)
432 {
433         INIT_LIST_HEAD(&lseg->pls_list);
434         INIT_LIST_HEAD(&lseg->pls_lc_list);
435         atomic_set(&lseg->pls_refcount, 1);
436         set_bit(NFS_LSEG_VALID, &lseg->pls_flags);
437         lseg->pls_layout = lo;
438         lseg->pls_range = *range;
439         lseg->pls_seq = be32_to_cpu(stateid->seqid);
440 }
441
442 static void pnfs_free_lseg(struct pnfs_layout_segment *lseg)
443 {
444         if (lseg != NULL) {
445                 struct inode *inode = lseg->pls_layout->plh_inode;
446                 NFS_SERVER(inode)->pnfs_curr_ld->free_lseg(lseg);
447         }
448 }
449
450 static void
451 pnfs_layout_remove_lseg(struct pnfs_layout_hdr *lo,
452                 struct pnfs_layout_segment *lseg)
453 {
454         WARN_ON(test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
455         list_del_init(&lseg->pls_list);
456         /* Matched by pnfs_get_layout_hdr in pnfs_layout_insert_lseg */
457         atomic_dec(&lo->plh_refcount);
458         if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags))
459                 return;
460         if (list_empty(&lo->plh_segs) &&
461             !test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) &&
462             !test_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) {
463                 if (atomic_read(&lo->plh_outstanding) == 0)
464                         set_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags);
465                 clear_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
466         }
467 }
468
469 static bool
470 pnfs_cache_lseg_for_layoutreturn(struct pnfs_layout_hdr *lo,
471                 struct pnfs_layout_segment *lseg)
472 {
473         if (test_and_clear_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags) &&
474             pnfs_layout_is_valid(lo)) {
475                 pnfs_set_plh_return_info(lo, lseg->pls_range.iomode, 0);
476                 list_move_tail(&lseg->pls_list, &lo->plh_return_segs);
477                 return true;
478         }
479         return false;
480 }
481
482 void
483 pnfs_put_lseg(struct pnfs_layout_segment *lseg)
484 {
485         struct pnfs_layout_hdr *lo;
486         struct inode *inode;
487
488         if (!lseg)
489                 return;
490
491         dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
492                 atomic_read(&lseg->pls_refcount),
493                 test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
494
495         lo = lseg->pls_layout;
496         inode = lo->plh_inode;
497
498         if (atomic_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) {
499                 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) {
500                         spin_unlock(&inode->i_lock);
501                         return;
502                 }
503                 pnfs_get_layout_hdr(lo);
504                 pnfs_layout_remove_lseg(lo, lseg);
505                 if (pnfs_cache_lseg_for_layoutreturn(lo, lseg))
506                         lseg = NULL;
507                 spin_unlock(&inode->i_lock);
508                 pnfs_free_lseg(lseg);
509                 pnfs_put_layout_hdr(lo);
510         }
511 }
512 EXPORT_SYMBOL_GPL(pnfs_put_lseg);
513
514 static void pnfs_free_lseg_async_work(struct work_struct *work)
515 {
516         struct pnfs_layout_segment *lseg;
517         struct pnfs_layout_hdr *lo;
518
519         lseg = container_of(work, struct pnfs_layout_segment, pls_work);
520         lo = lseg->pls_layout;
521
522         pnfs_free_lseg(lseg);
523         pnfs_put_layout_hdr(lo);
524 }
525
526 static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg)
527 {
528         INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work);
529         schedule_work(&lseg->pls_work);
530 }
531
532 void
533 pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg)
534 {
535         if (!lseg)
536                 return;
537
538         assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock);
539
540         dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
541                 atomic_read(&lseg->pls_refcount),
542                 test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
543         if (atomic_dec_and_test(&lseg->pls_refcount)) {
544                 struct pnfs_layout_hdr *lo = lseg->pls_layout;
545                 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags))
546                         return;
547                 pnfs_layout_remove_lseg(lo, lseg);
548                 if (!pnfs_cache_lseg_for_layoutreturn(lo, lseg)) {
549                         pnfs_get_layout_hdr(lo);
550                         pnfs_free_lseg_async(lseg);
551                 }
552         }
553 }
554 EXPORT_SYMBOL_GPL(pnfs_put_lseg_locked);
555
556 /*
557  * is l2 fully contained in l1?
558  *   start1                             end1
559  *   [----------------------------------)
560  *           start2           end2
561  *           [----------------)
562  */
563 static bool
564 pnfs_lseg_range_contained(const struct pnfs_layout_range *l1,
565                  const struct pnfs_layout_range *l2)
566 {
567         u64 start1 = l1->offset;
568         u64 end1 = pnfs_end_offset(start1, l1->length);
569         u64 start2 = l2->offset;
570         u64 end2 = pnfs_end_offset(start2, l2->length);
571
572         return (start1 <= start2) && (end1 >= end2);
573 }
574
575 static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg,
576                 struct list_head *tmp_list)
577 {
578         if (!atomic_dec_and_test(&lseg->pls_refcount))
579                 return false;
580         pnfs_layout_remove_lseg(lseg->pls_layout, lseg);
581         list_add(&lseg->pls_list, tmp_list);
582         return true;
583 }
584
585 /* Returns 1 if lseg is removed from list, 0 otherwise */
586 static int mark_lseg_invalid(struct pnfs_layout_segment *lseg,
587                              struct list_head *tmp_list)
588 {
589         int rv = 0;
590
591         if (test_and_clear_bit(NFS_LSEG_VALID, &lseg->pls_flags)) {
592                 /* Remove the reference keeping the lseg in the
593                  * list.  It will now be removed when all
594                  * outstanding io is finished.
595                  */
596                 dprintk("%s: lseg %p ref %d\n", __func__, lseg,
597                         atomic_read(&lseg->pls_refcount));
598                 if (pnfs_lseg_dec_and_remove_zero(lseg, tmp_list))
599                         rv = 1;
600         }
601         return rv;
602 }
603
604 /*
605  * Compare 2 layout stateid sequence ids, to see which is newer,
606  * taking into account wraparound issues.
607  */
608 static bool pnfs_seqid_is_newer(u32 s1, u32 s2)
609 {
610         return (s32)(s1 - s2) > 0;
611 }
612
613 static bool
614 pnfs_should_free_range(const struct pnfs_layout_range *lseg_range,
615                  const struct pnfs_layout_range *recall_range)
616 {
617         return (recall_range->iomode == IOMODE_ANY ||
618                 lseg_range->iomode == recall_range->iomode) &&
619                pnfs_lseg_range_intersecting(lseg_range, recall_range);
620 }
621
622 static bool
623 pnfs_match_lseg_recall(const struct pnfs_layout_segment *lseg,
624                 const struct pnfs_layout_range *recall_range,
625                 u32 seq)
626 {
627         if (seq != 0 && pnfs_seqid_is_newer(lseg->pls_seq, seq))
628                 return false;
629         if (recall_range == NULL)
630                 return true;
631         return pnfs_should_free_range(&lseg->pls_range, recall_range);
632 }
633
634 /**
635  * pnfs_mark_matching_lsegs_invalid - tear down lsegs or mark them for later
636  * @lo: layout header containing the lsegs
637  * @tmp_list: list head where doomed lsegs should go
638  * @recall_range: optional recall range argument to match (may be NULL)
639  * @seq: only invalidate lsegs obtained prior to this sequence (may be 0)
640  *
641  * Walk the list of lsegs in the layout header, and tear down any that should
642  * be destroyed. If "recall_range" is specified then the segment must match
643  * that range. If "seq" is non-zero, then only match segments that were handed
644  * out at or before that sequence.
645  *
646  * Returns number of matching invalid lsegs remaining in list after scanning
647  * it and purging them.
648  */
649 int
650 pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
651                             struct list_head *tmp_list,
652                             const struct pnfs_layout_range *recall_range,
653                             u32 seq)
654 {
655         struct pnfs_layout_segment *lseg, *next;
656         int remaining = 0;
657
658         dprintk("%s:Begin lo %p\n", __func__, lo);
659
660         if (list_empty(&lo->plh_segs))
661                 return 0;
662         list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
663                 if (pnfs_match_lseg_recall(lseg, recall_range, seq)) {
664                         dprintk("%s: freeing lseg %p iomode %d seq %u"
665                                 "offset %llu length %llu\n", __func__,
666                                 lseg, lseg->pls_range.iomode, lseg->pls_seq,
667                                 lseg->pls_range.offset, lseg->pls_range.length);
668                         if (!mark_lseg_invalid(lseg, tmp_list))
669                                 remaining++;
670                 }
671         dprintk("%s:Return %i\n", __func__, remaining);
672         return remaining;
673 }
674
675 static void
676 pnfs_free_returned_lsegs(struct pnfs_layout_hdr *lo,
677                 struct list_head *free_me,
678                 const struct pnfs_layout_range *range,
679                 u32 seq)
680 {
681         struct pnfs_layout_segment *lseg, *next;
682
683         list_for_each_entry_safe(lseg, next, &lo->plh_return_segs, pls_list) {
684                 if (pnfs_match_lseg_recall(lseg, range, seq))
685                         list_move_tail(&lseg->pls_list, free_me);
686         }
687 }
688
689 /* note free_me must contain lsegs from a single layout_hdr */
690 void
691 pnfs_free_lseg_list(struct list_head *free_me)
692 {
693         struct pnfs_layout_segment *lseg, *tmp;
694
695         if (list_empty(free_me))
696                 return;
697
698         list_for_each_entry_safe(lseg, tmp, free_me, pls_list) {
699                 list_del(&lseg->pls_list);
700                 pnfs_free_lseg(lseg);
701         }
702 }
703
704 void
705 pnfs_destroy_layout(struct nfs_inode *nfsi)
706 {
707         struct pnfs_layout_hdr *lo;
708         LIST_HEAD(tmp_list);
709
710         spin_lock(&nfsi->vfs_inode.i_lock);
711         lo = nfsi->layout;
712         if (lo) {
713                 pnfs_get_layout_hdr(lo);
714                 pnfs_mark_layout_stateid_invalid(lo, &tmp_list);
715                 pnfs_layout_clear_fail_bit(lo, NFS_LAYOUT_RO_FAILED);
716                 pnfs_layout_clear_fail_bit(lo, NFS_LAYOUT_RW_FAILED);
717                 spin_unlock(&nfsi->vfs_inode.i_lock);
718                 pnfs_free_lseg_list(&tmp_list);
719                 pnfs_put_layout_hdr(lo);
720         } else
721                 spin_unlock(&nfsi->vfs_inode.i_lock);
722 }
723 EXPORT_SYMBOL_GPL(pnfs_destroy_layout);
724
725 static bool
726 pnfs_layout_add_bulk_destroy_list(struct inode *inode,
727                 struct list_head *layout_list)
728 {
729         struct pnfs_layout_hdr *lo;
730         bool ret = false;
731
732         spin_lock(&inode->i_lock);
733         lo = NFS_I(inode)->layout;
734         if (lo != NULL && list_empty(&lo->plh_bulk_destroy)) {
735                 pnfs_get_layout_hdr(lo);
736                 list_add(&lo->plh_bulk_destroy, layout_list);
737                 ret = true;
738         }
739         spin_unlock(&inode->i_lock);
740         return ret;
741 }
742
743 /* Caller must hold rcu_read_lock and clp->cl_lock */
744 static int
745 pnfs_layout_bulk_destroy_byserver_locked(struct nfs_client *clp,
746                 struct nfs_server *server,
747                 struct list_head *layout_list)
748 {
749         struct pnfs_layout_hdr *lo, *next;
750         struct inode *inode;
751
752         list_for_each_entry_safe(lo, next, &server->layouts, plh_layouts) {
753                 if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags))
754                         continue;
755                 inode = igrab(lo->plh_inode);
756                 if (inode == NULL)
757                         continue;
758                 list_del_init(&lo->plh_layouts);
759                 if (pnfs_layout_add_bulk_destroy_list(inode, layout_list))
760                         continue;
761                 rcu_read_unlock();
762                 spin_unlock(&clp->cl_lock);
763                 iput(inode);
764                 spin_lock(&clp->cl_lock);
765                 rcu_read_lock();
766                 return -EAGAIN;
767         }
768         return 0;
769 }
770
771 static int
772 pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list,
773                 bool is_bulk_recall)
774 {
775         struct pnfs_layout_hdr *lo;
776         struct inode *inode;
777         LIST_HEAD(lseg_list);
778         int ret = 0;
779
780         while (!list_empty(layout_list)) {
781                 lo = list_entry(layout_list->next, struct pnfs_layout_hdr,
782                                 plh_bulk_destroy);
783                 dprintk("%s freeing layout for inode %lu\n", __func__,
784                         lo->plh_inode->i_ino);
785                 inode = lo->plh_inode;
786
787                 pnfs_layoutcommit_inode(inode, false);
788
789                 spin_lock(&inode->i_lock);
790                 list_del_init(&lo->plh_bulk_destroy);
791                 if (pnfs_mark_layout_stateid_invalid(lo, &lseg_list)) {
792                         if (is_bulk_recall)
793                                 set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
794                         ret = -EAGAIN;
795                 }
796                 spin_unlock(&inode->i_lock);
797                 pnfs_free_lseg_list(&lseg_list);
798                 /* Free all lsegs that are attached to commit buckets */
799                 nfs_commit_inode(inode, 0);
800                 pnfs_put_layout_hdr(lo);
801                 iput(inode);
802         }
803         return ret;
804 }
805
806 int
807 pnfs_destroy_layouts_byfsid(struct nfs_client *clp,
808                 struct nfs_fsid *fsid,
809                 bool is_recall)
810 {
811         struct nfs_server *server;
812         LIST_HEAD(layout_list);
813
814         spin_lock(&clp->cl_lock);
815         rcu_read_lock();
816 restart:
817         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
818                 if (memcmp(&server->fsid, fsid, sizeof(*fsid)) != 0)
819                         continue;
820                 if (pnfs_layout_bulk_destroy_byserver_locked(clp,
821                                 server,
822                                 &layout_list) != 0)
823                         goto restart;
824         }
825         rcu_read_unlock();
826         spin_unlock(&clp->cl_lock);
827
828         if (list_empty(&layout_list))
829                 return 0;
830         return pnfs_layout_free_bulk_destroy_list(&layout_list, is_recall);
831 }
832
833 int
834 pnfs_destroy_layouts_byclid(struct nfs_client *clp,
835                 bool is_recall)
836 {
837         struct nfs_server *server;
838         LIST_HEAD(layout_list);
839
840         spin_lock(&clp->cl_lock);
841         rcu_read_lock();
842 restart:
843         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
844                 if (pnfs_layout_bulk_destroy_byserver_locked(clp,
845                                         server,
846                                         &layout_list) != 0)
847                         goto restart;
848         }
849         rcu_read_unlock();
850         spin_unlock(&clp->cl_lock);
851
852         if (list_empty(&layout_list))
853                 return 0;
854         return pnfs_layout_free_bulk_destroy_list(&layout_list, is_recall);
855 }
856
857 /*
858  * Called by the state manger to remove all layouts established under an
859  * expired lease.
860  */
861 void
862 pnfs_destroy_all_layouts(struct nfs_client *clp)
863 {
864         nfs4_deviceid_mark_client_invalid(clp);
865         nfs4_deviceid_purge_client(clp);
866
867         pnfs_destroy_layouts_byclid(clp, false);
868 }
869
870 /* update lo->plh_stateid with new if is more recent */
871 void
872 pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new,
873                         bool update_barrier)
874 {
875         u32 oldseq, newseq, new_barrier = 0;
876
877         oldseq = be32_to_cpu(lo->plh_stateid.seqid);
878         newseq = be32_to_cpu(new->seqid);
879
880         if (!pnfs_layout_is_valid(lo)) {
881                 nfs4_stateid_copy(&lo->plh_stateid, new);
882                 lo->plh_barrier = newseq;
883                 pnfs_clear_layoutreturn_info(lo);
884                 clear_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags);
885                 return;
886         }
887         if (pnfs_seqid_is_newer(newseq, oldseq)) {
888                 nfs4_stateid_copy(&lo->plh_stateid, new);
889                 /*
890                  * Because of wraparound, we want to keep the barrier
891                  * "close" to the current seqids.
892                  */
893                 new_barrier = newseq - atomic_read(&lo->plh_outstanding);
894         }
895         if (update_barrier)
896                 new_barrier = be32_to_cpu(new->seqid);
897         else if (new_barrier == 0)
898                 return;
899         if (pnfs_seqid_is_newer(new_barrier, lo->plh_barrier))
900                 lo->plh_barrier = new_barrier;
901 }
902
903 static bool
904 pnfs_layout_stateid_blocked(const struct pnfs_layout_hdr *lo,
905                 const nfs4_stateid *stateid)
906 {
907         u32 seqid = be32_to_cpu(stateid->seqid);
908
909         return !pnfs_seqid_is_newer(seqid, lo->plh_barrier);
910 }
911
912 /* lget is set to 1 if called from inside send_layoutget call chain */
913 static bool
914 pnfs_layoutgets_blocked(const struct pnfs_layout_hdr *lo)
915 {
916         return lo->plh_block_lgets ||
917                 test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
918 }
919
920 /*
921  * Get layout from server.
922  *    for now, assume that whole file layouts are requested.
923  *    arg->offset: 0
924  *    arg->length: all ones
925  */
926 static struct pnfs_layout_segment *
927 send_layoutget(struct pnfs_layout_hdr *lo,
928            struct nfs_open_context *ctx,
929            nfs4_stateid *stateid,
930            const struct pnfs_layout_range *range,
931            long *timeout, gfp_t gfp_flags)
932 {
933         struct inode *ino = lo->plh_inode;
934         struct nfs_server *server = NFS_SERVER(ino);
935         struct nfs4_layoutget *lgp;
936         loff_t i_size;
937
938         dprintk("--> %s\n", __func__);
939
940         /*
941          * Synchronously retrieve layout information from server and
942          * store in lseg. If we race with a concurrent seqid morphing
943          * op, then re-send the LAYOUTGET.
944          */
945         lgp = kzalloc(sizeof(*lgp), gfp_flags);
946         if (lgp == NULL)
947                 return ERR_PTR(-ENOMEM);
948
949         i_size = i_size_read(ino);
950
951         lgp->args.minlength = PAGE_SIZE;
952         if (lgp->args.minlength > range->length)
953                 lgp->args.minlength = range->length;
954         if (range->iomode == IOMODE_READ) {
955                 if (range->offset >= i_size)
956                         lgp->args.minlength = 0;
957                 else if (i_size - range->offset < lgp->args.minlength)
958                         lgp->args.minlength = i_size - range->offset;
959         }
960         lgp->args.maxcount = PNFS_LAYOUT_MAXSIZE;
961         pnfs_copy_range(&lgp->args.range, range);
962         lgp->args.type = server->pnfs_curr_ld->id;
963         lgp->args.inode = ino;
964         lgp->args.ctx = get_nfs_open_context(ctx);
965         nfs4_stateid_copy(&lgp->args.stateid, stateid);
966         lgp->gfp_flags = gfp_flags;
967         lgp->cred = lo->plh_lc_cred;
968
969         return nfs4_proc_layoutget(lgp, timeout, gfp_flags);
970 }
971
972 static void pnfs_clear_layoutcommit(struct inode *inode,
973                 struct list_head *head)
974 {
975         struct nfs_inode *nfsi = NFS_I(inode);
976         struct pnfs_layout_segment *lseg, *tmp;
977
978         if (!test_and_clear_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags))
979                 return;
980         list_for_each_entry_safe(lseg, tmp, &nfsi->layout->plh_segs, pls_list) {
981                 if (!test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
982                         continue;
983                 pnfs_lseg_dec_and_remove_zero(lseg, head);
984         }
985 }
986
987 static void pnfs_clear_layoutreturn_waitbit(struct pnfs_layout_hdr *lo)
988 {
989         clear_bit_unlock(NFS_LAYOUT_RETURN, &lo->plh_flags);
990         clear_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags);
991         smp_mb__after_atomic();
992         wake_up_bit(&lo->plh_flags, NFS_LAYOUT_RETURN);
993         rpc_wake_up(&NFS_SERVER(lo->plh_inode)->roc_rpcwaitq);
994 }
995
996 void pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo,
997                 const nfs4_stateid *arg_stateid,
998                 const struct pnfs_layout_range *range,
999                 const nfs4_stateid *stateid)
1000 {
1001         struct inode *inode = lo->plh_inode;
1002         LIST_HEAD(freeme);
1003
1004         spin_lock(&inode->i_lock);
1005         if (!pnfs_layout_is_valid(lo) || !arg_stateid ||
1006             !nfs4_stateid_match_other(&lo->plh_stateid, arg_stateid))
1007                 goto out_unlock;
1008         if (stateid) {
1009                 u32 seq = be32_to_cpu(arg_stateid->seqid);
1010
1011                 pnfs_mark_matching_lsegs_invalid(lo, &freeme, range, seq);
1012                 pnfs_free_returned_lsegs(lo, &freeme, range, seq);
1013                 pnfs_set_layout_stateid(lo, stateid, true);
1014         } else
1015                 pnfs_mark_layout_stateid_invalid(lo, &freeme);
1016 out_unlock:
1017         pnfs_clear_layoutreturn_waitbit(lo);
1018         spin_unlock(&inode->i_lock);
1019         pnfs_free_lseg_list(&freeme);
1020
1021 }
1022
1023 static bool
1024 pnfs_prepare_layoutreturn(struct pnfs_layout_hdr *lo,
1025                 nfs4_stateid *stateid,
1026                 enum pnfs_iomode *iomode)
1027 {
1028         /* Serialise LAYOUTGET/LAYOUTRETURN */
1029         if (atomic_read(&lo->plh_outstanding) != 0)
1030                 return false;
1031         if (test_and_set_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags))
1032                 return false;
1033         set_bit(NFS_LAYOUT_RETURN, &lo->plh_flags);
1034         pnfs_get_layout_hdr(lo);
1035         if (test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) {
1036                 if (stateid != NULL) {
1037                         nfs4_stateid_copy(stateid, &lo->plh_stateid);
1038                         if (lo->plh_return_seq != 0)
1039                                 stateid->seqid = cpu_to_be32(lo->plh_return_seq);
1040                 }
1041                 if (iomode != NULL)
1042                         *iomode = lo->plh_return_iomode;
1043                 pnfs_clear_layoutreturn_info(lo);
1044                 return true;
1045         }
1046         if (stateid != NULL)
1047                 nfs4_stateid_copy(stateid, &lo->plh_stateid);
1048         if (iomode != NULL)
1049                 *iomode = IOMODE_ANY;
1050         return true;
1051 }
1052
1053 static void
1054 pnfs_init_layoutreturn_args(struct nfs4_layoutreturn_args *args,
1055                 struct pnfs_layout_hdr *lo,
1056                 const nfs4_stateid *stateid,
1057                 enum pnfs_iomode iomode)
1058 {
1059         struct inode *inode = lo->plh_inode;
1060
1061         args->layout_type = NFS_SERVER(inode)->pnfs_curr_ld->id;
1062         args->inode = inode;
1063         args->range.iomode = iomode;
1064         args->range.offset = 0;
1065         args->range.length = NFS4_MAX_UINT64;
1066         args->layout = lo;
1067         nfs4_stateid_copy(&args->stateid, stateid);
1068 }
1069
1070 static int
1071 pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo, const nfs4_stateid *stateid,
1072                        enum pnfs_iomode iomode, bool sync)
1073 {
1074         struct inode *ino = lo->plh_inode;
1075         struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld;
1076         struct nfs4_layoutreturn *lrp;
1077         int status = 0;
1078
1079         lrp = kzalloc(sizeof(*lrp), GFP_NOFS);
1080         if (unlikely(lrp == NULL)) {
1081                 status = -ENOMEM;
1082                 spin_lock(&ino->i_lock);
1083                 pnfs_clear_layoutreturn_waitbit(lo);
1084                 spin_unlock(&ino->i_lock);
1085                 pnfs_put_layout_hdr(lo);
1086                 goto out;
1087         }
1088
1089         pnfs_init_layoutreturn_args(&lrp->args, lo, stateid, iomode);
1090         lrp->args.ld_private = &lrp->ld_private;
1091         lrp->clp = NFS_SERVER(ino)->nfs_client;
1092         lrp->cred = lo->plh_lc_cred;
1093         if (ld->prepare_layoutreturn)
1094                 ld->prepare_layoutreturn(&lrp->args);
1095
1096         status = nfs4_proc_layoutreturn(lrp, sync);
1097 out:
1098         dprintk("<-- %s status: %d\n", __func__, status);
1099         return status;
1100 }
1101
1102 /* Return true if layoutreturn is needed */
1103 static bool
1104 pnfs_layout_need_return(struct pnfs_layout_hdr *lo)
1105 {
1106         struct pnfs_layout_segment *s;
1107
1108         if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
1109                 return false;
1110
1111         /* Defer layoutreturn until all lsegs are done */
1112         list_for_each_entry(s, &lo->plh_segs, pls_list) {
1113                 if (test_bit(NFS_LSEG_LAYOUTRETURN, &s->pls_flags))
1114                         return false;
1115         }
1116
1117         return true;
1118 }
1119
1120 static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
1121 {
1122         struct inode *inode= lo->plh_inode;
1123
1124         if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
1125                 return;
1126         spin_lock(&inode->i_lock);
1127         if (pnfs_layout_need_return(lo)) {
1128                 nfs4_stateid stateid;
1129                 enum pnfs_iomode iomode;
1130                 bool send;
1131
1132                 send = pnfs_prepare_layoutreturn(lo, &stateid, &iomode);
1133                 spin_unlock(&inode->i_lock);
1134                 if (send) {
1135                         /* Send an async layoutreturn so we dont deadlock */
1136                         pnfs_send_layoutreturn(lo, &stateid, iomode, false);
1137                 }
1138         } else
1139                 spin_unlock(&inode->i_lock);
1140 }
1141
1142 /*
1143  * Initiates a LAYOUTRETURN(FILE), and removes the pnfs_layout_hdr
1144  * when the layout segment list is empty.
1145  *
1146  * Note that a pnfs_layout_hdr can exist with an empty layout segment
1147  * list when LAYOUTGET has failed, or when LAYOUTGET succeeded, but the
1148  * deviceid is marked invalid.
1149  */
1150 int
1151 _pnfs_return_layout(struct inode *ino)
1152 {
1153         struct pnfs_layout_hdr *lo = NULL;
1154         struct nfs_inode *nfsi = NFS_I(ino);
1155         LIST_HEAD(tmp_list);
1156         nfs4_stateid stateid;
1157         int status = 0;
1158         bool send;
1159
1160         dprintk("NFS: %s for inode %lu\n", __func__, ino->i_ino);
1161
1162         spin_lock(&ino->i_lock);
1163         lo = nfsi->layout;
1164         if (!lo) {
1165                 spin_unlock(&ino->i_lock);
1166                 dprintk("NFS: %s no layout to return\n", __func__);
1167                 goto out;
1168         }
1169         /* Reference matched in nfs4_layoutreturn_release */
1170         pnfs_get_layout_hdr(lo);
1171         /* Is there an outstanding layoutreturn ? */
1172         if (test_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags)) {
1173                 spin_unlock(&ino->i_lock);
1174                 if (wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN,
1175                                         TASK_UNINTERRUPTIBLE))
1176                         goto out_put_layout_hdr;
1177                 spin_lock(&ino->i_lock);
1178         }
1179         pnfs_clear_layoutcommit(ino, &tmp_list);
1180         pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0);
1181
1182         if (NFS_SERVER(ino)->pnfs_curr_ld->return_range) {
1183                 struct pnfs_layout_range range = {
1184                         .iomode         = IOMODE_ANY,
1185                         .offset         = 0,
1186                         .length         = NFS4_MAX_UINT64,
1187                 };
1188                 NFS_SERVER(ino)->pnfs_curr_ld->return_range(lo, &range);
1189         }
1190
1191         /* Don't send a LAYOUTRETURN if list was initially empty */
1192         if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) {
1193                 spin_unlock(&ino->i_lock);
1194                 dprintk("NFS: %s no layout segments to return\n", __func__);
1195                 goto out_put_layout_hdr;
1196         }
1197
1198         send = pnfs_prepare_layoutreturn(lo, &stateid, NULL);
1199         spin_unlock(&ino->i_lock);
1200         pnfs_free_lseg_list(&tmp_list);
1201         if (send)
1202                 status = pnfs_send_layoutreturn(lo, &stateid, IOMODE_ANY, true);
1203 out_put_layout_hdr:
1204         pnfs_put_layout_hdr(lo);
1205 out:
1206         dprintk("<-- %s status: %d\n", __func__, status);
1207         return status;
1208 }
1209 EXPORT_SYMBOL_GPL(_pnfs_return_layout);
1210
1211 int
1212 pnfs_commit_and_return_layout(struct inode *inode)
1213 {
1214         struct pnfs_layout_hdr *lo;
1215         int ret;
1216
1217         spin_lock(&inode->i_lock);
1218         lo = NFS_I(inode)->layout;
1219         if (lo == NULL) {
1220                 spin_unlock(&inode->i_lock);
1221                 return 0;
1222         }
1223         pnfs_get_layout_hdr(lo);
1224         /* Block new layoutgets and read/write to ds */
1225         lo->plh_block_lgets++;
1226         spin_unlock(&inode->i_lock);
1227         filemap_fdatawait(inode->i_mapping);
1228         ret = pnfs_layoutcommit_inode(inode, true);
1229         if (ret == 0)
1230                 ret = _pnfs_return_layout(inode);
1231         spin_lock(&inode->i_lock);
1232         lo->plh_block_lgets--;
1233         spin_unlock(&inode->i_lock);
1234         pnfs_put_layout_hdr(lo);
1235         return ret;
1236 }
1237
1238 bool pnfs_roc(struct inode *ino,
1239                 struct nfs4_layoutreturn_args *args,
1240                 struct nfs4_layoutreturn_res *res,
1241                 const struct rpc_cred *cred)
1242 {
1243         struct nfs_inode *nfsi = NFS_I(ino);
1244         struct nfs_open_context *ctx;
1245         struct nfs4_state *state;
1246         struct pnfs_layout_hdr *lo;
1247         struct pnfs_layout_segment *lseg, *next;
1248         nfs4_stateid stateid;
1249         enum pnfs_iomode iomode = 0;
1250         bool layoutreturn = false, roc = false;
1251
1252         if (!nfs_have_layout(ino))
1253                 return false;
1254 retry:
1255         spin_lock(&ino->i_lock);
1256         lo = nfsi->layout;
1257         if (!lo || !pnfs_layout_is_valid(lo) ||
1258             test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags))
1259                 goto out_noroc;
1260         if (test_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags)) {
1261                 pnfs_get_layout_hdr(lo);
1262                 spin_unlock(&ino->i_lock);
1263                 wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN,
1264                                 TASK_UNINTERRUPTIBLE);
1265                 pnfs_put_layout_hdr(lo);
1266                 goto retry;
1267         }
1268
1269         /* no roc if we hold a delegation */
1270         if (nfs4_check_delegation(ino, FMODE_READ))
1271                 goto out_noroc;
1272
1273         list_for_each_entry(ctx, &nfsi->open_files, list) {
1274                 state = ctx->state;
1275                 /* Don't return layout if there is open file state */
1276                 if (state != NULL && state->state != 0)
1277                         goto out_noroc;
1278         }
1279
1280
1281         list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) {
1282                 /* If we are sending layoutreturn, invalidate all valid lsegs */
1283                 if (!test_and_clear_bit(NFS_LSEG_ROC, &lseg->pls_flags))
1284                         continue;
1285                 /*
1286                  * Note: mark lseg for return so pnfs_layout_remove_lseg
1287                  * doesn't invalidate the layout for us.
1288                  */
1289                 set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
1290                 if (!mark_lseg_invalid(lseg, &lo->plh_return_segs))
1291                         continue;
1292                 pnfs_set_plh_return_info(lo, lseg->pls_range.iomode, 0);
1293         }
1294
1295         if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
1296                 goto out_noroc;
1297
1298         /* ROC in two conditions:
1299          * 1. there are ROC lsegs
1300          * 2. we don't send layoutreturn
1301          */
1302         /* lo ref dropped in pnfs_roc_release() */
1303         layoutreturn = pnfs_prepare_layoutreturn(lo, &stateid, &iomode);
1304         /* If the creds don't match, we can't compound the layoutreturn */
1305         if (!layoutreturn || cred != lo->plh_lc_cred)
1306                 goto out_noroc;
1307
1308         roc = layoutreturn;
1309         pnfs_init_layoutreturn_args(args, lo, &stateid, iomode);
1310         res->lrs_present = 0;
1311         layoutreturn = false;
1312
1313 out_noroc:
1314         spin_unlock(&ino->i_lock);
1315         pnfs_layoutcommit_inode(ino, true);
1316         if (roc) {
1317                 struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld;
1318                 if (ld->prepare_layoutreturn)
1319                         ld->prepare_layoutreturn(args);
1320                 return true;
1321         }
1322         if (layoutreturn)
1323                 pnfs_send_layoutreturn(lo, &stateid, iomode, true);
1324         return false;
1325 }
1326
1327 void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
1328                 struct nfs4_layoutreturn_res *res,
1329                 int ret)
1330 {
1331         struct pnfs_layout_hdr *lo = args->layout;
1332         const nfs4_stateid *arg_stateid = NULL;
1333         const nfs4_stateid *res_stateid = NULL;
1334         struct nfs4_xdr_opaque_data *ld_private = args->ld_private;
1335
1336         if (ret == 0) {
1337                 arg_stateid = &args->stateid;
1338                 if (res->lrs_present)
1339                         res_stateid = &res->stateid;
1340         }
1341         pnfs_layoutreturn_free_lsegs(lo, arg_stateid, &args->range,
1342                         res_stateid);
1343         if (ld_private && ld_private->ops && ld_private->ops->free)
1344                 ld_private->ops->free(ld_private);
1345         pnfs_put_layout_hdr(lo);
1346         trace_nfs4_layoutreturn_on_close(args->inode, 0);
1347 }
1348
1349 bool pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task)
1350 {
1351         struct nfs_inode *nfsi = NFS_I(ino);
1352         struct pnfs_layout_hdr *lo;
1353         bool sleep = false;
1354
1355         /* we might not have grabbed lo reference. so need to check under
1356          * i_lock */
1357         spin_lock(&ino->i_lock);
1358         lo = nfsi->layout;
1359         if (lo && test_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) {
1360                 rpc_sleep_on(&NFS_SERVER(ino)->roc_rpcwaitq, task, NULL);
1361                 sleep = true;
1362         }
1363         spin_unlock(&ino->i_lock);
1364         return sleep;
1365 }
1366
1367 /*
1368  * Compare two layout segments for sorting into layout cache.
1369  * We want to preferentially return RW over RO layouts, so ensure those
1370  * are seen first.
1371  */
1372 static s64
1373 pnfs_lseg_range_cmp(const struct pnfs_layout_range *l1,
1374            const struct pnfs_layout_range *l2)
1375 {
1376         s64 d;
1377
1378         /* high offset > low offset */
1379         d = l1->offset - l2->offset;
1380         if (d)
1381                 return d;
1382
1383         /* short length > long length */
1384         d = l2->length - l1->length;
1385         if (d)
1386                 return d;
1387
1388         /* read > read/write */
1389         return (int)(l1->iomode == IOMODE_READ) - (int)(l2->iomode == IOMODE_READ);
1390 }
1391
1392 static bool
1393 pnfs_lseg_range_is_after(const struct pnfs_layout_range *l1,
1394                 const struct pnfs_layout_range *l2)
1395 {
1396         return pnfs_lseg_range_cmp(l1, l2) > 0;
1397 }
1398
1399 static bool
1400 pnfs_lseg_no_merge(struct pnfs_layout_segment *lseg,
1401                 struct pnfs_layout_segment *old)
1402 {
1403         return false;
1404 }
1405
1406 void
1407 pnfs_generic_layout_insert_lseg(struct pnfs_layout_hdr *lo,
1408                    struct pnfs_layout_segment *lseg,
1409                    bool (*is_after)(const struct pnfs_layout_range *,
1410                            const struct pnfs_layout_range *),
1411                    bool (*do_merge)(struct pnfs_layout_segment *,
1412                            struct pnfs_layout_segment *),
1413                    struct list_head *free_me)
1414 {
1415         struct pnfs_layout_segment *lp, *tmp;
1416
1417         dprintk("%s:Begin\n", __func__);
1418
1419         list_for_each_entry_safe(lp, tmp, &lo->plh_segs, pls_list) {
1420                 if (test_bit(NFS_LSEG_VALID, &lp->pls_flags) == 0)
1421                         continue;
1422                 if (do_merge(lseg, lp)) {
1423                         mark_lseg_invalid(lp, free_me);
1424                         continue;
1425                 }
1426                 if (is_after(&lseg->pls_range, &lp->pls_range))
1427                         continue;
1428                 list_add_tail(&lseg->pls_list, &lp->pls_list);
1429                 dprintk("%s: inserted lseg %p "
1430                         "iomode %d offset %llu length %llu before "
1431                         "lp %p iomode %d offset %llu length %llu\n",
1432                         __func__, lseg, lseg->pls_range.iomode,
1433                         lseg->pls_range.offset, lseg->pls_range.length,
1434                         lp, lp->pls_range.iomode, lp->pls_range.offset,
1435                         lp->pls_range.length);
1436                 goto out;
1437         }
1438         list_add_tail(&lseg->pls_list, &lo->plh_segs);
1439         dprintk("%s: inserted lseg %p "
1440                 "iomode %d offset %llu length %llu at tail\n",
1441                 __func__, lseg, lseg->pls_range.iomode,
1442                 lseg->pls_range.offset, lseg->pls_range.length);
1443 out:
1444         pnfs_get_layout_hdr(lo);
1445
1446         dprintk("%s:Return\n", __func__);
1447 }
1448 EXPORT_SYMBOL_GPL(pnfs_generic_layout_insert_lseg);
1449
1450 static void
1451 pnfs_layout_insert_lseg(struct pnfs_layout_hdr *lo,
1452                    struct pnfs_layout_segment *lseg,
1453                    struct list_head *free_me)
1454 {
1455         struct inode *inode = lo->plh_inode;
1456         struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
1457
1458         if (ld->add_lseg != NULL)
1459                 ld->add_lseg(lo, lseg, free_me);
1460         else
1461                 pnfs_generic_layout_insert_lseg(lo, lseg,
1462                                 pnfs_lseg_range_is_after,
1463                                 pnfs_lseg_no_merge,
1464                                 free_me);
1465 }
1466
1467 static struct pnfs_layout_hdr *
1468 alloc_init_layout_hdr(struct inode *ino,
1469                       struct nfs_open_context *ctx,
1470                       gfp_t gfp_flags)
1471 {
1472         struct pnfs_layout_hdr *lo;
1473
1474         lo = pnfs_alloc_layout_hdr(ino, gfp_flags);
1475         if (!lo)
1476                 return NULL;
1477         atomic_set(&lo->plh_refcount, 1);
1478         INIT_LIST_HEAD(&lo->plh_layouts);
1479         INIT_LIST_HEAD(&lo->plh_segs);
1480         INIT_LIST_HEAD(&lo->plh_return_segs);
1481         INIT_LIST_HEAD(&lo->plh_bulk_destroy);
1482         lo->plh_inode = ino;
1483         lo->plh_lc_cred = get_rpccred(ctx->cred);
1484         lo->plh_flags |= 1 << NFS_LAYOUT_INVALID_STID;
1485         return lo;
1486 }
1487
1488 static struct pnfs_layout_hdr *
1489 pnfs_find_alloc_layout(struct inode *ino,
1490                        struct nfs_open_context *ctx,
1491                        gfp_t gfp_flags)
1492         __releases(&ino->i_lock)
1493         __acquires(&ino->i_lock)
1494 {
1495         struct nfs_inode *nfsi = NFS_I(ino);
1496         struct pnfs_layout_hdr *new = NULL;
1497
1498         dprintk("%s Begin ino=%p layout=%p\n", __func__, ino, nfsi->layout);
1499
1500         if (nfsi->layout != NULL)
1501                 goto out_existing;
1502         spin_unlock(&ino->i_lock);
1503         new = alloc_init_layout_hdr(ino, ctx, gfp_flags);
1504         spin_lock(&ino->i_lock);
1505
1506         if (likely(nfsi->layout == NULL)) {     /* Won the race? */
1507                 nfsi->layout = new;
1508                 return new;
1509         } else if (new != NULL)
1510                 pnfs_free_layout_hdr(new);
1511 out_existing:
1512         pnfs_get_layout_hdr(nfsi->layout);
1513         return nfsi->layout;
1514 }
1515
1516 /*
1517  * iomode matching rules:
1518  * iomode       lseg    strict match
1519  *                      iomode
1520  * -----        -----   ------ -----
1521  * ANY          READ    N/A    true
1522  * ANY          RW      N/A    true
1523  * RW           READ    N/A    false
1524  * RW           RW      N/A    true
1525  * READ         READ    N/A    true
1526  * READ         RW      true   false
1527  * READ         RW      false  true
1528  */
1529 static bool
1530 pnfs_lseg_range_match(const struct pnfs_layout_range *ls_range,
1531                  const struct pnfs_layout_range *range,
1532                  bool strict_iomode)
1533 {
1534         struct pnfs_layout_range range1;
1535
1536         if ((range->iomode == IOMODE_RW &&
1537              ls_range->iomode != IOMODE_RW) ||
1538             (range->iomode != ls_range->iomode &&
1539              strict_iomode == true) ||
1540             !pnfs_lseg_range_intersecting(ls_range, range))
1541                 return 0;
1542
1543         /* range1 covers only the first byte in the range */
1544         range1 = *range;
1545         range1.length = 1;
1546         return pnfs_lseg_range_contained(ls_range, &range1);
1547 }
1548
1549 /*
1550  * lookup range in layout
1551  */
1552 static struct pnfs_layout_segment *
1553 pnfs_find_lseg(struct pnfs_layout_hdr *lo,
1554                 struct pnfs_layout_range *range,
1555                 bool strict_iomode)
1556 {
1557         struct pnfs_layout_segment *lseg, *ret = NULL;
1558
1559         dprintk("%s:Begin\n", __func__);
1560
1561         list_for_each_entry(lseg, &lo->plh_segs, pls_list) {
1562                 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags) &&
1563                     !test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags) &&
1564                     pnfs_lseg_range_match(&lseg->pls_range, range,
1565                                           strict_iomode)) {
1566                         ret = pnfs_get_lseg(lseg);
1567                         break;
1568                 }
1569         }
1570
1571         dprintk("%s:Return lseg %p ref %d\n",
1572                 __func__, ret, ret ? atomic_read(&ret->pls_refcount) : 0);
1573         return ret;
1574 }
1575
1576 /*
1577  * Use mdsthreshold hints set at each OPEN to determine if I/O should go
1578  * to the MDS or over pNFS
1579  *
1580  * The nfs_inode read_io and write_io fields are cumulative counters reset
1581  * when there are no layout segments. Note that in pnfs_update_layout iomode
1582  * is set to IOMODE_READ for a READ request, and set to IOMODE_RW for a
1583  * WRITE request.
1584  *
1585  * A return of true means use MDS I/O.
1586  *
1587  * From rfc 5661:
1588  * If a file's size is smaller than the file size threshold, data accesses
1589  * SHOULD be sent to the metadata server.  If an I/O request has a length that
1590  * is below the I/O size threshold, the I/O SHOULD be sent to the metadata
1591  * server.  If both file size and I/O size are provided, the client SHOULD
1592  * reach or exceed  both thresholds before sending its read or write
1593  * requests to the data server.
1594  */
1595 static bool pnfs_within_mdsthreshold(struct nfs_open_context *ctx,
1596                                      struct inode *ino, int iomode)
1597 {
1598         struct nfs4_threshold *t = ctx->mdsthreshold;
1599         struct nfs_inode *nfsi = NFS_I(ino);
1600         loff_t fsize = i_size_read(ino);
1601         bool size = false, size_set = false, io = false, io_set = false, ret = false;
1602
1603         if (t == NULL)
1604                 return ret;
1605
1606         dprintk("%s bm=0x%x rd_sz=%llu wr_sz=%llu rd_io=%llu wr_io=%llu\n",
1607                 __func__, t->bm, t->rd_sz, t->wr_sz, t->rd_io_sz, t->wr_io_sz);
1608
1609         switch (iomode) {
1610         case IOMODE_READ:
1611                 if (t->bm & THRESHOLD_RD) {
1612                         dprintk("%s fsize %llu\n", __func__, fsize);
1613                         size_set = true;
1614                         if (fsize < t->rd_sz)
1615                                 size = true;
1616                 }
1617                 if (t->bm & THRESHOLD_RD_IO) {
1618                         dprintk("%s nfsi->read_io %llu\n", __func__,
1619                                 nfsi->read_io);
1620                         io_set = true;
1621                         if (nfsi->read_io < t->rd_io_sz)
1622                                 io = true;
1623                 }
1624                 break;
1625         case IOMODE_RW:
1626                 if (t->bm & THRESHOLD_WR) {
1627                         dprintk("%s fsize %llu\n", __func__, fsize);
1628                         size_set = true;
1629                         if (fsize < t->wr_sz)
1630                                 size = true;
1631                 }
1632                 if (t->bm & THRESHOLD_WR_IO) {
1633                         dprintk("%s nfsi->write_io %llu\n", __func__,
1634                                 nfsi->write_io);
1635                         io_set = true;
1636                         if (nfsi->write_io < t->wr_io_sz)
1637                                 io = true;
1638                 }
1639                 break;
1640         }
1641         if (size_set && io_set) {
1642                 if (size && io)
1643                         ret = true;
1644         } else if (size || io)
1645                 ret = true;
1646
1647         dprintk("<-- %s size %d io %d ret %d\n", __func__, size, io, ret);
1648         return ret;
1649 }
1650
1651 static bool pnfs_prepare_to_retry_layoutget(struct pnfs_layout_hdr *lo)
1652 {
1653         /*
1654          * send layoutcommit as it can hold up layoutreturn due to lseg
1655          * reference
1656          */
1657         pnfs_layoutcommit_inode(lo->plh_inode, false);
1658         return !wait_on_bit_action(&lo->plh_flags, NFS_LAYOUT_RETURN,
1659                                    nfs_wait_bit_killable,
1660                                    TASK_UNINTERRUPTIBLE);
1661 }
1662
1663 static void pnfs_clear_first_layoutget(struct pnfs_layout_hdr *lo)
1664 {
1665         unsigned long *bitlock = &lo->plh_flags;
1666
1667         clear_bit_unlock(NFS_LAYOUT_FIRST_LAYOUTGET, bitlock);
1668         smp_mb__after_atomic();
1669         wake_up_bit(bitlock, NFS_LAYOUT_FIRST_LAYOUTGET);
1670 }
1671
1672 /*
1673  * Layout segment is retreived from the server if not cached.
1674  * The appropriate layout segment is referenced and returned to the caller.
1675  */
1676 struct pnfs_layout_segment *
1677 pnfs_update_layout(struct inode *ino,
1678                    struct nfs_open_context *ctx,
1679                    loff_t pos,
1680                    u64 count,
1681                    enum pnfs_iomode iomode,
1682                    bool strict_iomode,
1683                    gfp_t gfp_flags)
1684 {
1685         struct pnfs_layout_range arg = {
1686                 .iomode = iomode,
1687                 .offset = pos,
1688                 .length = count,
1689         };
1690         unsigned pg_offset, seq;
1691         struct nfs_server *server = NFS_SERVER(ino);
1692         struct nfs_client *clp = server->nfs_client;
1693         struct pnfs_layout_hdr *lo = NULL;
1694         struct pnfs_layout_segment *lseg = NULL;
1695         nfs4_stateid stateid;
1696         long timeout = 0;
1697         unsigned long giveup = jiffies + (clp->cl_lease_time << 1);
1698         bool first;
1699
1700         if (!pnfs_enabled_sb(NFS_SERVER(ino))) {
1701                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1702                                  PNFS_UPDATE_LAYOUT_NO_PNFS);
1703                 goto out;
1704         }
1705
1706         if (iomode == IOMODE_READ && i_size_read(ino) == 0) {
1707                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1708                                  PNFS_UPDATE_LAYOUT_RD_ZEROLEN);
1709                 goto out;
1710         }
1711
1712         if (pnfs_within_mdsthreshold(ctx, ino, iomode)) {
1713                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1714                                  PNFS_UPDATE_LAYOUT_MDSTHRESH);
1715                 goto out;
1716         }
1717
1718 lookup_again:
1719         nfs4_client_recover_expired_lease(clp);
1720         first = false;
1721         spin_lock(&ino->i_lock);
1722         lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags);
1723         if (lo == NULL) {
1724                 spin_unlock(&ino->i_lock);
1725                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1726                                  PNFS_UPDATE_LAYOUT_NOMEM);
1727                 goto out;
1728         }
1729
1730         /* Do we even need to bother with this? */
1731         if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) {
1732                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1733                                  PNFS_UPDATE_LAYOUT_BULK_RECALL);
1734                 dprintk("%s matches recall, use MDS\n", __func__);
1735                 goto out_unlock;
1736         }
1737
1738         /* if LAYOUTGET already failed once we don't try again */
1739         if (pnfs_layout_io_test_failed(lo, iomode)) {
1740                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1741                                  PNFS_UPDATE_LAYOUT_IO_TEST_FAIL);
1742                 goto out_unlock;
1743         }
1744
1745         lseg = pnfs_find_lseg(lo, &arg, strict_iomode);
1746         if (lseg) {
1747                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1748                                 PNFS_UPDATE_LAYOUT_FOUND_CACHED);
1749                 goto out_unlock;
1750         }
1751
1752         if (!nfs4_valid_open_stateid(ctx->state)) {
1753                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1754                                 PNFS_UPDATE_LAYOUT_INVALID_OPEN);
1755                 goto out_unlock;
1756         }
1757
1758         /*
1759          * Choose a stateid for the LAYOUTGET. If we don't have a layout
1760          * stateid, or it has been invalidated, then we must use the open
1761          * stateid.
1762          */
1763         if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags)) {
1764
1765                 /*
1766                  * The first layoutget for the file. Need to serialize per
1767                  * RFC 5661 Errata 3208.
1768                  */
1769                 if (test_and_set_bit(NFS_LAYOUT_FIRST_LAYOUTGET,
1770                                      &lo->plh_flags)) {
1771                         spin_unlock(&ino->i_lock);
1772                         wait_on_bit(&lo->plh_flags, NFS_LAYOUT_FIRST_LAYOUTGET,
1773                                     TASK_UNINTERRUPTIBLE);
1774                         pnfs_put_layout_hdr(lo);
1775                         dprintk("%s retrying\n", __func__);
1776                         goto lookup_again;
1777                 }
1778
1779                 first = true;
1780                 do {
1781                         seq = read_seqbegin(&ctx->state->seqlock);
1782                         nfs4_stateid_copy(&stateid, &ctx->state->stateid);
1783                 } while (read_seqretry(&ctx->state->seqlock, seq));
1784         } else {
1785                 nfs4_stateid_copy(&stateid, &lo->plh_stateid);
1786         }
1787
1788         /*
1789          * Because we free lsegs before sending LAYOUTRETURN, we need to wait
1790          * for LAYOUTRETURN even if first is true.
1791          */
1792         if (test_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) {
1793                 spin_unlock(&ino->i_lock);
1794                 dprintk("%s wait for layoutreturn\n", __func__);
1795                 if (pnfs_prepare_to_retry_layoutget(lo)) {
1796                         if (first)
1797                                 pnfs_clear_first_layoutget(lo);
1798                         pnfs_put_layout_hdr(lo);
1799                         dprintk("%s retrying\n", __func__);
1800                         trace_pnfs_update_layout(ino, pos, count, iomode, lo,
1801                                         lseg, PNFS_UPDATE_LAYOUT_RETRY);
1802                         goto lookup_again;
1803                 }
1804                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1805                                 PNFS_UPDATE_LAYOUT_RETURN);
1806                 goto out_put_layout_hdr;
1807         }
1808
1809         if (pnfs_layoutgets_blocked(lo)) {
1810                 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1811                                 PNFS_UPDATE_LAYOUT_BLOCKED);
1812                 goto out_unlock;
1813         }
1814         atomic_inc(&lo->plh_outstanding);
1815         spin_unlock(&ino->i_lock);
1816
1817         if (list_empty(&lo->plh_layouts)) {
1818                 /* The lo must be on the clp list if there is any
1819                  * chance of a CB_LAYOUTRECALL(FILE) coming in.
1820                  */
1821                 spin_lock(&clp->cl_lock);
1822                 if (list_empty(&lo->plh_layouts))
1823                         list_add_tail(&lo->plh_layouts, &server->layouts);
1824                 spin_unlock(&clp->cl_lock);
1825         }
1826
1827         pg_offset = arg.offset & ~PAGE_MASK;
1828         if (pg_offset) {
1829                 arg.offset -= pg_offset;
1830                 arg.length += pg_offset;
1831         }
1832         if (arg.length != NFS4_MAX_UINT64)
1833                 arg.length = PAGE_ALIGN(arg.length);
1834
1835         lseg = send_layoutget(lo, ctx, &stateid, &arg, &timeout, gfp_flags);
1836         trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1837                                  PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
1838         atomic_dec(&lo->plh_outstanding);
1839         if (IS_ERR(lseg)) {
1840                 switch(PTR_ERR(lseg)) {
1841                 case -EBUSY:
1842                         if (time_after(jiffies, giveup))
1843                                 lseg = NULL;
1844                         break;
1845                 case -ERECALLCONFLICT:
1846                         /* Huh? We hold no layouts, how is there a recall? */
1847                         if (first) {
1848                                 lseg = NULL;
1849                                 break;
1850                         }
1851                         /* Destroy the existing layout and start over */
1852                         if (time_after(jiffies, giveup))
1853                                 pnfs_destroy_layout(NFS_I(ino));
1854                         /* Fallthrough */
1855                 case -EAGAIN:
1856                         break;
1857                 default:
1858                         if (!nfs_error_is_fatal(PTR_ERR(lseg))) {
1859                                 pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode));
1860                                 lseg = NULL;
1861                         }
1862                         goto out_put_layout_hdr;
1863                 }
1864                 if (lseg) {
1865                         if (first)
1866                                 pnfs_clear_first_layoutget(lo);
1867                         trace_pnfs_update_layout(ino, pos, count,
1868                                 iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY);
1869                         pnfs_put_layout_hdr(lo);
1870                         goto lookup_again;
1871                 }
1872         } else {
1873                 pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode));
1874         }
1875
1876 out_put_layout_hdr:
1877         if (first)
1878                 pnfs_clear_first_layoutget(lo);
1879         pnfs_put_layout_hdr(lo);
1880 out:
1881         dprintk("%s: inode %s/%llu pNFS layout segment %s for "
1882                         "(%s, offset: %llu, length: %llu)\n",
1883                         __func__, ino->i_sb->s_id,
1884                         (unsigned long long)NFS_FILEID(ino),
1885                         IS_ERR_OR_NULL(lseg) ? "not found" : "found",
1886                         iomode==IOMODE_RW ?  "read/write" : "read-only",
1887                         (unsigned long long)pos,
1888                         (unsigned long long)count);
1889         return lseg;
1890 out_unlock:
1891         spin_unlock(&ino->i_lock);
1892         goto out_put_layout_hdr;
1893 }
1894 EXPORT_SYMBOL_GPL(pnfs_update_layout);
1895
1896 static bool
1897 pnfs_sanity_check_layout_range(struct pnfs_layout_range *range)
1898 {
1899         switch (range->iomode) {
1900         case IOMODE_READ:
1901         case IOMODE_RW:
1902                 break;
1903         default:
1904                 return false;
1905         }
1906         if (range->offset == NFS4_MAX_UINT64)
1907                 return false;
1908         if (range->length == 0)
1909                 return false;
1910         if (range->length != NFS4_MAX_UINT64 &&
1911             range->length > NFS4_MAX_UINT64 - range->offset)
1912                 return false;
1913         return true;
1914 }
1915
1916 struct pnfs_layout_segment *
1917 pnfs_layout_process(struct nfs4_layoutget *lgp)
1918 {
1919         struct pnfs_layout_hdr *lo = NFS_I(lgp->args.inode)->layout;
1920         struct nfs4_layoutget_res *res = &lgp->res;
1921         struct pnfs_layout_segment *lseg;
1922         struct inode *ino = lo->plh_inode;
1923         LIST_HEAD(free_me);
1924
1925         if (!pnfs_sanity_check_layout_range(&res->range))
1926                 return ERR_PTR(-EINVAL);
1927
1928         /* Inject layout blob into I/O device driver */
1929         lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res, lgp->gfp_flags);
1930         if (IS_ERR_OR_NULL(lseg)) {
1931                 if (!lseg)
1932                         lseg = ERR_PTR(-ENOMEM);
1933
1934                 dprintk("%s: Could not allocate layout: error %ld\n",
1935                        __func__, PTR_ERR(lseg));
1936                 return lseg;
1937         }
1938
1939         pnfs_init_lseg(lo, lseg, &res->range, &res->stateid);
1940
1941         spin_lock(&ino->i_lock);
1942         if (pnfs_layoutgets_blocked(lo)) {
1943                 dprintk("%s forget reply due to state\n", __func__);
1944                 goto out_forget;
1945         }
1946
1947         if (!pnfs_layout_is_valid(lo)) {
1948                 /* We have a completely new layout */
1949                 pnfs_set_layout_stateid(lo, &res->stateid, true);
1950         } else if (nfs4_stateid_match_other(&lo->plh_stateid, &res->stateid)) {
1951                 /* existing state ID, make sure the sequence number matches. */
1952                 if (pnfs_layout_stateid_blocked(lo, &res->stateid)) {
1953                         dprintk("%s forget reply due to sequence\n", __func__);
1954                         goto out_forget;
1955                 }
1956                 pnfs_set_layout_stateid(lo, &res->stateid, false);
1957         } else {
1958                 /*
1959                  * We got an entirely new state ID.  Mark all segments for the
1960                  * inode invalid, and retry the layoutget
1961                  */
1962                 pnfs_mark_layout_stateid_invalid(lo, &free_me);
1963                 goto out_forget;
1964         }
1965
1966         pnfs_get_lseg(lseg);
1967         pnfs_layout_insert_lseg(lo, lseg, &free_me);
1968
1969
1970         if (res->return_on_close)
1971                 set_bit(NFS_LSEG_ROC, &lseg->pls_flags);
1972
1973         spin_unlock(&ino->i_lock);
1974         pnfs_free_lseg_list(&free_me);
1975         return lseg;
1976
1977 out_forget:
1978         spin_unlock(&ino->i_lock);
1979         lseg->pls_layout = lo;
1980         NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg);
1981         return ERR_PTR(-EAGAIN);
1982 }
1983
1984 /**
1985  * pnfs_mark_matching_lsegs_return - Free or return matching layout segments
1986  * @lo: pointer to layout header
1987  * @tmp_list: list header to be used with pnfs_free_lseg_list()
1988  * @return_range: describe layout segment ranges to be returned
1989  *
1990  * This function is mainly intended for use by layoutrecall. It attempts
1991  * to free the layout segment immediately, or else to mark it for return
1992  * as soon as its reference count drops to zero.
1993  */
1994 int
1995 pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
1996                                 struct list_head *tmp_list,
1997                                 const struct pnfs_layout_range *return_range,
1998                                 u32 seq)
1999 {
2000         struct pnfs_layout_segment *lseg, *next;
2001         int remaining = 0;
2002
2003         dprintk("%s:Begin lo %p\n", __func__, lo);
2004
2005         if (list_empty(&lo->plh_segs))
2006                 return 0;
2007
2008         assert_spin_locked(&lo->plh_inode->i_lock);
2009
2010         list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
2011                 if (pnfs_match_lseg_recall(lseg, return_range, seq)) {
2012                         dprintk("%s: marking lseg %p iomode %d "
2013                                 "offset %llu length %llu\n", __func__,
2014                                 lseg, lseg->pls_range.iomode,
2015                                 lseg->pls_range.offset,
2016                                 lseg->pls_range.length);
2017                         if (mark_lseg_invalid(lseg, tmp_list))
2018                                 continue;
2019                         remaining++;
2020                         set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
2021                 }
2022
2023         if (remaining)
2024                 pnfs_set_plh_return_info(lo, return_range->iomode, seq);
2025
2026         return remaining;
2027 }
2028
2029 void pnfs_error_mark_layout_for_return(struct inode *inode,
2030                                        struct pnfs_layout_segment *lseg)
2031 {
2032         struct pnfs_layout_hdr *lo = NFS_I(inode)->layout;
2033         struct pnfs_layout_range range = {
2034                 .iomode = lseg->pls_range.iomode,
2035                 .offset = 0,
2036                 .length = NFS4_MAX_UINT64,
2037         };
2038         bool return_now = false;
2039
2040         spin_lock(&inode->i_lock);
2041         pnfs_set_plh_return_info(lo, range.iomode, 0);
2042         /* Block LAYOUTGET */
2043         set_bit(NFS_LAYOUT_RETURN, &lo->plh_flags);
2044         /*
2045          * mark all matching lsegs so that we are sure to have no live
2046          * segments at hand when sending layoutreturn. See pnfs_put_lseg()
2047          * for how it works.
2048          */
2049         if (!pnfs_mark_matching_lsegs_return(lo, &lo->plh_return_segs, &range, 0)) {
2050                 nfs4_stateid stateid;
2051                 enum pnfs_iomode iomode;
2052
2053                 return_now = pnfs_prepare_layoutreturn(lo, &stateid, &iomode);
2054                 spin_unlock(&inode->i_lock);
2055                 if (return_now)
2056                         pnfs_send_layoutreturn(lo, &stateid, iomode, false);
2057         } else {
2058                 spin_unlock(&inode->i_lock);
2059                 nfs_commit_inode(inode, 0);
2060         }
2061 }
2062 EXPORT_SYMBOL_GPL(pnfs_error_mark_layout_for_return);
2063
2064 void
2065 pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
2066 {
2067         u64 rd_size = req->wb_bytes;
2068
2069         if (pgio->pg_lseg == NULL) {
2070                 if (pgio->pg_dreq == NULL)
2071                         rd_size = i_size_read(pgio->pg_inode) - req_offset(req);
2072                 else
2073                         rd_size = nfs_dreq_bytes_left(pgio->pg_dreq);
2074
2075                 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
2076                                                    req->wb_context,
2077                                                    req_offset(req),
2078                                                    rd_size,
2079                                                    IOMODE_READ,
2080                                                    false,
2081                                                    GFP_KERNEL);
2082                 if (IS_ERR(pgio->pg_lseg)) {
2083                         pgio->pg_error = PTR_ERR(pgio->pg_lseg);
2084                         pgio->pg_lseg = NULL;
2085                         return;
2086                 }
2087         }
2088         /* If no lseg, fall back to read through mds */
2089         if (pgio->pg_lseg == NULL)
2090                 nfs_pageio_reset_read_mds(pgio);
2091
2092 }
2093 EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_read);
2094
2095 void
2096 pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
2097                            struct nfs_page *req, u64 wb_size)
2098 {
2099         if (pgio->pg_lseg == NULL) {
2100                 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
2101                                                    req->wb_context,
2102                                                    req_offset(req),
2103                                                    wb_size,
2104                                                    IOMODE_RW,
2105                                                    false,
2106                                                    GFP_NOFS);
2107                 if (IS_ERR(pgio->pg_lseg)) {
2108                         pgio->pg_error = PTR_ERR(pgio->pg_lseg);
2109                         pgio->pg_lseg = NULL;
2110                         return;
2111                 }
2112         }
2113         /* If no lseg, fall back to write through mds */
2114         if (pgio->pg_lseg == NULL)
2115                 nfs_pageio_reset_write_mds(pgio);
2116 }
2117 EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write);
2118
2119 void
2120 pnfs_generic_pg_cleanup(struct nfs_pageio_descriptor *desc)
2121 {
2122         if (desc->pg_lseg) {
2123                 pnfs_put_lseg(desc->pg_lseg);
2124                 desc->pg_lseg = NULL;
2125         }
2126 }
2127 EXPORT_SYMBOL_GPL(pnfs_generic_pg_cleanup);
2128
2129 /*
2130  * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number
2131  * of bytes (maximum @req->wb_bytes) that can be coalesced.
2132  */
2133 size_t
2134 pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio,
2135                      struct nfs_page *prev, struct nfs_page *req)
2136 {
2137         unsigned int size;
2138         u64 seg_end, req_start, seg_left;
2139
2140         size = nfs_generic_pg_test(pgio, prev, req);
2141         if (!size)
2142                 return 0;
2143
2144         /*
2145          * 'size' contains the number of bytes left in the current page (up
2146          * to the original size asked for in @req->wb_bytes).
2147          *
2148          * Calculate how many bytes are left in the layout segment
2149          * and if there are less bytes than 'size', return that instead.
2150          *
2151          * Please also note that 'end_offset' is actually the offset of the
2152          * first byte that lies outside the pnfs_layout_range. FIXME?
2153          *
2154          */
2155         if (pgio->pg_lseg) {
2156                 seg_end = pnfs_end_offset(pgio->pg_lseg->pls_range.offset,
2157                                      pgio->pg_lseg->pls_range.length);
2158                 req_start = req_offset(req);
2159                 WARN_ON_ONCE(req_start >= seg_end);
2160                 /* start of request is past the last byte of this segment */
2161                 if (req_start >= seg_end) {
2162                         /* reference the new lseg */
2163                         if (pgio->pg_ops->pg_cleanup)
2164                                 pgio->pg_ops->pg_cleanup(pgio);
2165                         if (pgio->pg_ops->pg_init)
2166                                 pgio->pg_ops->pg_init(pgio, req);
2167                         return 0;
2168                 }
2169
2170                 /* adjust 'size' iff there are fewer bytes left in the
2171                  * segment than what nfs_generic_pg_test returned */
2172                 seg_left = seg_end - req_start;
2173                 if (seg_left < size)
2174                         size = (unsigned int)seg_left;
2175         }
2176
2177         return size;
2178 }
2179 EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);
2180
2181 int pnfs_write_done_resend_to_mds(struct nfs_pgio_header *hdr)
2182 {
2183         struct nfs_pageio_descriptor pgio;
2184
2185         /* Resend all requests through the MDS */
2186         nfs_pageio_init_write(&pgio, hdr->inode, FLUSH_STABLE, true,
2187                               hdr->completion_ops);
2188         set_bit(NFS_CONTEXT_RESEND_WRITES, &hdr->args.context->flags);
2189         return nfs_pageio_resend(&pgio, hdr);
2190 }
2191 EXPORT_SYMBOL_GPL(pnfs_write_done_resend_to_mds);
2192
2193 static void pnfs_ld_handle_write_error(struct nfs_pgio_header *hdr)
2194 {
2195
2196         dprintk("pnfs write error = %d\n", hdr->pnfs_error);
2197         if (NFS_SERVER(hdr->inode)->pnfs_curr_ld->flags &
2198             PNFS_LAYOUTRET_ON_ERROR) {
2199                 pnfs_return_layout(hdr->inode);
2200         }
2201         if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags))
2202                 hdr->task.tk_status = pnfs_write_done_resend_to_mds(hdr);
2203 }
2204
2205 /*
2206  * Called by non rpc-based layout drivers
2207  */
2208 void pnfs_ld_write_done(struct nfs_pgio_header *hdr)
2209 {
2210         if (likely(!hdr->pnfs_error)) {
2211                 pnfs_set_layoutcommit(hdr->inode, hdr->lseg,
2212                                 hdr->mds_offset + hdr->res.count);
2213                 hdr->mds_ops->rpc_call_done(&hdr->task, hdr);
2214         }
2215         trace_nfs4_pnfs_write(hdr, hdr->pnfs_error);
2216         if (unlikely(hdr->pnfs_error))
2217                 pnfs_ld_handle_write_error(hdr);
2218         hdr->mds_ops->rpc_release(hdr);
2219 }
2220 EXPORT_SYMBOL_GPL(pnfs_ld_write_done);
2221
2222 static void
2223 pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
2224                 struct nfs_pgio_header *hdr)
2225 {
2226         struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
2227
2228         if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) {
2229                 list_splice_tail_init(&hdr->pages, &mirror->pg_list);
2230                 nfs_pageio_reset_write_mds(desc);
2231                 mirror->pg_recoalesce = 1;
2232         }
2233         nfs_pgio_data_destroy(hdr);
2234         hdr->release(hdr);
2235 }
2236
2237 static enum pnfs_try_status
2238 pnfs_try_to_write_data(struct nfs_pgio_header *hdr,
2239                         const struct rpc_call_ops *call_ops,
2240                         struct pnfs_layout_segment *lseg,
2241                         int how)
2242 {
2243         struct inode *inode = hdr->inode;
2244         enum pnfs_try_status trypnfs;
2245         struct nfs_server *nfss = NFS_SERVER(inode);
2246
2247         hdr->mds_ops = call_ops;
2248
2249         dprintk("%s: Writing ino:%lu %u@%llu (how %d)\n", __func__,
2250                 inode->i_ino, hdr->args.count, hdr->args.offset, how);
2251         trypnfs = nfss->pnfs_curr_ld->write_pagelist(hdr, how);
2252         if (trypnfs != PNFS_NOT_ATTEMPTED)
2253                 nfs_inc_stats(inode, NFSIOS_PNFS_WRITE);
2254         dprintk("%s End (trypnfs:%d)\n", __func__, trypnfs);
2255         return trypnfs;
2256 }
2257
2258 static void
2259 pnfs_do_write(struct nfs_pageio_descriptor *desc,
2260               struct nfs_pgio_header *hdr, int how)
2261 {
2262         const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
2263         struct pnfs_layout_segment *lseg = desc->pg_lseg;
2264         enum pnfs_try_status trypnfs;
2265
2266         trypnfs = pnfs_try_to_write_data(hdr, call_ops, lseg, how);
2267         if (trypnfs == PNFS_NOT_ATTEMPTED)
2268                 pnfs_write_through_mds(desc, hdr);
2269 }
2270
2271 static void pnfs_writehdr_free(struct nfs_pgio_header *hdr)
2272 {
2273         pnfs_put_lseg(hdr->lseg);
2274         nfs_pgio_header_free(hdr);
2275 }
2276
2277 int
2278 pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
2279 {
2280         struct nfs_pgio_header *hdr;
2281         int ret;
2282
2283         hdr = nfs_pgio_header_alloc(desc->pg_rw_ops);
2284         if (!hdr) {
2285                 desc->pg_error = -ENOMEM;
2286                 return desc->pg_error;
2287         }
2288         nfs_pgheader_init(desc, hdr, pnfs_writehdr_free);
2289
2290         hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
2291         ret = nfs_generic_pgio(desc, hdr);
2292         if (!ret)
2293                 pnfs_do_write(desc, hdr, desc->pg_ioflags);
2294
2295         return ret;
2296 }
2297 EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages);
2298
2299 int pnfs_read_done_resend_to_mds(struct nfs_pgio_header *hdr)
2300 {
2301         struct nfs_pageio_descriptor pgio;
2302
2303         /* Resend all requests through the MDS */
2304         nfs_pageio_init_read(&pgio, hdr->inode, true, hdr->completion_ops);
2305         return nfs_pageio_resend(&pgio, hdr);
2306 }
2307 EXPORT_SYMBOL_GPL(pnfs_read_done_resend_to_mds);
2308
2309 static void pnfs_ld_handle_read_error(struct nfs_pgio_header *hdr)
2310 {
2311         dprintk("pnfs read error = %d\n", hdr->pnfs_error);
2312         if (NFS_SERVER(hdr->inode)->pnfs_curr_ld->flags &
2313             PNFS_LAYOUTRET_ON_ERROR) {
2314                 pnfs_return_layout(hdr->inode);
2315         }
2316         if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags))
2317                 hdr->task.tk_status = pnfs_read_done_resend_to_mds(hdr);
2318 }
2319
2320 /*
2321  * Called by non rpc-based layout drivers
2322  */
2323 void pnfs_ld_read_done(struct nfs_pgio_header *hdr)
2324 {
2325         if (likely(!hdr->pnfs_error))
2326                 hdr->mds_ops->rpc_call_done(&hdr->task, hdr);
2327         trace_nfs4_pnfs_read(hdr, hdr->pnfs_error);
2328         if (unlikely(hdr->pnfs_error))
2329                 pnfs_ld_handle_read_error(hdr);
2330         hdr->mds_ops->rpc_release(hdr);
2331 }
2332 EXPORT_SYMBOL_GPL(pnfs_ld_read_done);
2333
2334 static void
2335 pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
2336                 struct nfs_pgio_header *hdr)
2337 {
2338         struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
2339
2340         if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) {
2341                 list_splice_tail_init(&hdr->pages, &mirror->pg_list);
2342                 nfs_pageio_reset_read_mds(desc);
2343                 mirror->pg_recoalesce = 1;
2344         }
2345         nfs_pgio_data_destroy(hdr);
2346         hdr->release(hdr);
2347 }
2348
2349 /*
2350  * Call the appropriate parallel I/O subsystem read function.
2351  */
2352 static enum pnfs_try_status
2353 pnfs_try_to_read_data(struct nfs_pgio_header *hdr,
2354                        const struct rpc_call_ops *call_ops,
2355                        struct pnfs_layout_segment *lseg)
2356 {
2357         struct inode *inode = hdr->inode;
2358         struct nfs_server *nfss = NFS_SERVER(inode);
2359         enum pnfs_try_status trypnfs;
2360
2361         hdr->mds_ops = call_ops;
2362
2363         dprintk("%s: Reading ino:%lu %u@%llu\n",
2364                 __func__, inode->i_ino, hdr->args.count, hdr->args.offset);
2365
2366         trypnfs = nfss->pnfs_curr_ld->read_pagelist(hdr);
2367         if (trypnfs != PNFS_NOT_ATTEMPTED)
2368                 nfs_inc_stats(inode, NFSIOS_PNFS_READ);
2369         dprintk("%s End (trypnfs:%d)\n", __func__, trypnfs);
2370         return trypnfs;
2371 }
2372
2373 /* Resend all requests through pnfs. */
2374 void pnfs_read_resend_pnfs(struct nfs_pgio_header *hdr)
2375 {
2376         struct nfs_pageio_descriptor pgio;
2377
2378         if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags)) {
2379                 /* Prevent deadlocks with layoutreturn! */
2380                 pnfs_put_lseg(hdr->lseg);
2381                 hdr->lseg = NULL;
2382
2383                 nfs_pageio_init_read(&pgio, hdr->inode, false,
2384                                         hdr->completion_ops);
2385                 hdr->task.tk_status = nfs_pageio_resend(&pgio, hdr);
2386         }
2387 }
2388 EXPORT_SYMBOL_GPL(pnfs_read_resend_pnfs);
2389
2390 static void
2391 pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr)
2392 {
2393         const struct rpc_call_ops *call_ops = desc->pg_rpc_callops;
2394         struct pnfs_layout_segment *lseg = desc->pg_lseg;
2395         enum pnfs_try_status trypnfs;
2396
2397         trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg);
2398         if (trypnfs == PNFS_TRY_AGAIN)
2399                 pnfs_read_resend_pnfs(hdr);
2400         if (trypnfs == PNFS_NOT_ATTEMPTED || hdr->task.tk_status)
2401                 pnfs_read_through_mds(desc, hdr);
2402 }
2403
2404 static void pnfs_readhdr_free(struct nfs_pgio_header *hdr)
2405 {
2406         pnfs_put_lseg(hdr->lseg);
2407         nfs_pgio_header_free(hdr);
2408 }
2409
2410 int
2411 pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
2412 {
2413         struct nfs_pgio_header *hdr;
2414         int ret;
2415
2416         hdr = nfs_pgio_header_alloc(desc->pg_rw_ops);
2417         if (!hdr) {
2418                 desc->pg_error = -ENOMEM;
2419                 return desc->pg_error;
2420         }
2421         nfs_pgheader_init(desc, hdr, pnfs_readhdr_free);
2422         hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
2423         ret = nfs_generic_pgio(desc, hdr);
2424         if (!ret)
2425                 pnfs_do_read(desc, hdr);
2426         return ret;
2427 }
2428 EXPORT_SYMBOL_GPL(pnfs_generic_pg_readpages);
2429
2430 static void pnfs_clear_layoutcommitting(struct inode *inode)
2431 {
2432         unsigned long *bitlock = &NFS_I(inode)->flags;
2433
2434         clear_bit_unlock(NFS_INO_LAYOUTCOMMITTING, bitlock);
2435         smp_mb__after_atomic();
2436         wake_up_bit(bitlock, NFS_INO_LAYOUTCOMMITTING);
2437 }
2438
2439 /*
2440  * There can be multiple RW segments.
2441  */
2442 static void pnfs_list_write_lseg(struct inode *inode, struct list_head *listp)
2443 {
2444         struct pnfs_layout_segment *lseg;
2445
2446         list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) {
2447                 if (lseg->pls_range.iomode == IOMODE_RW &&
2448                     test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
2449                         list_add(&lseg->pls_lc_list, listp);
2450         }
2451 }
2452
2453 static void pnfs_list_write_lseg_done(struct inode *inode, struct list_head *listp)
2454 {
2455         struct pnfs_layout_segment *lseg, *tmp;
2456
2457         /* Matched by references in pnfs_set_layoutcommit */
2458         list_for_each_entry_safe(lseg, tmp, listp, pls_lc_list) {
2459                 list_del_init(&lseg->pls_lc_list);
2460                 pnfs_put_lseg(lseg);
2461         }
2462
2463         pnfs_clear_layoutcommitting(inode);
2464 }
2465
2466 void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg)
2467 {
2468         pnfs_layout_io_set_failed(lseg->pls_layout, lseg->pls_range.iomode);
2469 }
2470 EXPORT_SYMBOL_GPL(pnfs_set_lo_fail);
2471
2472 void
2473 pnfs_set_layoutcommit(struct inode *inode, struct pnfs_layout_segment *lseg,
2474                 loff_t end_pos)
2475 {
2476         struct nfs_inode *nfsi = NFS_I(inode);
2477         bool mark_as_dirty = false;
2478
2479         spin_lock(&inode->i_lock);
2480         if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) {
2481                 nfsi->layout->plh_lwb = end_pos;
2482                 mark_as_dirty = true;
2483                 dprintk("%s: Set layoutcommit for inode %lu ",
2484                         __func__, inode->i_ino);
2485         } else if (end_pos > nfsi->layout->plh_lwb)
2486                 nfsi->layout->plh_lwb = end_pos;
2487         if (!test_and_set_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) {
2488                 /* references matched in nfs4_layoutcommit_release */
2489                 pnfs_get_lseg(lseg);
2490         }
2491         spin_unlock(&inode->i_lock);
2492         dprintk("%s: lseg %p end_pos %llu\n",
2493                 __func__, lseg, nfsi->layout->plh_lwb);
2494
2495         /* if pnfs_layoutcommit_inode() runs between inode locks, the next one
2496          * will be a noop because NFS_INO_LAYOUTCOMMIT will not be set */
2497         if (mark_as_dirty)
2498                 mark_inode_dirty_sync(inode);
2499 }
2500 EXPORT_SYMBOL_GPL(pnfs_set_layoutcommit);
2501
2502 void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data)
2503 {
2504         struct nfs_server *nfss = NFS_SERVER(data->args.inode);
2505
2506         if (nfss->pnfs_curr_ld->cleanup_layoutcommit)
2507                 nfss->pnfs_curr_ld->cleanup_layoutcommit(data);
2508         pnfs_list_write_lseg_done(data->args.inode, &data->lseg_list);
2509 }
2510
2511 /*
2512  * For the LAYOUT4_NFSV4_1_FILES layout type, NFS_DATA_SYNC WRITEs and
2513  * NFS_UNSTABLE WRITEs with a COMMIT to data servers must store enough
2514  * data to disk to allow the server to recover the data if it crashes.
2515  * LAYOUTCOMMIT is only needed when the NFL4_UFLG_COMMIT_THRU_MDS flag
2516  * is off, and a COMMIT is sent to a data server, or
2517  * if WRITEs to a data server return NFS_DATA_SYNC.
2518  */
2519 int
2520 pnfs_layoutcommit_inode(struct inode *inode, bool sync)
2521 {
2522         struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
2523         struct nfs4_layoutcommit_data *data;
2524         struct nfs_inode *nfsi = NFS_I(inode);
2525         loff_t end_pos;
2526         int status;
2527
2528         if (!pnfs_layoutcommit_outstanding(inode))
2529                 return 0;
2530
2531         dprintk("--> %s inode %lu\n", __func__, inode->i_ino);
2532
2533         status = -EAGAIN;
2534         if (test_and_set_bit(NFS_INO_LAYOUTCOMMITTING, &nfsi->flags)) {
2535                 if (!sync)
2536                         goto out;
2537                 status = wait_on_bit_lock_action(&nfsi->flags,
2538                                 NFS_INO_LAYOUTCOMMITTING,
2539                                 nfs_wait_bit_killable,
2540                                 TASK_KILLABLE);
2541                 if (status)
2542                         goto out;
2543         }
2544
2545         status = -ENOMEM;
2546         /* Note kzalloc ensures data->res.seq_res.sr_slot == NULL */
2547         data = kzalloc(sizeof(*data), GFP_NOFS);
2548         if (!data)
2549                 goto clear_layoutcommitting;
2550
2551         status = 0;
2552         spin_lock(&inode->i_lock);
2553         if (!test_and_clear_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags))
2554                 goto out_unlock;
2555
2556         INIT_LIST_HEAD(&data->lseg_list);
2557         pnfs_list_write_lseg(inode, &data->lseg_list);
2558
2559         end_pos = nfsi->layout->plh_lwb;
2560
2561         nfs4_stateid_copy(&data->args.stateid, &nfsi->layout->plh_stateid);
2562         spin_unlock(&inode->i_lock);
2563
2564         data->args.inode = inode;
2565         data->cred = get_rpccred(nfsi->layout->plh_lc_cred);
2566         nfs_fattr_init(&data->fattr);
2567         data->args.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask;
2568         data->res.fattr = &data->fattr;
2569         if (end_pos != 0)
2570                 data->args.lastbytewritten = end_pos - 1;
2571         else
2572                 data->args.lastbytewritten = U64_MAX;
2573         data->res.server = NFS_SERVER(inode);
2574
2575         if (ld->prepare_layoutcommit) {
2576                 status = ld->prepare_layoutcommit(&data->args);
2577                 if (status) {
2578                         put_rpccred(data->cred);
2579                         spin_lock(&inode->i_lock);
2580                         set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags);
2581                         if (end_pos > nfsi->layout->plh_lwb)
2582                                 nfsi->layout->plh_lwb = end_pos;
2583                         goto out_unlock;
2584                 }
2585         }
2586
2587
2588         status = nfs4_proc_layoutcommit(data, sync);
2589 out:
2590         if (status)
2591                 mark_inode_dirty_sync(inode);
2592         dprintk("<-- %s status %d\n", __func__, status);
2593         return status;
2594 out_unlock:
2595         spin_unlock(&inode->i_lock);
2596         kfree(data);
2597 clear_layoutcommitting:
2598         pnfs_clear_layoutcommitting(inode);
2599         goto out;
2600 }
2601 EXPORT_SYMBOL_GPL(pnfs_layoutcommit_inode);
2602
2603 int
2604 pnfs_generic_sync(struct inode *inode, bool datasync)
2605 {
2606         return pnfs_layoutcommit_inode(inode, true);
2607 }
2608 EXPORT_SYMBOL_GPL(pnfs_generic_sync);
2609
2610 struct nfs4_threshold *pnfs_mdsthreshold_alloc(void)
2611 {
2612         struct nfs4_threshold *thp;
2613
2614         thp = kzalloc(sizeof(*thp), GFP_NOFS);
2615         if (!thp) {
2616                 dprintk("%s mdsthreshold allocation failed\n", __func__);
2617                 return NULL;
2618         }
2619         return thp;
2620 }
2621
2622 #if IS_ENABLED(CONFIG_NFS_V4_2)
2623 int
2624 pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags)
2625 {
2626         struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
2627         struct nfs_server *server = NFS_SERVER(inode);
2628         struct nfs_inode *nfsi = NFS_I(inode);
2629         struct nfs42_layoutstat_data *data;
2630         struct pnfs_layout_hdr *hdr;
2631         int status = 0;
2632
2633         if (!pnfs_enabled_sb(server) || !ld->prepare_layoutstats)
2634                 goto out;
2635
2636         if (!nfs_server_capable(inode, NFS_CAP_LAYOUTSTATS))
2637                 goto out;
2638
2639         if (test_and_set_bit(NFS_INO_LAYOUTSTATS, &nfsi->flags))
2640                 goto out;
2641
2642         spin_lock(&inode->i_lock);
2643         if (!NFS_I(inode)->layout) {
2644                 spin_unlock(&inode->i_lock);
2645                 goto out_clear_layoutstats;
2646         }
2647         hdr = NFS_I(inode)->layout;
2648         pnfs_get_layout_hdr(hdr);
2649         spin_unlock(&inode->i_lock);
2650
2651         data = kzalloc(sizeof(*data), gfp_flags);
2652         if (!data) {
2653                 status = -ENOMEM;
2654                 goto out_put;
2655         }
2656
2657         data->args.fh = NFS_FH(inode);
2658         data->args.inode = inode;
2659         status = ld->prepare_layoutstats(&data->args);
2660         if (status)
2661                 goto out_free;
2662
2663         status = nfs42_proc_layoutstats_generic(NFS_SERVER(inode), data);
2664
2665 out:
2666         dprintk("%s returns %d\n", __func__, status);
2667         return status;
2668
2669 out_free:
2670         kfree(data);
2671 out_put:
2672         pnfs_put_layout_hdr(hdr);
2673 out_clear_layoutstats:
2674         smp_mb__before_atomic();
2675         clear_bit(NFS_INO_LAYOUTSTATS, &nfsi->flags);
2676         smp_mb__after_atomic();
2677         goto out;
2678 }
2679 EXPORT_SYMBOL_GPL(pnfs_report_layoutstat);
2680 #endif
2681
2682 unsigned int layoutstats_timer;
2683 module_param(layoutstats_timer, uint, 0644);
2684 EXPORT_SYMBOL_GPL(layoutstats_timer);