]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - fs/nfs/write.c
NFS: use req_offset where appropriate
[mirror_ubuntu-bionic-kernel.git] / fs / nfs / write.c
CommitLineData
1da177e4
LT
1/*
2 * linux/fs/nfs/write.c
3 *
7c85d900 4 * Write file data over NFS.
1da177e4
LT
5 *
6 * Copyright (C) 1996, 1997, Olaf Kirch <okir@monad.swb.de>
7 */
8
1da177e4
LT
9#include <linux/types.h>
10#include <linux/slab.h>
11#include <linux/mm.h>
12#include <linux/pagemap.h>
13#include <linux/file.h>
1da177e4 14#include <linux/writeback.h>
89a09141 15#include <linux/swap.h>
074cc1de 16#include <linux/migrate.h>
1da177e4
LT
17
18#include <linux/sunrpc/clnt.h>
19#include <linux/nfs_fs.h>
20#include <linux/nfs_mount.h>
21#include <linux/nfs_page.h>
3fcfab16 22#include <linux/backing-dev.h>
afeacc8c 23#include <linux/export.h>
3fcfab16 24
1da177e4 25#include <asm/uaccess.h>
1da177e4
LT
26
27#include "delegation.h"
49a70f27 28#include "internal.h"
91d5b470 29#include "iostat.h"
def6ed7e 30#include "nfs4_fs.h"
074cc1de 31#include "fscache.h"
94ad1c80 32#include "pnfs.h"
1da177e4
LT
33
34#define NFSDBG_FACILITY NFSDBG_PAGECACHE
35
36#define MIN_POOL_WRITE (32)
37#define MIN_POOL_COMMIT (4)
38
39/*
40 * Local function declarations
41 */
c63c7b05
TM
42static void nfs_pageio_init_write(struct nfs_pageio_descriptor *desc,
43 struct inode *inode, int ioflags);
f8512ad0 44static void nfs_redirty_request(struct nfs_page *req);
788e7a89
TM
45static const struct rpc_call_ops nfs_write_partial_ops;
46static const struct rpc_call_ops nfs_write_full_ops;
47static const struct rpc_call_ops nfs_commit_ops;
1da177e4 48
e18b890b 49static struct kmem_cache *nfs_wdata_cachep;
3feb2d49 50static mempool_t *nfs_wdata_mempool;
0b7c0153 51static struct kmem_cache *nfs_cdata_cachep;
1da177e4
LT
52static mempool_t *nfs_commit_mempool;
53
0b7c0153 54struct nfs_commit_data *nfs_commitdata_alloc(void)
1da177e4 55{
0b7c0153 56 struct nfs_commit_data *p = mempool_alloc(nfs_commit_mempool, GFP_NOFS);
40859d7e 57
1da177e4
LT
58 if (p) {
59 memset(p, 0, sizeof(*p));
60 INIT_LIST_HEAD(&p->pages);
61 }
62 return p;
63}
e0c2b380 64EXPORT_SYMBOL_GPL(nfs_commitdata_alloc);
1da177e4 65
0b7c0153 66void nfs_commit_free(struct nfs_commit_data *p)
1da177e4
LT
67{
68 mempool_free(p, nfs_commit_mempool);
69}
e0c2b380 70EXPORT_SYMBOL_GPL(nfs_commit_free);
1da177e4 71
8d5658c9 72struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
3feb2d49 73{
e6b4f8da 74 struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOFS);
3feb2d49
TM
75
76 if (p) {
77 memset(p, 0, sizeof(*p));
78 INIT_LIST_HEAD(&p->pages);
e9f7bee1 79 p->npages = pagecount;
0d0b5cb3
CL
80 if (pagecount <= ARRAY_SIZE(p->page_array))
81 p->pagevec = p->page_array;
3feb2d49 82 else {
0d0b5cb3
CL
83 p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
84 if (!p->pagevec) {
3feb2d49
TM
85 mempool_free(p, nfs_wdata_mempool);
86 p = NULL;
87 }
88 }
89 }
90 return p;
91}
92
1ae88b2e 93void nfs_writedata_free(struct nfs_write_data *p)
3feb2d49
TM
94{
95 if (p && (p->pagevec != &p->page_array[0]))
96 kfree(p->pagevec);
97 mempool_free(p, nfs_wdata_mempool);
98}
99
dce81290 100void nfs_writedata_release(struct nfs_write_data *wdata)
1da177e4 101{
383ba719 102 put_nfs_open_context(wdata->args.context);
1da177e4
LT
103 nfs_writedata_free(wdata);
104}
105
7b159fc1
TM
106static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
107{
108 ctx->error = error;
109 smp_wmb();
110 set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
111}
112
277459d2
TM
113static struct nfs_page *nfs_page_find_request_locked(struct page *page)
114{
115 struct nfs_page *req = NULL;
116
117 if (PagePrivate(page)) {
118 req = (struct nfs_page *)page_private(page);
119 if (req != NULL)
c03b4024 120 kref_get(&req->wb_kref);
277459d2
TM
121 }
122 return req;
123}
124
125static struct nfs_page *nfs_page_find_request(struct page *page)
126{
587142f8 127 struct inode *inode = page->mapping->host;
277459d2 128 struct nfs_page *req = NULL;
277459d2 129
587142f8 130 spin_lock(&inode->i_lock);
277459d2 131 req = nfs_page_find_request_locked(page);
587142f8 132 spin_unlock(&inode->i_lock);
277459d2
TM
133 return req;
134}
135
1da177e4
LT
136/* Adjust the file length if we're writing beyond the end */
137static void nfs_grow_file(struct page *page, unsigned int offset, unsigned int count)
138{
139 struct inode *inode = page->mapping->host;
a3d01454
TM
140 loff_t end, i_size;
141 pgoff_t end_index;
1da177e4 142
a3d01454
TM
143 spin_lock(&inode->i_lock);
144 i_size = i_size_read(inode);
145 end_index = (i_size - 1) >> PAGE_CACHE_SHIFT;
1da177e4 146 if (i_size > 0 && page->index < end_index)
a3d01454 147 goto out;
1da177e4
LT
148 end = ((loff_t)page->index << PAGE_CACHE_SHIFT) + ((loff_t)offset+count);
149 if (i_size >= end)
a3d01454 150 goto out;
1da177e4 151 i_size_write(inode, end);
a3d01454
TM
152 nfs_inc_stats(inode, NFSIOS_EXTENDWRITE);
153out:
154 spin_unlock(&inode->i_lock);
1da177e4
LT
155}
156
a301b777
TM
157/* A writeback failed: mark the page as bad, and invalidate the page cache */
158static void nfs_set_pageerror(struct page *page)
159{
160 SetPageError(page);
161 nfs_zap_mapping(page->mapping->host, page->mapping);
162}
163
1da177e4
LT
164/* We can set the PG_uptodate flag if we see that a write request
165 * covers the full page.
166 */
167static void nfs_mark_uptodate(struct page *page, unsigned int base, unsigned int count)
168{
1da177e4
LT
169 if (PageUptodate(page))
170 return;
171 if (base != 0)
172 return;
49a70f27 173 if (count != nfs_page_length(page))
1da177e4 174 return;
49a70f27 175 SetPageUptodate(page);
1da177e4
LT
176}
177
1da177e4
LT
178static int wb_priority(struct writeback_control *wbc)
179{
180 if (wbc->for_reclaim)
c63c7b05 181 return FLUSH_HIGHPRI | FLUSH_STABLE;
b17621fe 182 if (wbc->for_kupdate || wbc->for_background)
b31268ac
TM
183 return FLUSH_LOWPRI | FLUSH_COND_STABLE;
184 return FLUSH_COND_STABLE;
1da177e4
LT
185}
186
89a09141
PZ
187/*
188 * NFS congestion control
189 */
190
191int nfs_congestion_kb;
192
193#define NFS_CONGESTION_ON_THRESH (nfs_congestion_kb >> (PAGE_SHIFT-10))
194#define NFS_CONGESTION_OFF_THRESH \
195 (NFS_CONGESTION_ON_THRESH - (NFS_CONGESTION_ON_THRESH >> 2))
196
5a6d41b3 197static int nfs_set_page_writeback(struct page *page)
89a09141 198{
5a6d41b3
TM
199 int ret = test_set_page_writeback(page);
200
201 if (!ret) {
89a09141
PZ
202 struct inode *inode = page->mapping->host;
203 struct nfs_server *nfss = NFS_SERVER(inode);
204
a6305ddb 205 page_cache_get(page);
277866a0 206 if (atomic_long_inc_return(&nfss->writeback) >
8aa7e847
JA
207 NFS_CONGESTION_ON_THRESH) {
208 set_bdi_congested(&nfss->backing_dev_info,
209 BLK_RW_ASYNC);
210 }
89a09141 211 }
5a6d41b3 212 return ret;
89a09141
PZ
213}
214
215static void nfs_end_page_writeback(struct page *page)
216{
217 struct inode *inode = page->mapping->host;
218 struct nfs_server *nfss = NFS_SERVER(inode);
219
220 end_page_writeback(page);
a6305ddb 221 page_cache_release(page);
c4dc4bee 222 if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
8aa7e847 223 clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
89a09141
PZ
224}
225
cfb506e1 226static struct nfs_page *nfs_find_and_lock_request(struct page *page, bool nonblock)
e261f51f 227{
587142f8 228 struct inode *inode = page->mapping->host;
e261f51f 229 struct nfs_page *req;
e261f51f
TM
230 int ret;
231
587142f8 232 spin_lock(&inode->i_lock);
074cc1de 233 for (;;) {
e261f51f 234 req = nfs_page_find_request_locked(page);
074cc1de
TM
235 if (req == NULL)
236 break;
9994b62b 237 if (nfs_lock_request_dontget(req))
e261f51f
TM
238 break;
239 /* Note: If we hold the page lock, as is the case in nfs_writepage,
9994b62b 240 * then the call to nfs_lock_request_dontget() will always
e261f51f
TM
241 * succeed provided that someone hasn't already marked the
242 * request as dirty (in which case we don't care).
243 */
587142f8 244 spin_unlock(&inode->i_lock);
cfb506e1
TM
245 if (!nonblock)
246 ret = nfs_wait_on_request(req);
247 else
248 ret = -EAGAIN;
e261f51f
TM
249 nfs_release_request(req);
250 if (ret != 0)
074cc1de 251 return ERR_PTR(ret);
587142f8 252 spin_lock(&inode->i_lock);
e261f51f 253 }
587142f8 254 spin_unlock(&inode->i_lock);
074cc1de
TM
255 return req;
256}
257
258/*
259 * Find an associated nfs write request, and prepare to flush it out
260 * May return an error if the user signalled nfs_wait_on_request().
261 */
262static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
cfb506e1 263 struct page *page, bool nonblock)
074cc1de
TM
264{
265 struct nfs_page *req;
266 int ret = 0;
267
cfb506e1 268 req = nfs_find_and_lock_request(page, nonblock);
074cc1de
TM
269 if (!req)
270 goto out;
271 ret = PTR_ERR(req);
272 if (IS_ERR(req))
273 goto out;
274
275 ret = nfs_set_page_writeback(page);
276 BUG_ON(ret != 0);
277 BUG_ON(test_bit(PG_CLEAN, &req->wb_flags));
278
f8512ad0
FI
279 if (!nfs_pageio_add_request(pgio, req)) {
280 nfs_redirty_request(req);
074cc1de 281 ret = pgio->pg_error;
f8512ad0 282 }
074cc1de
TM
283out:
284 return ret;
e261f51f
TM
285}
286
f758c885 287static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, struct nfs_pageio_descriptor *pgio)
1da177e4 288{
1da177e4 289 struct inode *inode = page->mapping->host;
cfb506e1 290 int ret;
1da177e4 291
91d5b470
CL
292 nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE);
293 nfs_add_stats(inode, NFSIOS_WRITEPAGES, 1);
294
7fe7f848 295 nfs_pageio_cond_complete(pgio, page->index);
1b430bee 296 ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE);
cfb506e1
TM
297 if (ret == -EAGAIN) {
298 redirty_page_for_writepage(wbc, page);
299 ret = 0;
300 }
301 return ret;
f758c885 302}
7fe7f848 303
f758c885
TM
304/*
305 * Write an mmapped page to the server.
306 */
307static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc)
308{
309 struct nfs_pageio_descriptor pgio;
310 int err;
49a70f27 311
f758c885
TM
312 nfs_pageio_init_write(&pgio, page->mapping->host, wb_priority(wbc));
313 err = nfs_do_writepage(page, wbc, &pgio);
314 nfs_pageio_complete(&pgio);
315 if (err < 0)
316 return err;
317 if (pgio.pg_error < 0)
318 return pgio.pg_error;
319 return 0;
4d770ccf
TM
320}
321
322int nfs_writepage(struct page *page, struct writeback_control *wbc)
323{
f758c885 324 int ret;
4d770ccf 325
f758c885 326 ret = nfs_writepage_locked(page, wbc);
1da177e4 327 unlock_page(page);
f758c885
TM
328 return ret;
329}
330
331static int nfs_writepages_callback(struct page *page, struct writeback_control *wbc, void *data)
332{
333 int ret;
334
335 ret = nfs_do_writepage(page, wbc, data);
336 unlock_page(page);
337 return ret;
1da177e4
LT
338}
339
1da177e4
LT
340int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
341{
1da177e4 342 struct inode *inode = mapping->host;
72cb77f4 343 unsigned long *bitlock = &NFS_I(inode)->flags;
c63c7b05 344 struct nfs_pageio_descriptor pgio;
1da177e4
LT
345 int err;
346
72cb77f4
TM
347 /* Stop dirtying of new pages while we sync */
348 err = wait_on_bit_lock(bitlock, NFS_INO_FLUSHING,
349 nfs_wait_bit_killable, TASK_KILLABLE);
350 if (err)
351 goto out_err;
352
91d5b470
CL
353 nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGES);
354
c63c7b05 355 nfs_pageio_init_write(&pgio, inode, wb_priority(wbc));
f758c885 356 err = write_cache_pages(mapping, wbc, nfs_writepages_callback, &pgio);
c63c7b05 357 nfs_pageio_complete(&pgio);
72cb77f4
TM
358
359 clear_bit_unlock(NFS_INO_FLUSHING, bitlock);
360 smp_mb__after_clear_bit();
361 wake_up_bit(bitlock, NFS_INO_FLUSHING);
362
f758c885 363 if (err < 0)
72cb77f4
TM
364 goto out_err;
365 err = pgio.pg_error;
366 if (err < 0)
367 goto out_err;
c63c7b05 368 return 0;
72cb77f4
TM
369out_err:
370 return err;
1da177e4
LT
371}
372
373/*
374 * Insert a write request into an inode
375 */
d6d6dc7c 376static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
1da177e4
LT
377{
378 struct nfs_inode *nfsi = NFS_I(inode);
e7d39069
TM
379
380 /* Lock the request! */
381 nfs_lock_request_dontget(req);
382
383 spin_lock(&inode->i_lock);
4d65c520 384 if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE))
a9a4a87a 385 inode->i_version++;
2df485a7 386 set_bit(PG_MAPPED, &req->wb_flags);
deb7d638 387 SetPagePrivate(req->wb_page);
277459d2 388 set_page_private(req->wb_page, (unsigned long)req);
1da177e4 389 nfsi->npages++;
c03b4024 390 kref_get(&req->wb_kref);
e7d39069 391 spin_unlock(&inode->i_lock);
1da177e4
LT
392}
393
394/*
89a09141 395 * Remove a write request from an inode
1da177e4
LT
396 */
397static void nfs_inode_remove_request(struct nfs_page *req)
398{
3d4ff43d 399 struct inode *inode = req->wb_context->dentry->d_inode;
1da177e4
LT
400 struct nfs_inode *nfsi = NFS_I(inode);
401
402 BUG_ON (!NFS_WBACK_BUSY(req));
403
587142f8 404 spin_lock(&inode->i_lock);
277459d2 405 set_page_private(req->wb_page, 0);
deb7d638 406 ClearPagePrivate(req->wb_page);
2df485a7 407 clear_bit(PG_MAPPED, &req->wb_flags);
1da177e4 408 nfsi->npages--;
4d65c520 409 spin_unlock(&inode->i_lock);
1da177e4
LT
410 nfs_release_request(req);
411}
412
61822ab5 413static void
6d884e8f 414nfs_mark_request_dirty(struct nfs_page *req)
61822ab5 415{
61822ab5
TM
416 __set_page_dirty_nobuffers(req->wb_page);
417}
418
1da177e4 419#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
8dd37758
TM
420/**
421 * nfs_request_add_commit_list - add request to a commit list
422 * @req: pointer to a struct nfs_page
423 * @head: commit list head
424 *
425 * This sets the PG_CLEAN bit, updates the inode global count of
426 * number of outstanding requests requiring a commit as well as
427 * the MM page stats.
428 *
429 * The caller must _not_ hold the inode->i_lock, but must be
430 * holding the nfs_page lock.
1da177e4 431 */
8dd37758
TM
432void
433nfs_request_add_commit_list(struct nfs_page *req, struct list_head *head)
1da177e4 434{
3d4ff43d 435 struct inode *inode = req->wb_context->dentry->d_inode;
1da177e4 436
e468bae9 437 set_bit(PG_CLEAN, &(req)->wb_flags);
8dd37758
TM
438 spin_lock(&inode->i_lock);
439 nfs_list_add_request(req, head);
440 NFS_I(inode)->ncommit++;
587142f8 441 spin_unlock(&inode->i_lock);
fd39fc85 442 inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
c9e51e41 443 inc_bdi_stat(req->wb_page->mapping->backing_dev_info, BDI_RECLAIMABLE);
a1803044 444 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
1da177e4 445}
8dd37758
TM
446EXPORT_SYMBOL_GPL(nfs_request_add_commit_list);
447
448/**
449 * nfs_request_remove_commit_list - Remove request from a commit list
450 * @req: pointer to a nfs_page
451 *
452 * This clears the PG_CLEAN bit, and updates the inode global count of
453 * number of outstanding requests requiring a commit
454 * It does not update the MM page stats.
455 *
456 * The caller _must_ hold the inode->i_lock and the nfs_page lock.
457 */
458void
459nfs_request_remove_commit_list(struct nfs_page *req)
460{
461 struct inode *inode = req->wb_context->dentry->d_inode;
462
463 if (!test_and_clear_bit(PG_CLEAN, &(req)->wb_flags))
464 return;
465 nfs_list_remove_request(req);
466 NFS_I(inode)->ncommit--;
467}
468EXPORT_SYMBOL_GPL(nfs_request_remove_commit_list);
469
470
471/*
472 * Add a request to the inode's commit list.
473 */
474static void
475nfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg)
476{
477 struct inode *inode = req->wb_context->dentry->d_inode;
478
479 if (pnfs_mark_request_commit(req, lseg))
480 return;
481 nfs_request_add_commit_list(req, &NFS_I(inode)->commit_list);
482}
8e821cad 483
d6d6dc7c
FI
484static void
485nfs_clear_page_commit(struct page *page)
486{
487 dec_zone_page_state(page, NR_UNSTABLE_NFS);
488 dec_bdi_stat(page->mapping->backing_dev_info, BDI_RECLAIMABLE);
489}
490
8dd37758 491static void
e468bae9
TM
492nfs_clear_request_commit(struct nfs_page *req)
493{
8dd37758
TM
494 if (test_bit(PG_CLEAN, &req->wb_flags)) {
495 struct inode *inode = req->wb_context->dentry->d_inode;
e468bae9 496
8dd37758
TM
497 if (!pnfs_clear_request_commit(req)) {
498 spin_lock(&inode->i_lock);
499 nfs_request_remove_commit_list(req);
500 spin_unlock(&inode->i_lock);
501 }
d6d6dc7c 502 nfs_clear_page_commit(req->wb_page);
e468bae9 503 }
e468bae9
TM
504}
505
8e821cad
TM
506static inline
507int nfs_write_need_commit(struct nfs_write_data *data)
508{
465d5243
FI
509 if (data->verf.committed == NFS_DATA_SYNC)
510 return data->lseg == NULL;
511 else
512 return data->verf.committed != NFS_FILE_SYNC;
8e821cad
TM
513}
514
515static inline
a861a1e1
FI
516int nfs_reschedule_unstable_write(struct nfs_page *req,
517 struct nfs_write_data *data)
8e821cad 518{
e468bae9 519 if (test_and_clear_bit(PG_NEED_COMMIT, &req->wb_flags)) {
a861a1e1 520 nfs_mark_request_commit(req, data->lseg);
8e821cad
TM
521 return 1;
522 }
523 if (test_and_clear_bit(PG_NEED_RESCHED, &req->wb_flags)) {
6d884e8f 524 nfs_mark_request_dirty(req);
8e821cad
TM
525 return 1;
526 }
527 return 0;
528}
529#else
8dd37758 530static void
a861a1e1 531nfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg)
8e821cad
TM
532{
533}
534
8dd37758 535static void
e468bae9
TM
536nfs_clear_request_commit(struct nfs_page *req)
537{
e468bae9
TM
538}
539
8e821cad
TM
540static inline
541int nfs_write_need_commit(struct nfs_write_data *data)
542{
543 return 0;
544}
545
546static inline
a861a1e1
FI
547int nfs_reschedule_unstable_write(struct nfs_page *req,
548 struct nfs_write_data *data)
8e821cad
TM
549{
550 return 0;
551}
1da177e4
LT
552#endif
553
47c62564 554#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
fb8a1f11
TM
555static int
556nfs_need_commit(struct nfs_inode *nfsi)
557{
d6d6dc7c
FI
558 return nfsi->ncommit > 0;
559}
560
561/* i_lock held by caller */
8dd37758 562static int
3b3be88d
TM
563nfs_scan_commit_list(struct list_head *src, struct list_head *dst, int max,
564 spinlock_t *lock)
d6d6dc7c
FI
565{
566 struct nfs_page *req, *tmp;
567 int ret = 0;
568
569 list_for_each_entry_safe(req, tmp, src, wb_list) {
8dd37758
TM
570 if (!nfs_lock_request(req))
571 continue;
3b3be88d
TM
572 if (cond_resched_lock(lock))
573 list_safe_reset_next(req, tmp, wb_list);
8dd37758
TM
574 nfs_request_remove_commit_list(req);
575 nfs_list_add_request(req, dst);
576 ret++;
577 if (ret == max)
578 break;
d6d6dc7c
FI
579 }
580 return ret;
fb8a1f11
TM
581}
582
1da177e4
LT
583/*
584 * nfs_scan_commit - Scan an inode for commit requests
585 * @inode: NFS inode to scan
586 * @dst: destination list
1da177e4
LT
587 *
588 * Moves requests from the inode's 'commit' request list.
589 * The requests are *not* checked to ensure that they form a contiguous set.
590 */
591static int
d6d6dc7c 592nfs_scan_commit(struct inode *inode, struct list_head *dst)
1da177e4
LT
593{
594 struct nfs_inode *nfsi = NFS_I(inode);
d6d6dc7c 595 int ret = 0;
fb8a1f11 596
0d88f6e8 597 spin_lock(&inode->i_lock);
d6d6dc7c 598 if (nfsi->ncommit > 0) {
8dd37758 599 const int max = INT_MAX;
d6d6dc7c 600
3b3be88d
TM
601 ret = nfs_scan_commit_list(&nfsi->commit_list, dst, max,
602 &inode->i_lock);
603 ret += pnfs_scan_commit_lists(inode, max - ret,
604 &inode->i_lock);
d6d6dc7c 605 }
0d88f6e8 606 spin_unlock(&inode->i_lock);
ff778d02 607 return ret;
1da177e4 608}
d6d6dc7c 609
c42de9dd 610#else
fb8a1f11
TM
611static inline int nfs_need_commit(struct nfs_inode *nfsi)
612{
613 return 0;
614}
615
d6d6dc7c 616static inline int nfs_scan_commit(struct inode *inode, struct list_head *dst)
c42de9dd
TM
617{
618 return 0;
619}
1da177e4
LT
620#endif
621
1da177e4 622/*
e7d39069
TM
623 * Search for an existing write request, and attempt to update
624 * it to reflect a new dirty region on a given page.
1da177e4 625 *
e7d39069
TM
626 * If the attempt fails, then the existing request is flushed out
627 * to disk.
1da177e4 628 */
e7d39069
TM
629static struct nfs_page *nfs_try_to_update_request(struct inode *inode,
630 struct page *page,
631 unsigned int offset,
632 unsigned int bytes)
1da177e4 633{
e7d39069
TM
634 struct nfs_page *req;
635 unsigned int rqend;
636 unsigned int end;
637 int error;
638
639 if (!PagePrivate(page))
640 return NULL;
1da177e4
LT
641
642 end = offset + bytes;
e7d39069 643 spin_lock(&inode->i_lock);
1da177e4 644
1da177e4 645 for (;;) {
277459d2 646 req = nfs_page_find_request_locked(page);
e7d39069
TM
647 if (req == NULL)
648 goto out_unlock;
649
650 rqend = req->wb_offset + req->wb_bytes;
651 /*
652 * Tell the caller to flush out the request if
653 * the offsets are non-contiguous.
654 * Note: nfs_flush_incompatible() will already
655 * have flushed out requests having wrong owners.
656 */
e468bae9 657 if (offset > rqend
e7d39069
TM
658 || end < req->wb_offset)
659 goto out_flushme;
660
9994b62b 661 if (nfs_lock_request_dontget(req))
1da177e4 662 break;
1da177e4 663
e7d39069 664 /* The request is locked, so wait and then retry */
587142f8 665 spin_unlock(&inode->i_lock);
e7d39069
TM
666 error = nfs_wait_on_request(req);
667 nfs_release_request(req);
668 if (error != 0)
669 goto out_err;
670 spin_lock(&inode->i_lock);
1da177e4
LT
671 }
672
673 /* Okay, the request matches. Update the region */
674 if (offset < req->wb_offset) {
675 req->wb_offset = offset;
676 req->wb_pgbase = offset;
1da177e4 677 }
1da177e4
LT
678 if (end > rqend)
679 req->wb_bytes = end - req->wb_offset;
e7d39069
TM
680 else
681 req->wb_bytes = rqend - req->wb_offset;
682out_unlock:
683 spin_unlock(&inode->i_lock);
ca138f36
FI
684 if (req)
685 nfs_clear_request_commit(req);
e7d39069
TM
686 return req;
687out_flushme:
688 spin_unlock(&inode->i_lock);
689 nfs_release_request(req);
690 error = nfs_wb_page(inode, page);
691out_err:
692 return ERR_PTR(error);
693}
694
695/*
696 * Try to update an existing write request, or create one if there is none.
697 *
698 * Note: Should always be called with the Page Lock held to prevent races
699 * if we have to add a new request. Also assumes that the caller has
700 * already called nfs_flush_incompatible() if necessary.
701 */
702static struct nfs_page * nfs_setup_write_request(struct nfs_open_context* ctx,
703 struct page *page, unsigned int offset, unsigned int bytes)
704{
705 struct inode *inode = page->mapping->host;
706 struct nfs_page *req;
1da177e4 707
e7d39069
TM
708 req = nfs_try_to_update_request(inode, page, offset, bytes);
709 if (req != NULL)
710 goto out;
711 req = nfs_create_request(ctx, inode, page, offset, bytes);
712 if (IS_ERR(req))
713 goto out;
d6d6dc7c 714 nfs_inode_add_request(inode, req);
efc91ed0 715out:
61e930a9 716 return req;
1da177e4
LT
717}
718
e7d39069
TM
719static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page,
720 unsigned int offset, unsigned int count)
721{
722 struct nfs_page *req;
723
724 req = nfs_setup_write_request(ctx, page, offset, count);
725 if (IS_ERR(req))
726 return PTR_ERR(req);
727 /* Update file length */
728 nfs_grow_file(page, offset, count);
729 nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes);
a6305ddb 730 nfs_mark_request_dirty(req);
9994b62b 731 nfs_unlock_request(req);
e7d39069
TM
732 return 0;
733}
734
1da177e4
LT
735int nfs_flush_incompatible(struct file *file, struct page *page)
736{
cd3758e3 737 struct nfs_open_context *ctx = nfs_file_open_context(file);
1da177e4 738 struct nfs_page *req;
1a54533e 739 int do_flush, status;
1da177e4
LT
740 /*
741 * Look for a request corresponding to this page. If there
742 * is one, and it belongs to another file, we flush it out
743 * before we try to copy anything into the page. Do this
744 * due to the lack of an ACCESS-type call in NFSv2.
745 * Also do the same if we find a request from an existing
746 * dropped page.
747 */
1a54533e
TM
748 do {
749 req = nfs_page_find_request(page);
750 if (req == NULL)
751 return 0;
f11ac8db
TM
752 do_flush = req->wb_page != page || req->wb_context != ctx ||
753 req->wb_lock_context->lockowner != current->files ||
754 req->wb_lock_context->pid != current->tgid;
1da177e4 755 nfs_release_request(req);
1a54533e
TM
756 if (!do_flush)
757 return 0;
758 status = nfs_wb_page(page->mapping->host, page);
759 } while (status == 0);
760 return status;
1da177e4
LT
761}
762
5d47a356
TM
763/*
764 * If the page cache is marked as unsafe or invalid, then we can't rely on
765 * the PageUptodate() flag. In this case, we will need to turn off
766 * write optimisations that depend on the page contents being correct.
767 */
768static int nfs_write_pageuptodate(struct page *page, struct inode *inode)
769{
770 return PageUptodate(page) &&
771 !(NFS_I(inode)->cache_validity & (NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA));
772}
773
1da177e4
LT
774/*
775 * Update and possibly write a cached page of an NFS file.
776 *
777 * XXX: Keep an eye on generic_file_read to make sure it doesn't do bad
778 * things with a page scheduled for an RPC call (e.g. invalidate it).
779 */
780int nfs_updatepage(struct file *file, struct page *page,
781 unsigned int offset, unsigned int count)
782{
cd3758e3 783 struct nfs_open_context *ctx = nfs_file_open_context(file);
1da177e4 784 struct inode *inode = page->mapping->host;
1da177e4
LT
785 int status = 0;
786
91d5b470
CL
787 nfs_inc_stats(inode, NFSIOS_VFSUPDATEPAGE);
788
48186c7d 789 dprintk("NFS: nfs_updatepage(%s/%s %d@%lld)\n",
01cce933
JJS
790 file->f_path.dentry->d_parent->d_name.name,
791 file->f_path.dentry->d_name.name, count,
48186c7d 792 (long long)(page_offset(page) + offset));
1da177e4 793
1da177e4 794 /* If we're not using byte range locks, and we know the page
5d47a356
TM
795 * is up to date, it may be more efficient to extend the write
796 * to cover the entire page in order to avoid fragmentation
797 * inefficiencies.
1da177e4 798 */
5d47a356
TM
799 if (nfs_write_pageuptodate(page, inode) &&
800 inode->i_flock == NULL &&
6b2f3d1f 801 !(file->f_flags & O_DSYNC)) {
49a70f27 802 count = max(count + offset, nfs_page_length(page));
1da177e4 803 offset = 0;
1da177e4
LT
804 }
805
e21195a7 806 status = nfs_writepage_setup(ctx, page, offset, count);
03fa9e84
TM
807 if (status < 0)
808 nfs_set_pageerror(page);
59b7c05f
TM
809 else
810 __set_page_dirty_nobuffers(page);
1da177e4 811
48186c7d 812 dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n",
1da177e4 813 status, (long long)i_size_read(inode));
1da177e4
LT
814 return status;
815}
816
a861a1e1
FI
817static void nfs_writepage_release(struct nfs_page *req,
818 struct nfs_write_data *data)
1da177e4 819{
a6305ddb 820 struct page *page = req->wb_page;
1da177e4 821
a861a1e1 822 if (PageError(req->wb_page) || !nfs_reschedule_unstable_write(req, data))
8e821cad 823 nfs_inode_remove_request(req);
9994b62b 824 nfs_unlock_request(req);
a6305ddb 825 nfs_end_page_writeback(page);
1da177e4
LT
826}
827
3ff7576d 828static int flush_task_priority(int how)
1da177e4
LT
829{
830 switch (how & (FLUSH_HIGHPRI|FLUSH_LOWPRI)) {
831 case FLUSH_HIGHPRI:
832 return RPC_PRIORITY_HIGH;
833 case FLUSH_LOWPRI:
834 return RPC_PRIORITY_LOW;
835 }
836 return RPC_PRIORITY_NORMAL;
837}
838
c5996c4e
FI
839int nfs_initiate_write(struct rpc_clnt *clnt,
840 struct nfs_write_data *data,
d138d5d1
AA
841 const struct rpc_call_ops *call_ops,
842 int how)
1da177e4 843{
d138d5d1 844 struct inode *inode = data->inode;
3ff7576d 845 int priority = flush_task_priority(how);
07737691 846 struct rpc_task *task;
bdc7f021
TM
847 struct rpc_message msg = {
848 .rpc_argp = &data->args,
849 .rpc_resp = &data->res,
d138d5d1 850 .rpc_cred = data->cred,
bdc7f021 851 };
84115e1c 852 struct rpc_task_setup task_setup_data = {
d138d5d1 853 .rpc_client = clnt,
07737691 854 .task = &data->task,
bdc7f021 855 .rpc_message = &msg,
84115e1c
TM
856 .callback_ops = call_ops,
857 .callback_data = data,
101070ca 858 .workqueue = nfsiod_workqueue,
2c61be0a 859 .flags = RPC_TASK_ASYNC,
3ff7576d 860 .priority = priority,
84115e1c 861 };
2c61be0a 862 int ret = 0;
1da177e4 863
d138d5d1
AA
864 /* Set up the initial task struct. */
865 NFS_PROTO(inode)->write_setup(data, &msg);
866
867 dprintk("NFS: %5u initiated write call "
868 "(req %s/%lld, %u bytes @ offset %llu)\n",
869 data->task.tk_pid,
870 inode->i_sb->s_id,
871 (long long)NFS_FILEID(inode),
872 data->args.count,
873 (unsigned long long)data->args.offset);
874
875 task = rpc_run_task(&task_setup_data);
876 if (IS_ERR(task)) {
877 ret = PTR_ERR(task);
878 goto out;
879 }
880 if (how & FLUSH_SYNC) {
881 ret = rpc_wait_for_completion_task(task);
882 if (ret == 0)
883 ret = task->tk_status;
884 }
885 rpc_put_task(task);
886out:
887 return ret;
888}
a69aef14 889EXPORT_SYMBOL_GPL(nfs_initiate_write);
d138d5d1
AA
890
891/*
892 * Set up the argument/result storage required for the RPC call.
893 */
6e4efd56 894static void nfs_write_rpcsetup(struct nfs_page *req,
d138d5d1 895 struct nfs_write_data *data,
d138d5d1
AA
896 unsigned int count, unsigned int offset,
897 int how)
898{
3d4ff43d 899 struct inode *inode = req->wb_context->dentry->d_inode;
d138d5d1 900
1da177e4
LT
901 /* Set up the RPC argument and reply structs
902 * NB: take care not to mess about with data->commit et al. */
903
904 data->req = req;
3d4ff43d 905 data->inode = inode = req->wb_context->dentry->d_inode;
d138d5d1 906 data->cred = req->wb_context->cred;
1da177e4
LT
907
908 data->args.fh = NFS_FH(inode);
909 data->args.offset = req_offset(req) + offset;
2bea038c
BH
910 /* pnfs_set_layoutcommit needs this */
911 data->mds_offset = data->args.offset;
1da177e4
LT
912 data->args.pgbase = req->wb_pgbase + offset;
913 data->args.pages = data->pagevec;
914 data->args.count = count;
383ba719 915 data->args.context = get_nfs_open_context(req->wb_context);
f11ac8db 916 data->args.lock_context = req->wb_lock_context;
bdc7f021 917 data->args.stable = NFS_UNSTABLE;
87ed5eb4
TM
918 switch (how & (FLUSH_STABLE | FLUSH_COND_STABLE)) {
919 case 0:
920 break;
921 case FLUSH_COND_STABLE:
922 if (nfs_need_commit(NFS_I(inode)))
923 break;
924 default:
925 data->args.stable = NFS_FILE_SYNC;
bdc7f021 926 }
1da177e4
LT
927
928 data->res.fattr = &data->fattr;
929 data->res.count = count;
930 data->res.verf = &data->verf;
0e574af1 931 nfs_fattr_init(&data->fattr);
6e4efd56 932}
1da177e4 933
6e4efd56
TM
934static int nfs_do_write(struct nfs_write_data *data,
935 const struct rpc_call_ops *call_ops,
6e4efd56
TM
936 int how)
937{
5f00bcb3 938 struct inode *inode = data->args.context->dentry->d_inode;
0382b744 939
c5996c4e 940 return nfs_initiate_write(NFS_CLIENT(inode), data, call_ops, how);
1da177e4
LT
941}
942
275acaaf
TM
943static int nfs_do_multiple_writes(struct list_head *head,
944 const struct rpc_call_ops *call_ops,
275acaaf
TM
945 int how)
946{
947 struct nfs_write_data *data;
948 int ret = 0;
949
950 while (!list_empty(head)) {
951 int ret2;
952
953 data = list_entry(head->next, struct nfs_write_data, list);
954 list_del_init(&data->list);
955
dce81290 956 ret2 = nfs_do_write(data, call_ops, how);
275acaaf
TM
957 if (ret == 0)
958 ret = ret2;
959 }
960 return ret;
961}
962
6d884e8f
F
963/* If a nfs_flush_* function fails, it should remove reqs from @head and
964 * call this on each, which will prepare them to be retried on next
965 * writeback using standard nfs.
966 */
967static void nfs_redirty_request(struct nfs_page *req)
968{
a6305ddb
TM
969 struct page *page = req->wb_page;
970
6d884e8f 971 nfs_mark_request_dirty(req);
9994b62b 972 nfs_unlock_request(req);
a6305ddb 973 nfs_end_page_writeback(page);
6d884e8f
F
974}
975
1da177e4
LT
976/*
977 * Generate multiple small requests to write out a single
978 * contiguous dirty area on one page.
979 */
275acaaf 980static int nfs_flush_multi(struct nfs_pageio_descriptor *desc, struct list_head *res)
1da177e4 981{
c76069bd 982 struct nfs_page *req = nfs_list_entry(desc->pg_list.next);
1da177e4
LT
983 struct page *page = req->wb_page;
984 struct nfs_write_data *data;
d097971d 985 size_t wsize = desc->pg_bsize, nbytes;
e9f7bee1 986 unsigned int offset;
1da177e4 987 int requests = 0;
dbae4c73 988 int ret = 0;
1da177e4
LT
989
990 nfs_list_remove_request(req);
991
b31268ac
TM
992 if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
993 (desc->pg_moreio || NFS_I(desc->pg_inode)->ncommit ||
994 desc->pg_count > wsize))
995 desc->pg_ioflags &= ~FLUSH_COND_STABLE;
996
997
275acaaf 998 offset = 0;
c76069bd 999 nbytes = desc->pg_count;
e9f7bee1
TM
1000 do {
1001 size_t len = min(nbytes, wsize);
1002
8d5658c9 1003 data = nfs_writedata_alloc(1);
1da177e4
LT
1004 if (!data)
1005 goto out_bad;
275acaaf 1006 data->pagevec[0] = page;
f13c3620 1007 nfs_write_rpcsetup(req, data, len, offset, desc->pg_ioflags);
275acaaf 1008 list_add(&data->list, res);
1da177e4 1009 requests++;
e9f7bee1 1010 nbytes -= len;
275acaaf 1011 offset += len;
e9f7bee1 1012 } while (nbytes != 0);
1da177e4 1013 atomic_set(&req->wb_complete, requests);
50828d7e 1014 desc->pg_rpc_callops = &nfs_write_partial_ops;
dbae4c73 1015 return ret;
1da177e4
LT
1016
1017out_bad:
275acaaf
TM
1018 while (!list_empty(res)) {
1019 data = list_entry(res->next, struct nfs_write_data, list);
6e4efd56 1020 list_del(&data->list);
8ccd271f 1021 nfs_writedata_release(data);
1da177e4 1022 }
61822ab5 1023 nfs_redirty_request(req);
1da177e4
LT
1024 return -ENOMEM;
1025}
1026
1027/*
1028 * Create an RPC task for the given write request and kick it.
1029 * The page must have been locked by the caller.
1030 *
1031 * It may happen that the page we're passed is not marked dirty.
1032 * This is the case if nfs_updatepage detects a conflicting request
1033 * that has been written but not committed.
1034 */
275acaaf 1035static int nfs_flush_one(struct nfs_pageio_descriptor *desc, struct list_head *res)
1da177e4
LT
1036{
1037 struct nfs_page *req;
1038 struct page **pages;
1039 struct nfs_write_data *data;
c76069bd 1040 struct list_head *head = &desc->pg_list;
3b609184 1041 int ret = 0;
1da177e4 1042
c76069bd
FI
1043 data = nfs_writedata_alloc(nfs_page_array_len(desc->pg_base,
1044 desc->pg_count));
44b83799
FI
1045 if (!data) {
1046 while (!list_empty(head)) {
1047 req = nfs_list_entry(head->next);
1048 nfs_list_remove_request(req);
1049 nfs_redirty_request(req);
1050 }
1051 ret = -ENOMEM;
1052 goto out;
1053 }
1da177e4 1054 pages = data->pagevec;
1da177e4
LT
1055 while (!list_empty(head)) {
1056 req = nfs_list_entry(head->next);
1057 nfs_list_remove_request(req);
1058 nfs_list_add_request(req, &data->pages);
1da177e4 1059 *pages++ = req->wb_page;
1da177e4
LT
1060 }
1061 req = nfs_list_entry(data->pages.next);
1062
b31268ac
TM
1063 if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
1064 (desc->pg_moreio || NFS_I(desc->pg_inode)->ncommit))
1065 desc->pg_ioflags &= ~FLUSH_COND_STABLE;
1066
1da177e4 1067 /* Set up the argument struct */
6e4efd56 1068 nfs_write_rpcsetup(req, data, desc->pg_count, 0, desc->pg_ioflags);
275acaaf 1069 list_add(&data->list, res);
50828d7e 1070 desc->pg_rpc_callops = &nfs_write_full_ops;
44b83799 1071out:
44b83799 1072 return ret;
1da177e4
LT
1073}
1074
dce81290
TM
1075int nfs_generic_flush(struct nfs_pageio_descriptor *desc, struct list_head *head)
1076{
1077 if (desc->pg_bsize < PAGE_CACHE_SIZE)
1078 return nfs_flush_multi(desc, head);
1079 return nfs_flush_one(desc, head);
1080}
1081
1082static int nfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
1751c363 1083{
275acaaf
TM
1084 LIST_HEAD(head);
1085 int ret;
1086
dce81290 1087 ret = nfs_generic_flush(desc, &head);
50828d7e
TM
1088 if (ret == 0)
1089 ret = nfs_do_multiple_writes(&head, desc->pg_rpc_callops,
dce81290 1090 desc->pg_ioflags);
275acaaf 1091 return ret;
1751c363 1092}
1751c363
TM
1093
1094static const struct nfs_pageio_ops nfs_pageio_write_ops = {
1095 .pg_test = nfs_generic_pg_test,
1096 .pg_doio = nfs_generic_pg_writepages,
1097};
1098
e2fecb21 1099void nfs_pageio_init_write_mds(struct nfs_pageio_descriptor *pgio,
c63c7b05 1100 struct inode *inode, int ioflags)
1da177e4 1101{
1751c363
TM
1102 nfs_pageio_init(pgio, inode, &nfs_pageio_write_ops,
1103 NFS_SERVER(inode)->wsize, ioflags);
1104}
1da177e4 1105
dce81290
TM
1106void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio)
1107{
1108 pgio->pg_ops = &nfs_pageio_write_ops;
1109 pgio->pg_bsize = NFS_SERVER(pgio->pg_inode)->wsize;
1110}
1f945357 1111EXPORT_SYMBOL_GPL(nfs_pageio_reset_write_mds);
dce81290 1112
1751c363
TM
1113static void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
1114 struct inode *inode, int ioflags)
1115{
1116 if (!pnfs_pageio_init_write(pgio, inode, ioflags))
1117 nfs_pageio_init_write_mds(pgio, inode, ioflags);
1da177e4
LT
1118}
1119
1120/*
1121 * Handle a write reply that flushed part of a page.
1122 */
788e7a89 1123static void nfs_writeback_done_partial(struct rpc_task *task, void *calldata)
1da177e4 1124{
788e7a89 1125 struct nfs_write_data *data = calldata;
1da177e4 1126
48186c7d
CL
1127 dprintk("NFS: %5u write(%s/%lld %d@%lld)",
1128 task->tk_pid,
3d4ff43d 1129 data->req->wb_context->dentry->d_inode->i_sb->s_id,
48186c7d 1130 (long long)
3d4ff43d 1131 NFS_FILEID(data->req->wb_context->dentry->d_inode),
48186c7d 1132 data->req->wb_bytes, (long long)req_offset(data->req));
1da177e4 1133
c9d8f89d
TM
1134 nfs_writeback_done(task, data);
1135}
788e7a89 1136
c9d8f89d
TM
1137static void nfs_writeback_release_partial(void *calldata)
1138{
1139 struct nfs_write_data *data = calldata;
1140 struct nfs_page *req = data->req;
1141 struct page *page = req->wb_page;
1142 int status = data->task.tk_status;
1143
1144 if (status < 0) {
a301b777 1145 nfs_set_pageerror(page);
c9d8f89d
TM
1146 nfs_context_set_write_error(req->wb_context, status);
1147 dprintk(", error = %d\n", status);
8e821cad 1148 goto out;
1da177e4
LT
1149 }
1150
8e821cad 1151 if (nfs_write_need_commit(data)) {
587142f8 1152 struct inode *inode = page->mapping->host;
8e821cad 1153
587142f8 1154 spin_lock(&inode->i_lock);
8e821cad
TM
1155 if (test_bit(PG_NEED_RESCHED, &req->wb_flags)) {
1156 /* Do nothing we need to resend the writes */
1157 } else if (!test_and_set_bit(PG_NEED_COMMIT, &req->wb_flags)) {
1158 memcpy(&req->wb_verf, &data->verf, sizeof(req->wb_verf));
1159 dprintk(" defer commit\n");
1160 } else if (memcmp(&req->wb_verf, &data->verf, sizeof(req->wb_verf))) {
1161 set_bit(PG_NEED_RESCHED, &req->wb_flags);
1162 clear_bit(PG_NEED_COMMIT, &req->wb_flags);
1163 dprintk(" server reboot detected\n");
1164 }
587142f8 1165 spin_unlock(&inode->i_lock);
8e821cad
TM
1166 } else
1167 dprintk(" OK\n");
1168
1169out:
1da177e4 1170 if (atomic_dec_and_test(&req->wb_complete))
a861a1e1 1171 nfs_writepage_release(req, data);
c9d8f89d 1172 nfs_writedata_release(calldata);
1da177e4
LT
1173}
1174
def6ed7e
AA
1175void nfs_write_prepare(struct rpc_task *task, void *calldata)
1176{
1177 struct nfs_write_data *data = calldata;
c6cb80d0 1178 NFS_PROTO(data->inode)->write_rpc_prepare(task, data);
def6ed7e 1179}
def6ed7e 1180
0b7c0153
FI
1181void nfs_commit_prepare(struct rpc_task *task, void *calldata)
1182{
1183 struct nfs_commit_data *data = calldata;
1184
1185 NFS_PROTO(data->inode)->commit_rpc_prepare(task, data);
1186}
1187
788e7a89 1188static const struct rpc_call_ops nfs_write_partial_ops = {
def6ed7e 1189 .rpc_call_prepare = nfs_write_prepare,
788e7a89 1190 .rpc_call_done = nfs_writeback_done_partial,
c9d8f89d 1191 .rpc_release = nfs_writeback_release_partial,
788e7a89
TM
1192};
1193
1da177e4
LT
1194/*
1195 * Handle a write reply that flushes a whole page.
1196 *
1197 * FIXME: There is an inherent race with invalidate_inode_pages and
1198 * writebacks since the page->count is kept > 1 for as long
1199 * as the page has a write request pending.
1200 */
788e7a89 1201static void nfs_writeback_done_full(struct rpc_task *task, void *calldata)
1da177e4 1202{
788e7a89 1203 struct nfs_write_data *data = calldata;
1da177e4 1204
c9d8f89d
TM
1205 nfs_writeback_done(task, data);
1206}
1207
1208static void nfs_writeback_release_full(void *calldata)
1209{
1210 struct nfs_write_data *data = calldata;
e2fecb21 1211 int status = data->task.tk_status;
788e7a89 1212
1da177e4
LT
1213 /* Update attributes as result of writeback. */
1214 while (!list_empty(&data->pages)) {
c9d8f89d
TM
1215 struct nfs_page *req = nfs_list_entry(data->pages.next);
1216 struct page *page = req->wb_page;
1217
1da177e4 1218 nfs_list_remove_request(req);
1da177e4 1219
48186c7d
CL
1220 dprintk("NFS: %5u write (%s/%lld %d@%lld)",
1221 data->task.tk_pid,
3d4ff43d
AV
1222 req->wb_context->dentry->d_inode->i_sb->s_id,
1223 (long long)NFS_FILEID(req->wb_context->dentry->d_inode),
1da177e4
LT
1224 req->wb_bytes,
1225 (long long)req_offset(req));
1226
c9d8f89d 1227 if (status < 0) {
a301b777 1228 nfs_set_pageerror(page);
c9d8f89d
TM
1229 nfs_context_set_write_error(req->wb_context, status);
1230 dprintk(", error = %d\n", status);
8e821cad 1231 goto remove_request;
1da177e4 1232 }
1da177e4 1233
8e821cad
TM
1234 if (nfs_write_need_commit(data)) {
1235 memcpy(&req->wb_verf, &data->verf, sizeof(req->wb_verf));
a861a1e1 1236 nfs_mark_request_commit(req, data->lseg);
8e821cad 1237 dprintk(" marked for commit\n");
1da177e4
LT
1238 goto next;
1239 }
8e821cad
TM
1240 dprintk(" OK\n");
1241remove_request:
1da177e4 1242 nfs_inode_remove_request(req);
1da177e4 1243 next:
9994b62b 1244 nfs_unlock_request(req);
a6305ddb 1245 nfs_end_page_writeback(page);
1da177e4 1246 }
c9d8f89d 1247 nfs_writedata_release(calldata);
1da177e4
LT
1248}
1249
788e7a89 1250static const struct rpc_call_ops nfs_write_full_ops = {
def6ed7e 1251 .rpc_call_prepare = nfs_write_prepare,
788e7a89 1252 .rpc_call_done = nfs_writeback_done_full,
c9d8f89d 1253 .rpc_release = nfs_writeback_release_full,
788e7a89
TM
1254};
1255
1256
1da177e4
LT
1257/*
1258 * This function is called when the WRITE call is complete.
1259 */
13602896 1260void nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
1da177e4 1261{
1da177e4
LT
1262 struct nfs_writeargs *argp = &data->args;
1263 struct nfs_writeres *resp = &data->res;
788e7a89 1264 int status;
1da177e4 1265
a3f565b1 1266 dprintk("NFS: %5u nfs_writeback_done (status %d)\n",
1da177e4
LT
1267 task->tk_pid, task->tk_status);
1268
f551e44f
CL
1269 /*
1270 * ->write_done will attempt to use post-op attributes to detect
1271 * conflicting writes by other clients. A strict interpretation
1272 * of close-to-open would allow us to continue caching even if
1273 * another writer had changed the file, but some applications
1274 * depend on tighter cache coherency when writing.
1275 */
788e7a89
TM
1276 status = NFS_PROTO(data->inode)->write_done(task, data);
1277 if (status != 0)
13602896 1278 return;
91d5b470
CL
1279 nfs_add_stats(data->inode, NFSIOS_SERVERWRITTENBYTES, resp->count);
1280
1da177e4
LT
1281#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
1282 if (resp->verf->committed < argp->stable && task->tk_status >= 0) {
1283 /* We tried a write call, but the server did not
1284 * commit data to stable storage even though we
1285 * requested it.
1286 * Note: There is a known bug in Tru64 < 5.0 in which
1287 * the server reports NFS_DATA_SYNC, but performs
1288 * NFS_FILE_SYNC. We therefore implement this checking
1289 * as a dprintk() in order to avoid filling syslog.
1290 */
1291 static unsigned long complain;
1292
a69aef14 1293 /* Note this will print the MDS for a DS write */
1da177e4 1294 if (time_before(complain, jiffies)) {
48186c7d 1295 dprintk("NFS: faulty NFS server %s:"
1da177e4 1296 " (committed = %d) != (stable = %d)\n",
2b72c9cc 1297 NFS_SERVER(data->inode)->nfs_client->cl_hostname,
1da177e4
LT
1298 resp->verf->committed, argp->stable);
1299 complain = jiffies + 300 * HZ;
1300 }
1301 }
1302#endif
1303 /* Is this a short write? */
1304 if (task->tk_status >= 0 && resp->count < argp->count) {
1305 static unsigned long complain;
1306
91d5b470
CL
1307 nfs_inc_stats(data->inode, NFSIOS_SHORTWRITE);
1308
1da177e4
LT
1309 /* Has the server at least made some progress? */
1310 if (resp->count != 0) {
1311 /* Was this an NFSv2 write or an NFSv3 stable write? */
1312 if (resp->verf->committed != NFS_UNSTABLE) {
1313 /* Resend from where the server left off */
a69aef14 1314 data->mds_offset += resp->count;
1da177e4
LT
1315 argp->offset += resp->count;
1316 argp->pgbase += resp->count;
1317 argp->count -= resp->count;
1318 } else {
1319 /* Resend as a stable write in order to avoid
1320 * headaches in the case of a server crash.
1321 */
1322 argp->stable = NFS_FILE_SYNC;
1323 }
d00c5d43 1324 rpc_restart_call_prepare(task);
13602896 1325 return;
1da177e4
LT
1326 }
1327 if (time_before(complain, jiffies)) {
1328 printk(KERN_WARNING
1329 "NFS: Server wrote zero bytes, expected %u.\n",
1330 argp->count);
1331 complain = jiffies + 300 * HZ;
1332 }
1333 /* Can't do anything about it except throw an error. */
1334 task->tk_status = -EIO;
1335 }
13602896 1336 return;
1da177e4
LT
1337}
1338
1339
1340#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
71d0a611
TM
1341static int nfs_commit_set_lock(struct nfs_inode *nfsi, int may_wait)
1342{
b8413f98
TM
1343 int ret;
1344
71d0a611
TM
1345 if (!test_and_set_bit(NFS_INO_COMMIT, &nfsi->flags))
1346 return 1;
b8413f98
TM
1347 if (!may_wait)
1348 return 0;
1349 ret = out_of_line_wait_on_bit_lock(&nfsi->flags,
1350 NFS_INO_COMMIT,
1351 nfs_wait_bit_killable,
1352 TASK_KILLABLE);
1353 return (ret < 0) ? ret : 1;
71d0a611
TM
1354}
1355
e0c2b380 1356void nfs_commit_clear_lock(struct nfs_inode *nfsi)
71d0a611
TM
1357{
1358 clear_bit(NFS_INO_COMMIT, &nfsi->flags);
1359 smp_mb__after_clear_bit();
1360 wake_up_bit(&nfsi->flags, NFS_INO_COMMIT);
1361}
e0c2b380 1362EXPORT_SYMBOL_GPL(nfs_commit_clear_lock);
71d0a611 1363
0b7c0153 1364void nfs_commitdata_release(struct nfs_commit_data *data)
1da177e4 1365{
0b7c0153
FI
1366 put_nfs_open_context(data->context);
1367 nfs_commit_free(data);
1da177e4 1368}
e0c2b380 1369EXPORT_SYMBOL_GPL(nfs_commitdata_release);
1da177e4 1370
0b7c0153 1371int nfs_initiate_commit(struct rpc_clnt *clnt, struct nfs_commit_data *data,
9ace33cd
FI
1372 const struct rpc_call_ops *call_ops,
1373 int how)
1da177e4 1374{
07737691 1375 struct rpc_task *task;
9ace33cd 1376 int priority = flush_task_priority(how);
bdc7f021
TM
1377 struct rpc_message msg = {
1378 .rpc_argp = &data->args,
1379 .rpc_resp = &data->res,
9ace33cd 1380 .rpc_cred = data->cred,
bdc7f021 1381 };
84115e1c 1382 struct rpc_task_setup task_setup_data = {
07737691 1383 .task = &data->task,
9ace33cd 1384 .rpc_client = clnt,
bdc7f021 1385 .rpc_message = &msg,
9ace33cd 1386 .callback_ops = call_ops,
84115e1c 1387 .callback_data = data,
101070ca 1388 .workqueue = nfsiod_workqueue,
2c61be0a 1389 .flags = RPC_TASK_ASYNC,
3ff7576d 1390 .priority = priority,
84115e1c 1391 };
9ace33cd
FI
1392 /* Set up the initial task struct. */
1393 NFS_PROTO(data->inode)->commit_setup(data, &msg);
1394
1395 dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid);
1396
1397 task = rpc_run_task(&task_setup_data);
1398 if (IS_ERR(task))
1399 return PTR_ERR(task);
1400 if (how & FLUSH_SYNC)
1401 rpc_wait_for_completion_task(task);
1402 rpc_put_task(task);
1403 return 0;
1404}
e0c2b380 1405EXPORT_SYMBOL_GPL(nfs_initiate_commit);
9ace33cd
FI
1406
1407/*
1408 * Set up the argument/result storage required for the RPC call.
1409 */
0b7c0153 1410void nfs_init_commit(struct nfs_commit_data *data,
988b6dce
FI
1411 struct list_head *head,
1412 struct pnfs_layout_segment *lseg)
9ace33cd
FI
1413{
1414 struct nfs_page *first = nfs_list_entry(head->next);
3d4ff43d 1415 struct inode *inode = first->wb_context->dentry->d_inode;
1da177e4
LT
1416
1417 /* Set up the RPC argument and reply structs
1418 * NB: take care not to mess about with data->commit et al. */
1419
1420 list_splice_init(head, &data->pages);
1da177e4 1421
1da177e4 1422 data->inode = inode;
9ace33cd 1423 data->cred = first->wb_context->cred;
988b6dce 1424 data->lseg = lseg; /* reference transferred */
9ace33cd 1425 data->mds_ops = &nfs_commit_ops;
1da177e4
LT
1426
1427 data->args.fh = NFS_FH(data->inode);
3da28eb1
TM
1428 /* Note: we always request a commit of the entire inode */
1429 data->args.offset = 0;
1430 data->args.count = 0;
0b7c0153 1431 data->context = get_nfs_open_context(first->wb_context);
1da177e4
LT
1432 data->res.fattr = &data->fattr;
1433 data->res.verf = &data->verf;
0e574af1 1434 nfs_fattr_init(&data->fattr);
1da177e4 1435}
e0c2b380 1436EXPORT_SYMBOL_GPL(nfs_init_commit);
1da177e4 1437
e0c2b380 1438void nfs_retry_commit(struct list_head *page_list,
a861a1e1 1439 struct pnfs_layout_segment *lseg)
64bfeb49
FI
1440{
1441 struct nfs_page *req;
1442
1443 while (!list_empty(page_list)) {
1444 req = nfs_list_entry(page_list->next);
1445 nfs_list_remove_request(req);
a861a1e1 1446 nfs_mark_request_commit(req, lseg);
64bfeb49
FI
1447 dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
1448 dec_bdi_stat(req->wb_page->mapping->backing_dev_info,
1449 BDI_RECLAIMABLE);
9994b62b 1450 nfs_unlock_request(req);
64bfeb49
FI
1451 }
1452}
e0c2b380 1453EXPORT_SYMBOL_GPL(nfs_retry_commit);
64bfeb49 1454
1da177e4
LT
1455/*
1456 * Commit dirty pages
1457 */
1458static int
40859d7e 1459nfs_commit_list(struct inode *inode, struct list_head *head, int how)
1da177e4 1460{
0b7c0153 1461 struct nfs_commit_data *data;
1da177e4 1462
c9d8f89d 1463 data = nfs_commitdata_alloc();
1da177e4
LT
1464
1465 if (!data)
1466 goto out_bad;
1467
1468 /* Set up the argument struct */
988b6dce 1469 nfs_init_commit(data, head, NULL);
0b7c0153 1470 return nfs_initiate_commit(NFS_CLIENT(inode), data, data->mds_ops, how);
1da177e4 1471 out_bad:
a861a1e1 1472 nfs_retry_commit(head, NULL);
71d0a611 1473 nfs_commit_clear_lock(NFS_I(inode));
1da177e4
LT
1474 return -ENOMEM;
1475}
1476
1477/*
1478 * COMMIT call returned
1479 */
788e7a89 1480static void nfs_commit_done(struct rpc_task *task, void *calldata)
1da177e4 1481{
0b7c0153 1482 struct nfs_commit_data *data = calldata;
1da177e4 1483
a3f565b1 1484 dprintk("NFS: %5u nfs_commit_done (status %d)\n",
1da177e4
LT
1485 task->tk_pid, task->tk_status);
1486
788e7a89 1487 /* Call the NFS version-specific code */
c0d0e96b 1488 NFS_PROTO(data->inode)->commit_done(task, data);
c9d8f89d
TM
1489}
1490
0b7c0153 1491void nfs_commit_release_pages(struct nfs_commit_data *data)
c9d8f89d 1492{
5917ce84 1493 struct nfs_page *req;
c9d8f89d 1494 int status = data->task.tk_status;
788e7a89 1495
1da177e4
LT
1496 while (!list_empty(&data->pages)) {
1497 req = nfs_list_entry(data->pages.next);
1498 nfs_list_remove_request(req);
d6d6dc7c 1499 nfs_clear_page_commit(req->wb_page);
1da177e4 1500
48186c7d 1501 dprintk("NFS: commit (%s/%lld %d@%lld)",
3d4ff43d
AV
1502 req->wb_context->dentry->d_sb->s_id,
1503 (long long)NFS_FILEID(req->wb_context->dentry->d_inode),
1da177e4
LT
1504 req->wb_bytes,
1505 (long long)req_offset(req));
c9d8f89d
TM
1506 if (status < 0) {
1507 nfs_context_set_write_error(req->wb_context, status);
1da177e4 1508 nfs_inode_remove_request(req);
c9d8f89d 1509 dprintk(", error = %d\n", status);
1da177e4
LT
1510 goto next;
1511 }
1512
1513 /* Okay, COMMIT succeeded, apparently. Check the verifier
1514 * returned by the server against all stored verfs. */
1515 if (!memcmp(req->wb_verf.verifier, data->verf.verifier, sizeof(data->verf.verifier))) {
1516 /* We have a match */
1517 nfs_inode_remove_request(req);
1518 dprintk(" OK\n");
1519 goto next;
1520 }
1521 /* We have a mismatch. Write the page again */
1522 dprintk(" mismatch\n");
6d884e8f 1523 nfs_mark_request_dirty(req);
1da177e4 1524 next:
9994b62b 1525 nfs_unlock_request(req);
1da177e4 1526 }
5917ce84 1527}
e0c2b380 1528EXPORT_SYMBOL_GPL(nfs_commit_release_pages);
5917ce84
FI
1529
1530static void nfs_commit_release(void *calldata)
1531{
0b7c0153 1532 struct nfs_commit_data *data = calldata;
5917ce84
FI
1533
1534 nfs_commit_release_pages(data);
71d0a611 1535 nfs_commit_clear_lock(NFS_I(data->inode));
c9d8f89d 1536 nfs_commitdata_release(calldata);
1da177e4 1537}
788e7a89
TM
1538
1539static const struct rpc_call_ops nfs_commit_ops = {
0b7c0153 1540 .rpc_call_prepare = nfs_commit_prepare,
788e7a89
TM
1541 .rpc_call_done = nfs_commit_done,
1542 .rpc_release = nfs_commit_release,
1543};
1da177e4 1544
b608b283 1545int nfs_commit_inode(struct inode *inode, int how)
1da177e4 1546{
1da177e4 1547 LIST_HEAD(head);
71d0a611 1548 int may_wait = how & FLUSH_SYNC;
b8413f98 1549 int res;
1da177e4 1550
b8413f98
TM
1551 res = nfs_commit_set_lock(NFS_I(inode), may_wait);
1552 if (res <= 0)
c5efa5fc 1553 goto out_mark_dirty;
d6d6dc7c 1554 res = nfs_scan_commit(inode, &head);
1da177e4 1555 if (res) {
a861a1e1
FI
1556 int error;
1557
1558 error = pnfs_commit_list(inode, &head, how);
1559 if (error == PNFS_NOT_ATTEMPTED)
1560 error = nfs_commit_list(inode, &head, how);
3da28eb1
TM
1561 if (error < 0)
1562 return error;
b8413f98 1563 if (!may_wait)
c5efa5fc 1564 goto out_mark_dirty;
b8413f98
TM
1565 error = wait_on_bit(&NFS_I(inode)->flags,
1566 NFS_INO_COMMIT,
1567 nfs_wait_bit_killable,
1568 TASK_KILLABLE);
1569 if (error < 0)
1570 return error;
71d0a611
TM
1571 } else
1572 nfs_commit_clear_lock(NFS_I(inode));
c5efa5fc
TM
1573 return res;
1574 /* Note: If we exit without ensuring that the commit is complete,
1575 * we must mark the inode as dirty. Otherwise, future calls to
1576 * sync_inode() with the WB_SYNC_ALL flag set will fail to ensure
1577 * that the data is on the disk.
1578 */
1579out_mark_dirty:
1580 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
1da177e4
LT
1581 return res;
1582}
8fc795f7
TM
1583
1584static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_control *wbc)
1585{
420e3646
TM
1586 struct nfs_inode *nfsi = NFS_I(inode);
1587 int flags = FLUSH_SYNC;
1588 int ret = 0;
8fc795f7 1589
3236c3e1
JL
1590 /* no commits means nothing needs to be done */
1591 if (!nfsi->ncommit)
1592 return ret;
1593
a00dd6c0
JL
1594 if (wbc->sync_mode == WB_SYNC_NONE) {
1595 /* Don't commit yet if this is a non-blocking flush and there
1596 * are a lot of outstanding writes for this mapping.
1597 */
1598 if (nfsi->ncommit <= (nfsi->npages >> 1))
1599 goto out_mark_dirty;
420e3646 1600
a00dd6c0 1601 /* don't wait for the COMMIT response */
420e3646 1602 flags = 0;
a00dd6c0
JL
1603 }
1604
420e3646
TM
1605 ret = nfs_commit_inode(inode, flags);
1606 if (ret >= 0) {
1607 if (wbc->sync_mode == WB_SYNC_NONE) {
1608 if (ret < wbc->nr_to_write)
1609 wbc->nr_to_write -= ret;
1610 else
1611 wbc->nr_to_write = 0;
1612 }
8fc795f7 1613 return 0;
420e3646
TM
1614 }
1615out_mark_dirty:
8fc795f7
TM
1616 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
1617 return ret;
1618}
c63c7b05 1619#else
8fc795f7
TM
1620static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_control *wbc)
1621{
1622 return 0;
1623}
1da177e4
LT
1624#endif
1625
8fc795f7
TM
1626int nfs_write_inode(struct inode *inode, struct writeback_control *wbc)
1627{
863a3c6c
AA
1628 int ret;
1629
1630 ret = nfs_commit_unstable_pages(inode, wbc);
1631 if (ret >= 0 && test_bit(NFS_INO_LAYOUTCOMMIT, &NFS_I(inode)->flags)) {
ef311537
AA
1632 int status;
1633 bool sync = true;
863a3c6c 1634
846d5a09 1635 if (wbc->sync_mode == WB_SYNC_NONE)
ef311537 1636 sync = false;
863a3c6c
AA
1637
1638 status = pnfs_layoutcommit_inode(inode, sync);
1639 if (status < 0)
1640 return status;
1641 }
1642 return ret;
8fc795f7
TM
1643}
1644
acdc53b2
TM
1645/*
1646 * flush the inode to disk.
1647 */
1648int nfs_wb_all(struct inode *inode)
34901f70
TM
1649{
1650 struct writeback_control wbc = {
72cb77f4 1651 .sync_mode = WB_SYNC_ALL,
34901f70 1652 .nr_to_write = LONG_MAX,
d7fb1207
TM
1653 .range_start = 0,
1654 .range_end = LLONG_MAX,
34901f70 1655 };
34901f70 1656
acdc53b2 1657 return sync_inode(inode, &wbc);
1c75950b
TM
1658}
1659
1b3b4a1a
TM
1660int nfs_wb_page_cancel(struct inode *inode, struct page *page)
1661{
1662 struct nfs_page *req;
1b3b4a1a
TM
1663 int ret = 0;
1664
1665 BUG_ON(!PageLocked(page));
1666 for (;;) {
ba8b06e6 1667 wait_on_page_writeback(page);
1b3b4a1a
TM
1668 req = nfs_page_find_request(page);
1669 if (req == NULL)
1b3b4a1a 1670 break;
1b3b4a1a 1671 if (nfs_lock_request_dontget(req)) {
8dd37758 1672 nfs_clear_request_commit(req);
1b3b4a1a
TM
1673 nfs_inode_remove_request(req);
1674 /*
1675 * In case nfs_inode_remove_request has marked the
1676 * page as being dirty
1677 */
1678 cancel_dirty_page(page, PAGE_CACHE_SIZE);
1679 nfs_unlock_request(req);
1680 break;
1681 }
1682 ret = nfs_wait_on_request(req);
c9edda71 1683 nfs_release_request(req);
1b3b4a1a 1684 if (ret < 0)
c988950e 1685 break;
1b3b4a1a 1686 }
1b3b4a1a
TM
1687 return ret;
1688}
1689
7f2f12d9
TM
1690/*
1691 * Write back all requests on one page - we do this before reading it.
1692 */
1693int nfs_wb_page(struct inode *inode, struct page *page)
1c75950b
TM
1694{
1695 loff_t range_start = page_offset(page);
1696 loff_t range_end = range_start + (loff_t)(PAGE_CACHE_SIZE - 1);
4d770ccf 1697 struct writeback_control wbc = {
4d770ccf 1698 .sync_mode = WB_SYNC_ALL,
7f2f12d9 1699 .nr_to_write = 0,
4d770ccf
TM
1700 .range_start = range_start,
1701 .range_end = range_end,
1702 };
1703 int ret;
1c75950b 1704
0522f6ad 1705 for (;;) {
ba8b06e6 1706 wait_on_page_writeback(page);
73e3302f
TM
1707 if (clear_page_dirty_for_io(page)) {
1708 ret = nfs_writepage_locked(page, &wbc);
1709 if (ret < 0)
1710 goto out_error;
0522f6ad 1711 continue;
7f2f12d9 1712 }
0522f6ad
TM
1713 if (!PagePrivate(page))
1714 break;
1715 ret = nfs_commit_inode(inode, FLUSH_SYNC);
ba8b06e6 1716 if (ret < 0)
73e3302f 1717 goto out_error;
7f2f12d9 1718 }
73e3302f
TM
1719 return 0;
1720out_error:
4d770ccf 1721 return ret;
1c75950b
TM
1722}
1723
074cc1de
TM
1724#ifdef CONFIG_MIGRATION
1725int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
a6bc32b8 1726 struct page *page, enum migrate_mode mode)
074cc1de 1727{
2da95652
JL
1728 /*
1729 * If PagePrivate is set, then the page is currently associated with
1730 * an in-progress read or write request. Don't try to migrate it.
1731 *
1732 * FIXME: we could do this in principle, but we'll need a way to ensure
1733 * that we can safely release the inode reference while holding
1734 * the page lock.
1735 */
1736 if (PagePrivate(page))
1737 return -EBUSY;
074cc1de 1738
7549ad5f 1739 nfs_fscache_release_page(page, GFP_KERNEL);
074cc1de 1740
a6bc32b8 1741 return migrate_page(mapping, newpage, page, mode);
074cc1de
TM
1742}
1743#endif
1744
f7b422b1 1745int __init nfs_init_writepagecache(void)
1da177e4
LT
1746{
1747 nfs_wdata_cachep = kmem_cache_create("nfs_write_data",
1748 sizeof(struct nfs_write_data),
1749 0, SLAB_HWCACHE_ALIGN,
20c2df83 1750 NULL);
1da177e4
LT
1751 if (nfs_wdata_cachep == NULL)
1752 return -ENOMEM;
1753
93d2341c
MD
1754 nfs_wdata_mempool = mempool_create_slab_pool(MIN_POOL_WRITE,
1755 nfs_wdata_cachep);
1da177e4
LT
1756 if (nfs_wdata_mempool == NULL)
1757 return -ENOMEM;
1758
0b7c0153
FI
1759 nfs_cdata_cachep = kmem_cache_create("nfs_commit_data",
1760 sizeof(struct nfs_commit_data),
1761 0, SLAB_HWCACHE_ALIGN,
1762 NULL);
1763 if (nfs_cdata_cachep == NULL)
1764 return -ENOMEM;
1765
93d2341c
MD
1766 nfs_commit_mempool = mempool_create_slab_pool(MIN_POOL_COMMIT,
1767 nfs_wdata_cachep);
1da177e4
LT
1768 if (nfs_commit_mempool == NULL)
1769 return -ENOMEM;
1770
89a09141
PZ
1771 /*
1772 * NFS congestion size, scale with available memory.
1773 *
1774 * 64MB: 8192k
1775 * 128MB: 11585k
1776 * 256MB: 16384k
1777 * 512MB: 23170k
1778 * 1GB: 32768k
1779 * 2GB: 46340k
1780 * 4GB: 65536k
1781 * 8GB: 92681k
1782 * 16GB: 131072k
1783 *
1784 * This allows larger machines to have larger/more transfers.
1785 * Limit the default to 256M
1786 */
1787 nfs_congestion_kb = (16*int_sqrt(totalram_pages)) << (PAGE_SHIFT-10);
1788 if (nfs_congestion_kb > 256*1024)
1789 nfs_congestion_kb = 256*1024;
1790
1da177e4
LT
1791 return 0;
1792}
1793
266bee88 1794void nfs_destroy_writepagecache(void)
1da177e4
LT
1795{
1796 mempool_destroy(nfs_commit_mempool);
1797 mempool_destroy(nfs_wdata_mempool);
1a1d92c1 1798 kmem_cache_destroy(nfs_wdata_cachep);
1da177e4
LT
1799}
1800