write.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:35k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/nfs/write.c
  3.  *
  4.  * Writing file data over NFS.
  5.  *
  6.  * We do it like this: When a (user) process wishes to write data to an
  7.  * NFS file, a write request is allocated that contains the RPC task data
  8.  * plus some info on the page to be written, and added to the inode's
  9.  * write chain. If the process writes past the end of the page, an async
  10.  * RPC call to write the page is scheduled immediately; otherwise, the call
  11.  * is delayed for a few seconds.
  12.  *
  13.  * Just like readahead, no async I/O is performed if wsize < PAGE_SIZE.
  14.  *
  15.  * Write requests are kept on the inode's writeback list. Each entry in
  16.  * that list references the page (portion) to be written. When the
  17.  * cache timeout has expired, the RPC task is woken up, and tries to
  18.  * lock the page. As soon as it manages to do so, the request is moved
  19.  * from the writeback list to the writelock list.
  20.  *
  21.  * Note: we must make sure never to confuse the inode passed in the
  22.  * write_page request with the one in page->inode. As far as I understand
  23.  * it, these are different when doing a swap-out.
  24.  *
  25.  * To understand everything that goes on here and in the NFS read code,
  26.  * one should be aware that a page is locked in exactly one of the following
  27.  * cases:
  28.  *
  29.  *  - A write request is in progress.
  30.  *  - A user process is in generic_file_write/nfs_update_page
  31.  *  - A user process is in generic_file_read
  32.  *
  33.  * Also note that because of the way pages are invalidated in
  34.  * nfs_revalidate_inode, the following assertions hold:
  35.  *
  36.  *  - If a page is dirty, there will be no read requests (a page will
  37.  * not be re-read unless invalidated by nfs_revalidate_inode).
  38.  *  - If the page is not uptodate, there will be no pending write
  39.  * requests, and no process will be in nfs_update_page.
  40.  *
  41.  * FIXME: Interaction with the vmscan routines is not optimal yet.
  42.  * Either vmscan must be made nfs-savvy, or we need a different page
  43.  * reclaim concept that supports something like FS-independent
  44.  * buffer_heads with a b_ops-> field.
  45.  *
  46.  * Copyright (C) 1996, 1997, Olaf Kirch <okir@monad.swb.de>
  47.  */
  48. #include <linux/config.h>
  49. #include <linux/types.h>
  50. #include <linux/slab.h>
  51. #include <linux/swap.h>
  52. #include <linux/pagemap.h>
  53. #include <linux/file.h>
  54. #include <linux/sunrpc/clnt.h>
  55. #include <linux/nfs_fs.h>
  56. #include <linux/nfs_mount.h>
  57. #include <linux/nfs_flushd.h>
  58. #include <linux/nfs_page.h>
  59. #include <asm/uaccess.h>
  60. #include <linux/smp_lock.h>
  61. #define NFSDBG_FACILITY NFSDBG_PAGECACHE
  62. /*
  63.  * Local structures
  64.  *
  65.  * This is the struct where the WRITE/COMMIT arguments go.
  66.  */
  67. struct nfs_write_data {
  68. struct rpc_task task;
  69. struct inode *inode;
  70. struct rpc_cred *cred;
  71. struct nfs_writeargs args; /* argument struct */
  72. struct nfs_writeres res; /* result struct */
  73. struct nfs_fattr fattr;
  74. struct nfs_writeverf verf;
  75. struct list_head pages; /* Coalesced requests we wish to flush */
  76. struct page *pagevec[NFS_WRITE_MAXIOV];
  77. };
  78. /*
  79.  * Local function declarations
  80.  */
  81. static struct nfs_page * nfs_update_request(struct file*, struct inode *,
  82.     struct page *,
  83.     unsigned int, unsigned int);
  84. static void nfs_strategy(struct inode *inode);
  85. static void nfs_writeback_done(struct rpc_task *);
  86. #ifdef CONFIG_NFS_V3
  87. static void nfs_commit_done(struct rpc_task *);
  88. #endif
  89. /* Hack for future NFS swap support */
  90. #ifndef IS_SWAPFILE
  91. # define IS_SWAPFILE(inode) (0)
  92. #endif
  93. static kmem_cache_t *nfs_wdata_cachep;
  94. static __inline__ struct nfs_write_data *nfs_writedata_alloc(void)
  95. {
  96. struct nfs_write_data *p;
  97. p = kmem_cache_alloc(nfs_wdata_cachep, SLAB_NOFS);
  98. if (p) {
  99. memset(p, 0, sizeof(*p));
  100. INIT_LIST_HEAD(&p->pages);
  101. p->args.pages = p->pagevec;
  102. }
  103. return p;
  104. }
  105. static __inline__ void nfs_writedata_free(struct nfs_write_data *p)
  106. {
  107. kmem_cache_free(nfs_wdata_cachep, p);
  108. }
  109. static void nfs_writedata_release(struct rpc_task *task)
  110. {
  111. struct nfs_write_data *wdata = (struct nfs_write_data *)task->tk_calldata;
  112. nfs_writedata_free(wdata);
  113. }
  114. /*
  115.  * This function will be used to simulate weak cache consistency
  116.  * under NFSv2 when the NFSv3 attribute patch is included.
  117.  * For the moment, we just call nfs_refresh_inode().
  118.  */
  119. static __inline__ int
  120. nfs_write_attributes(struct inode *inode, struct nfs_fattr *fattr)
  121. {
  122. if ((fattr->valid & NFS_ATTR_FATTR) && !(fattr->valid & NFS_ATTR_WCC)) {
  123. fattr->pre_size  = NFS_CACHE_ISIZE(inode);
  124. fattr->pre_mtime = NFS_CACHE_MTIME(inode);
  125. fattr->pre_ctime = NFS_CACHE_CTIME(inode);
  126. fattr->valid |= NFS_ATTR_WCC;
  127. }
  128. return nfs_refresh_inode(inode, fattr);
  129. }
  130. /*
  131.  * Write a page synchronously.
  132.  * Offset is the data offset within the page.
  133.  */
  134. static int
  135. nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page,
  136.    unsigned int offset, unsigned int count)
  137. {
  138. struct rpc_cred *cred = NULL;
  139. loff_t base;
  140. unsigned int wsize = NFS_SERVER(inode)->wsize;
  141. int result, refresh = 0, written = 0, flags;
  142. u8 *buffer;
  143. struct nfs_fattr fattr;
  144. struct nfs_writeverf verf;
  145. if (file)
  146. cred = get_rpccred(nfs_file_cred(file));
  147. if (!cred)
  148. cred = get_rpccred(NFS_I(inode)->mm_cred);
  149. dprintk("NFS:      nfs_writepage_sync(%x/%Ld %d@%Ld)n",
  150. inode->i_dev, (long long)NFS_FILEID(inode),
  151. count, (long long)(page_offset(page) + offset));
  152. base = page_offset(page) + offset;
  153. flags = ((IS_SWAPFILE(inode)) ? NFS_RW_SWAP : 0) | NFS_RW_SYNC;
  154. do {
  155. if (count < wsize && !IS_SWAPFILE(inode))
  156. wsize = count;
  157. result = NFS_PROTO(inode)->write(inode, cred, &fattr, flags,
  158.  offset, wsize, page, &verf);
  159. nfs_write_attributes(inode, &fattr);
  160. if (result < 0) {
  161. /* Must mark the page invalid after I/O error */
  162. ClearPageUptodate(page);
  163. goto io_error;
  164. }
  165. if (result != wsize)
  166. printk("NFS: short write, wsize=%u, result=%dn",
  167. wsize, result);
  168. refresh = 1;
  169. buffer  += wsize;
  170. base    += wsize;
  171.         offset  += wsize;
  172. written += wsize;
  173. count   -= wsize;
  174. /*
  175.  * If we've extended the file, update the inode
  176.  * now so we don't invalidate the cache.
  177.  */
  178. if (base > inode->i_size)
  179. inode->i_size = base;
  180. } while (count);
  181. if (PageError(page))
  182. ClearPageError(page);
  183. io_error:
  184. if (cred)
  185. put_rpccred(cred);
  186. return written? written : result;
  187. }
  188. static int
  189. nfs_writepage_async(struct file *file, struct inode *inode, struct page *page,
  190.     unsigned int offset, unsigned int count)
  191. {
  192. struct nfs_page *req;
  193. loff_t end;
  194. int status;
  195. req = nfs_update_request(file, inode, page, offset, count);
  196. status = (IS_ERR(req)) ? PTR_ERR(req) : 0;
  197. if (status < 0)
  198. goto out;
  199. if (!req->wb_cred)
  200. req->wb_cred = get_rpccred(NFS_I(inode)->mm_cred);
  201. nfs_unlock_request(req);
  202. nfs_strategy(inode);
  203. end = ((loff_t)page->index<<PAGE_CACHE_SHIFT) + (loff_t)(offset + count);
  204. if (inode->i_size < end)
  205. inode->i_size = end;
  206.  out:
  207. return status;
  208. }
  209. /*
  210.  * Write an mmapped page to the server.
  211.  */
  212. int
  213. nfs_writepage(struct page *page)
  214. {
  215. struct inode *inode = page->mapping->host;
  216. unsigned long end_index;
  217. unsigned offset = PAGE_CACHE_SIZE;
  218. int err;
  219. end_index = inode->i_size >> PAGE_CACHE_SHIFT;
  220. /* Ensure we've flushed out any previous writes */
  221. nfs_wb_page(inode,page);
  222. /* easy case */
  223. if (page->index < end_index)
  224. goto do_it;
  225. /* things got complicated... */
  226. offset = inode->i_size & (PAGE_CACHE_SIZE-1);
  227. /* OK, are we completely out? */
  228. err = -EIO;
  229. if (page->index >= end_index+1 || !offset)
  230. goto out;
  231. do_it:
  232. lock_kernel();
  233. if (NFS_SERVER(inode)->wsize >= PAGE_CACHE_SIZE && !IS_SYNC(inode)) {
  234. err = nfs_writepage_async(NULL, inode, page, 0, offset);
  235. if (err >= 0)
  236. err = 0;
  237. } else {
  238. err = nfs_writepage_sync(NULL, inode, page, 0, offset); 
  239. if (err == offset)
  240. err = 0;
  241. }
  242. unlock_kernel();
  243. out:
  244. UnlockPage(page);
  245. return err; 
  246. }
  247. /*
  248.  * Check whether the file range we want to write to is locked by
  249.  * us.
  250.  */
  251. static int
  252. region_locked(struct inode *inode, struct nfs_page *req)
  253. {
  254. struct file_lock *fl;
  255. loff_t rqstart, rqend;
  256. /* Don't optimize writes if we don't use NLM */
  257. if (NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM)
  258. return 0;
  259. rqstart = page_offset(req->wb_page) + req->wb_offset;
  260. rqend = rqstart + req->wb_bytes;
  261. for (fl = inode->i_flock; fl; fl = fl->fl_next) {
  262. if (fl->fl_owner == current->files && (fl->fl_flags & FL_POSIX)
  263.     && fl->fl_type == F_WRLCK
  264.     && fl->fl_start <= rqstart && rqend <= fl->fl_end) {
  265. return 1;
  266. }
  267. }
  268. return 0;
  269. }
  270. /*
  271.  * Insert a write request into an inode
  272.  * Note: we sort the list in order to be able to optimize nfs_find_request()
  273.  *  & co. for the 'write append' case. For 2.5 we may want to consider
  274.  *  some form of hashing so as to perform well on random writes.
  275.  */
  276. static inline void
  277. nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
  278. {
  279. struct list_head *pos, *head;
  280. unsigned long pg_idx = page_index(req->wb_page);
  281. if (!list_empty(&req->wb_hash))
  282. return;
  283. if (!NFS_WBACK_BUSY(req))
  284. printk(KERN_ERR "NFS: unlocked request attempted hashed!n");
  285. head = &inode->u.nfs_i.writeback;
  286. if (list_empty(head))
  287. igrab(inode);
  288. list_for_each_prev(pos, head) {
  289. struct nfs_page *entry = nfs_inode_wb_entry(pos);
  290. if (page_index(entry->wb_page) < pg_idx)
  291. break;
  292. }
  293. inode->u.nfs_i.npages++;
  294. list_add(&req->wb_hash, pos);
  295. req->wb_count++;
  296. }
  297. /*
  298.  * Insert a write request into an inode
  299.  */
  300. static inline void
  301. nfs_inode_remove_request(struct nfs_page *req)
  302. {
  303. struct inode *inode;
  304. spin_lock(&nfs_wreq_lock);
  305. if (list_empty(&req->wb_hash)) {
  306. spin_unlock(&nfs_wreq_lock);
  307. return;
  308. }
  309. if (!NFS_WBACK_BUSY(req))
  310. printk(KERN_ERR "NFS: unlocked request attempted unhashed!n");
  311. inode = req->wb_inode;
  312. list_del(&req->wb_hash);
  313. INIT_LIST_HEAD(&req->wb_hash);
  314. inode->u.nfs_i.npages--;
  315. if ((inode->u.nfs_i.npages == 0) != list_empty(&inode->u.nfs_i.writeback))
  316. printk(KERN_ERR "NFS: desynchronized value of nfs_i.npages.n");
  317. if (list_empty(&inode->u.nfs_i.writeback)) {
  318. spin_unlock(&nfs_wreq_lock);
  319. iput(inode);
  320. } else
  321. spin_unlock(&nfs_wreq_lock);
  322. nfs_clear_request(req);
  323. nfs_release_request(req);
  324. }
  325. /*
  326.  * Find a request
  327.  */
  328. static inline struct nfs_page *
  329. _nfs_find_request(struct inode *inode, struct page *page)
  330. {
  331. struct list_head *head, *pos;
  332. unsigned long pg_idx = page_index(page);
  333. head = &inode->u.nfs_i.writeback;
  334. list_for_each_prev(pos, head) {
  335. struct nfs_page *req = nfs_inode_wb_entry(pos);
  336. unsigned long found_idx = page_index(req->wb_page);
  337. if (pg_idx < found_idx)
  338. continue;
  339. if (pg_idx != found_idx)
  340. break;
  341. req->wb_count++;
  342. return req;
  343. }
  344. return NULL;
  345. }
  346. static struct nfs_page *
  347. nfs_find_request(struct inode *inode, struct page *page)
  348. {
  349. struct nfs_page *req;
  350. spin_lock(&nfs_wreq_lock);
  351. req = _nfs_find_request(inode, page);
  352. spin_unlock(&nfs_wreq_lock);
  353. return req;
  354. }
  355. /*
  356.  * Add a request to the inode's dirty list.
  357.  */
  358. static inline void
  359. nfs_mark_request_dirty(struct nfs_page *req)
  360. {
  361. struct inode *inode = req->wb_inode;
  362. spin_lock(&nfs_wreq_lock);
  363. nfs_list_add_request(req, &inode->u.nfs_i.dirty);
  364. inode->u.nfs_i.ndirty++;
  365. __nfs_del_lru(req);
  366. __nfs_add_lru(&NFS_SERVER(inode)->lru_dirty, req);
  367. spin_unlock(&nfs_wreq_lock);
  368. mark_inode_dirty(inode);
  369. }
  370. /*
  371.  * Check if a request is dirty
  372.  */
  373. static inline int
  374. nfs_dirty_request(struct nfs_page *req)
  375. {
  376. struct inode *inode = req->wb_inode;
  377. return !list_empty(&req->wb_list) && req->wb_list_head == &inode->u.nfs_i.dirty;
  378. }
  379. #ifdef CONFIG_NFS_V3
  380. /*
  381.  * Add a request to the inode's commit list.
  382.  */
  383. static inline void
  384. nfs_mark_request_commit(struct nfs_page *req)
  385. {
  386. struct inode *inode = req->wb_inode;
  387. spin_lock(&nfs_wreq_lock);
  388. nfs_list_add_request(req, &inode->u.nfs_i.commit);
  389. inode->u.nfs_i.ncommit++;
  390. __nfs_del_lru(req);
  391. __nfs_add_lru(&NFS_SERVER(inode)->lru_commit, req);
  392. spin_unlock(&nfs_wreq_lock);
  393. mark_inode_dirty(inode);
  394. }
  395. #endif
  396. /*
  397.  * Wait for a request to complete.
  398.  *
  399.  * Interruptible by signals only if mounted with intr flag.
  400.  */
  401. static int
  402. nfs_wait_on_requests(struct inode *inode, struct file *file, unsigned long idx_start, unsigned int npages)
  403. {
  404. struct list_head *p, *head;
  405. unsigned long idx_end;
  406. unsigned int res = 0;
  407. int error;
  408. if (npages == 0)
  409. idx_end = ~0;
  410. else
  411. idx_end = idx_start + npages - 1;
  412. head = &inode->u.nfs_i.writeback;
  413.  restart:
  414. spin_lock(&nfs_wreq_lock);
  415. list_for_each_prev(p, head) {
  416. unsigned long pg_idx;
  417. struct nfs_page *req = nfs_inode_wb_entry(p);
  418. if (file && req->wb_file != file)
  419. continue;
  420. pg_idx = page_index(req->wb_page);
  421. if (pg_idx < idx_start)
  422. break;
  423. if (pg_idx > idx_end)
  424. continue;
  425. if (!NFS_WBACK_BUSY(req))
  426. continue;
  427. req->wb_count++;
  428. spin_unlock(&nfs_wreq_lock);
  429. error = nfs_wait_on_request(req);
  430. nfs_release_request(req);
  431. if (error < 0)
  432. return error;
  433. res++;
  434. goto restart;
  435. }
  436. spin_unlock(&nfs_wreq_lock);
  437. return res;
  438. }
  439. /**
  440.  * nfs_scan_lru_dirty_timeout - Scan LRU list for timed out dirty requests
  441.  * @server: NFS superblock data
  442.  * @dst: destination list
  443.  *
  444.  * Moves a maximum of 'wpages' requests from the NFS dirty page LRU list.
  445.  * The elements are checked to ensure that they form a contiguous set
  446.  * of pages, and that they originated from the same file.
  447.  */
  448. int
  449. nfs_scan_lru_dirty_timeout(struct nfs_server *server, struct list_head *dst)
  450. {
  451. struct inode *inode;
  452. int npages;
  453. npages = nfs_scan_lru_timeout(&server->lru_dirty, dst, server->wpages);
  454. if (npages) {
  455. inode = nfs_list_entry(dst->next)->wb_inode;
  456. inode->u.nfs_i.ndirty -= npages;
  457. }
  458. return npages;
  459. }
  460. /**
  461.  * nfs_scan_lru_dirty - Scan LRU list for dirty requests
  462.  * @server: NFS superblock data
  463.  * @dst: destination list
  464.  *
  465.  * Moves a maximum of 'wpages' requests from the NFS dirty page LRU list.
  466.  * The elements are checked to ensure that they form a contiguous set
  467.  * of pages, and that they originated from the same file.
  468.  */
  469. int
  470. nfs_scan_lru_dirty(struct nfs_server *server, struct list_head *dst)
  471. {
  472. struct inode *inode;
  473. int npages;
  474. npages = nfs_scan_lru(&server->lru_dirty, dst, server->wpages);
  475. if (npages) {
  476. inode = nfs_list_entry(dst->next)->wb_inode;
  477. inode->u.nfs_i.ndirty -= npages;
  478. }
  479. return npages;
  480. }
  481. /*
  482.  * nfs_scan_dirty - Scan an inode for dirty requests
  483.  * @inode: NFS inode to scan
  484.  * @dst: destination list
  485.  * @file: if set, ensure we match requests from this file
  486.  * @idx_start: lower bound of page->index to scan.
  487.  * @npages: idx_start + npages sets the upper bound to scan.
  488.  *
  489.  * Moves requests from the inode's dirty page list.
  490.  * The requests are *not* checked to ensure that they form a contiguous set.
  491.  */
  492. static int
  493. nfs_scan_dirty(struct inode *inode, struct list_head *dst, struct file *file, unsigned long idx_start, unsigned int npages)
  494. {
  495. int res;
  496. res = nfs_scan_list(&inode->u.nfs_i.dirty, dst, file, idx_start, npages);
  497. inode->u.nfs_i.ndirty -= res;
  498. if ((inode->u.nfs_i.ndirty == 0) != list_empty(&inode->u.nfs_i.dirty))
  499. printk(KERN_ERR "NFS: desynchronized value of nfs_i.ndirty.n");
  500. return res;
  501. }
  502. #ifdef CONFIG_NFS_V3
  503. /**
  504.  * nfs_scan_lru_commit_timeout - Scan LRU list for timed out commit requests
  505.  * @server: NFS superblock data
  506.  * @dst: destination list
  507.  *
  508.  * Finds the first a timed out request in the NFS commit LRU list and moves it
  509.  * to the list dst. If such an element is found, we move all other commit
  510.  * requests that apply to the same inode.
  511.  * The assumption is that doing everything in a single commit-to-disk is
  512.  * the cheaper alternative.
  513.  */
  514. int
  515. nfs_scan_lru_commit_timeout(struct nfs_server *server, struct list_head *dst)
  516. {
  517. struct inode *inode;
  518. int npages;
  519. npages = nfs_scan_lru_timeout(&server->lru_commit, dst, 1);
  520. if (npages) {
  521. inode = nfs_list_entry(dst->next)->wb_inode;
  522. npages += nfs_scan_list(&inode->u.nfs_i.commit, dst, NULL, 0, 0);
  523. inode->u.nfs_i.ncommit -= npages;
  524. }
  525. return npages;
  526. }
  527. /**
  528.  * nfs_scan_lru_commit_timeout - Scan LRU list for timed out commit requests
  529.  * @server: NFS superblock data
  530.  * @dst: destination list
  531.  *
  532.  * Finds the first request in the NFS commit LRU list and moves it
  533.  * to the list dst. If such an element is found, we move all other commit
  534.  * requests that apply to the same inode.
  535.  * The assumption is that doing everything in a single commit-to-disk is
  536.  * the cheaper alternative.
  537.  */
  538. int
  539. nfs_scan_lru_commit(struct nfs_server *server, struct list_head *dst)
  540. {
  541. struct inode *inode;
  542. int npages;
  543. npages = nfs_scan_lru(&server->lru_commit, dst, 1);
  544. if (npages) {
  545. inode = nfs_list_entry(dst->next)->wb_inode;
  546. npages += nfs_scan_list(&inode->u.nfs_i.commit, dst, NULL, 0, 0);
  547. inode->u.nfs_i.ncommit -= npages;
  548. }
  549. return npages;
  550. }
  551. /*
  552.  * nfs_scan_commit - Scan an inode for commit requests
  553.  * @inode: NFS inode to scan
  554.  * @dst: destination list
  555.  * @file: if set, ensure we collect requests from this file only.
  556.  * @idx_start: lower bound of page->index to scan.
  557.  * @npages: idx_start + npages sets the upper bound to scan.
  558.  *
  559.  * Moves requests from the inode's 'commit' request list.
  560.  * The requests are *not* checked to ensure that they form a contiguous set.
  561.  */
  562. static int
  563. nfs_scan_commit(struct inode *inode, struct list_head *dst, struct file *file, unsigned long idx_start, unsigned int npages)
  564. {
  565. int res;
  566. res = nfs_scan_list(&inode->u.nfs_i.commit, dst, file, idx_start, npages);
  567. inode->u.nfs_i.ncommit -= res;
  568. if ((inode->u.nfs_i.ncommit == 0) != list_empty(&inode->u.nfs_i.commit))
  569. printk(KERN_ERR "NFS: desynchronized value of nfs_i.ncommit.n");
  570. return res;
  571. }
  572. #endif
  573. /*
  574.  * Try to update any existing write request, or create one if there is none.
  575.  * In order to match, the request's credentials must match those of
  576.  * the calling process.
  577.  *
  578.  * Note: Should always be called with the Page Lock held!
  579.  */
  580. static struct nfs_page *
  581. nfs_update_request(struct file* file, struct inode *inode, struct page *page,
  582.    unsigned int offset, unsigned int bytes)
  583. {
  584. struct nfs_page *req, *new = NULL;
  585. unsigned long rqend, end;
  586. end = offset + bytes;
  587. for (;;) {
  588. /* Loop over all inode entries and see if we find
  589.  * A request for the page we wish to update
  590.  */
  591. spin_lock(&nfs_wreq_lock);
  592. req = _nfs_find_request(inode, page);
  593. if (req) {
  594. if (!nfs_lock_request_dontget(req)) {
  595. int error;
  596. spin_unlock(&nfs_wreq_lock);
  597. error = nfs_wait_on_request(req);
  598. nfs_release_request(req);
  599. if (error < 0)
  600. return ERR_PTR(error);
  601. continue;
  602. }
  603. spin_unlock(&nfs_wreq_lock);
  604. if (new)
  605. nfs_release_request(new);
  606. break;
  607. }
  608. if (new) {
  609. nfs_lock_request_dontget(new);
  610. nfs_inode_add_request(inode, new);
  611. spin_unlock(&nfs_wreq_lock);
  612. nfs_mark_request_dirty(new);
  613. return new;
  614. }
  615. spin_unlock(&nfs_wreq_lock);
  616. new = nfs_create_request(nfs_file_cred(file), inode, page, offset, bytes);
  617. if (IS_ERR(new))
  618. return new;
  619. if (file) {
  620. new->wb_file = file;
  621. get_file(file);
  622. }
  623. /* If the region is locked, adjust the timeout */
  624. if (region_locked(inode, new))
  625. new->wb_timeout = jiffies + NFS_WRITEBACK_LOCKDELAY;
  626. else
  627. new->wb_timeout = jiffies + NFS_WRITEBACK_DELAY;
  628. }
  629. /* We have a request for our page.
  630.  * If the creds don't match, or the
  631.  * page addresses don't match,
  632.  * tell the caller to wait on the conflicting
  633.  * request.
  634.  */
  635. rqend = req->wb_offset + req->wb_bytes;
  636. if (req->wb_file != file
  637.     || req->wb_page != page
  638.     || !nfs_dirty_request(req)
  639.     || offset > rqend || end < req->wb_offset) {
  640. nfs_unlock_request(req);
  641. return ERR_PTR(-EBUSY);
  642. }
  643. /* Okay, the request matches. Update the region */
  644. if (offset < req->wb_offset) {
  645. req->wb_offset = offset;
  646. req->wb_bytes = rqend - req->wb_offset;
  647. }
  648. if (end > rqend)
  649. req->wb_bytes = end - req->wb_offset;
  650. return req;
  651. }
  652. /*
  653.  * This is the strategy routine for NFS.
  654.  * It is called by nfs_updatepage whenever the user wrote up to the end
  655.  * of a page.
  656.  *
  657.  * We always try to submit a set of requests in parallel so that the
  658.  * server's write code can gather writes. This is mainly for the benefit
  659.  * of NFSv2.
  660.  *
  661.  * We never submit more requests than we think the remote can handle.
  662.  * For UDP sockets, we make sure we don't exceed the congestion window;
  663.  * for TCP, we limit the number of requests to 8.
  664.  *
  665.  * NFS_STRATEGY_PAGES gives the minimum number of requests for NFSv2 that
  666.  * should be sent out in one go. This is for the benefit of NFSv2 servers
  667.  * that perform write gathering.
  668.  *
  669.  * FIXME: Different servers may have different sweet spots.
  670.  * Record the average congestion window in server struct?
  671.  */
  672. #define NFS_STRATEGY_PAGES      8
  673. static void
  674. nfs_strategy(struct inode *inode)
  675. {
  676. unsigned int dirty, wpages;
  677. dirty  = inode->u.nfs_i.ndirty;
  678. wpages = NFS_SERVER(inode)->wpages;
  679. #ifdef CONFIG_NFS_V3
  680. if (NFS_PROTO(inode)->version == 2) {
  681. if (dirty >= NFS_STRATEGY_PAGES * wpages)
  682. nfs_flush_file(inode, NULL, 0, 0, 0);
  683. } else if (dirty >= wpages)
  684. nfs_flush_file(inode, NULL, 0, 0, 0);
  685. #else
  686. if (dirty >= NFS_STRATEGY_PAGES * wpages)
  687. nfs_flush_file(inode, NULL, 0, 0, 0);
  688. #endif
  689. }
  690. int
  691. nfs_flush_incompatible(struct file *file, struct page *page)
  692. {
  693. struct rpc_cred *cred = nfs_file_cred(file);
  694. struct inode *inode = page->mapping->host;
  695. struct nfs_page *req;
  696. int status = 0;
  697. /*
  698.  * Look for a request corresponding to this page. If there
  699.  * is one, and it belongs to another file, we flush it out
  700.  * before we try to copy anything into the page. Do this
  701.  * due to the lack of an ACCESS-type call in NFSv2.
  702.  * Also do the same if we find a request from an existing
  703.  * dropped page.
  704.  */
  705. req = nfs_find_request(inode,page);
  706. if (req) {
  707. if (req->wb_file != file || req->wb_cred != cred || req->wb_page != page)
  708. status = nfs_wb_page(inode, page);
  709. nfs_release_request(req);
  710. }
  711. return (status < 0) ? status : 0;
  712. }
  713. /*
  714.  * Update and possibly write a cached page of an NFS file.
  715.  *
  716.  * XXX: Keep an eye on generic_file_read to make sure it doesn't do bad
  717.  * things with a page scheduled for an RPC call (e.g. invalidate it).
  718.  */
  719. int
  720. nfs_updatepage(struct file *file, struct page *page, unsigned int offset, unsigned int count)
  721. {
  722. struct dentry *dentry = file->f_dentry;
  723. struct inode *inode = page->mapping->host;
  724. struct nfs_page *req;
  725. loff_t end;
  726. int status = 0;
  727. dprintk("NFS:      nfs_updatepage(%s/%s %d@%Ld)n",
  728. dentry->d_parent->d_name.name, dentry->d_name.name,
  729. count, (long long)(page_offset(page) +offset));
  730. /*
  731.  * If wsize is smaller than page size, update and write
  732.  * page synchronously.
  733.  */
  734. if (NFS_SERVER(inode)->wsize < PAGE_CACHE_SIZE || IS_SYNC(inode))
  735. return nfs_writepage_sync(file, inode, page, offset, count);
  736. /*
  737.  * Try to find an NFS request corresponding to this page
  738.  * and update it.
  739.  * If the existing request cannot be updated, we must flush
  740.  * it out now.
  741.  */
  742. do {
  743. req = nfs_update_request(file, inode, page, offset, count);
  744. status = (IS_ERR(req)) ? PTR_ERR(req) : 0;
  745. if (status != -EBUSY)
  746. break;
  747. /* Request could not be updated. Flush it out and try again */
  748. status = nfs_wb_page(inode, page);
  749. } while (status >= 0);
  750. if (status < 0)
  751. goto done;
  752. status = 0;
  753. end = ((loff_t)page->index<<PAGE_CACHE_SHIFT) + (loff_t)(offset + count);
  754. if (inode->i_size < end)
  755. inode->i_size = end;
  756. /* If we wrote past the end of the page.
  757.  * Call the strategy routine so it can send out a bunch
  758.  * of requests.
  759.  */
  760. if (req->wb_offset == 0 && req->wb_bytes == PAGE_CACHE_SIZE) {
  761. SetPageUptodate(page);
  762. nfs_unlock_request(req);
  763. nfs_strategy(inode);
  764. } else
  765. nfs_unlock_request(req);
  766. done:
  767.         dprintk("NFS:      nfs_updatepage returns %d (isize %Ld)n",
  768.                                                 status, (long long)inode->i_size);
  769. if (status < 0)
  770. ClearPageUptodate(page);
  771. return status;
  772. }
  773. /*
  774.  * Set up the argument/result storage required for the RPC call.
  775.  */
  776. static void
  777. nfs_write_rpcsetup(struct list_head *head, struct nfs_write_data *data)
  778. {
  779. struct nfs_page *req;
  780. struct page **pages;
  781. unsigned int count;
  782. /* Set up the RPC argument and reply structs
  783.  * NB: take care not to mess about with data->commit et al. */
  784. pages = data->args.pages;
  785. count = 0;
  786. while (!list_empty(head)) {
  787. struct nfs_page *req = nfs_list_entry(head->next);
  788. nfs_list_remove_request(req);
  789. nfs_list_add_request(req, &data->pages);
  790. *pages++ = req->wb_page;
  791. count += req->wb_bytes;
  792. }
  793. req = nfs_list_entry(data->pages.next);
  794. data->inode = req->wb_inode;
  795. data->cred = req->wb_cred;
  796. data->args.fh     = NFS_FH(req->wb_inode);
  797. data->args.offset = page_offset(req->wb_page) + req->wb_offset;
  798. data->args.pgbase = req->wb_offset;
  799. data->args.count  = count;
  800. data->res.fattr   = &data->fattr;
  801. data->res.count   = count;
  802. data->res.verf    = &data->verf;
  803. }
  804. /*
  805.  * Create an RPC task for the given write request and kick it.
  806.  * The page must have been locked by the caller.
  807.  *
  808.  * It may happen that the page we're passed is not marked dirty.
  809.  * This is the case if nfs_updatepage detects a conflicting request
  810.  * that has been written but not committed.
  811.  */
  812. static int
  813. nfs_flush_one(struct list_head *head, struct inode *inode, int how)
  814. {
  815. struct rpc_clnt  *clnt = NFS_CLIENT(inode);
  816. struct nfs_write_data *data;
  817. struct rpc_task *task;
  818. struct rpc_message msg;
  819. int                     flags,
  820. nfsvers = NFS_PROTO(inode)->version,
  821. async = !(how & FLUSH_SYNC),
  822. stable = (how & FLUSH_STABLE);
  823. sigset_t oldset;
  824. data = nfs_writedata_alloc();
  825. if (!data)
  826. goto out_bad;
  827. task = &data->task;
  828. /* Set the initial flags for the task.  */
  829. flags = (async) ? RPC_TASK_ASYNC : 0;
  830. /* Set up the argument struct */
  831. nfs_write_rpcsetup(head, data);
  832. if (nfsvers < 3)
  833. data->args.stable = NFS_FILE_SYNC;
  834. else if (stable) {
  835. if (!inode->u.nfs_i.ncommit)
  836. data->args.stable = NFS_FILE_SYNC;
  837. else
  838. data->args.stable = NFS_DATA_SYNC;
  839. } else
  840. data->args.stable = NFS_UNSTABLE;
  841. /* Finalize the task. */
  842. rpc_init_task(task, clnt, nfs_writeback_done, flags);
  843. task->tk_calldata = data;
  844. /* Release requests */
  845. task->tk_release = nfs_writedata_release;
  846. #ifdef CONFIG_NFS_V3
  847. msg.rpc_proc = (nfsvers == 3) ? NFS3PROC_WRITE : NFSPROC_WRITE;
  848. #else
  849. msg.rpc_proc = NFSPROC_WRITE;
  850. #endif
  851. msg.rpc_argp = &data->args;
  852. msg.rpc_resp = &data->res;
  853. msg.rpc_cred = data->cred;
  854. dprintk("NFS: %4d initiated write call (req %x/%Ld count %u)n",
  855. task->tk_pid, 
  856. inode->i_dev,
  857. (long long)NFS_FILEID(inode),
  858. data->args.count);
  859. rpc_clnt_sigmask(clnt, &oldset);
  860. rpc_call_setup(task, &msg, 0);
  861. lock_kernel();
  862. rpc_execute(task);
  863. unlock_kernel();
  864. rpc_clnt_sigunmask(clnt, &oldset);
  865. return 0;
  866.  out_bad:
  867. while (!list_empty(head)) {
  868. struct nfs_page *req = nfs_list_entry(head->next);
  869. nfs_list_remove_request(req);
  870. nfs_mark_request_dirty(req);
  871. nfs_unlock_request(req);
  872. }
  873. return -ENOMEM;
  874. }
  875. int
  876. nfs_flush_list(struct list_head *head, int wpages, int how)
  877. {
  878. LIST_HEAD(one_request);
  879. struct nfs_page *req;
  880. int error = 0;
  881. unsigned int pages = 0;
  882. while (!list_empty(head)) {
  883. pages += nfs_coalesce_requests(head, &one_request, wpages);
  884. req = nfs_list_entry(one_request.next);
  885. error = nfs_flush_one(&one_request, req->wb_inode, how);
  886. if (error < 0)
  887. break;
  888. }
  889. if (error >= 0)
  890. return pages;
  891. while (!list_empty(head)) {
  892. req = nfs_list_entry(head->next);
  893. nfs_list_remove_request(req);
  894. nfs_mark_request_dirty(req);
  895. nfs_unlock_request(req);
  896. }
  897. return error;
  898. }
  899. /*
  900.  * This function is called when the WRITE call is complete.
  901.  */
  902. static void
  903. nfs_writeback_done(struct rpc_task *task)
  904. {
  905. struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata;
  906. struct nfs_writeargs *argp = &data->args;
  907. struct nfs_writeres *resp = &data->res;
  908. struct inode *inode = data->inode;
  909. struct nfs_page *req;
  910. struct page *page;
  911. dprintk("NFS: %4d nfs_writeback_done (status %d)n",
  912. task->tk_pid, task->tk_status);
  913. if (nfs_async_handle_jukebox(task))
  914. return;
  915. /* We can't handle that yet but we check for it nevertheless */
  916. if (resp->count < argp->count && task->tk_status >= 0) {
  917. static unsigned long    complain;
  918. if (time_before(complain, jiffies)) {
  919. printk(KERN_WARNING
  920.        "NFS: Server wrote less than requested.n");
  921. complain = jiffies + 300 * HZ;
  922. }
  923. /* Can't do anything about it right now except throw
  924.  * an error. */
  925. task->tk_status = -EIO;
  926. }
  927. #ifdef CONFIG_NFS_V3
  928. if (resp->verf->committed < argp->stable && task->tk_status >= 0) {
  929. /* We tried a write call, but the server did not
  930.  * commit data to stable storage even though we
  931.  * requested it.
  932.  * Note: There is a known bug in Tru64 < 5.0 in which
  933.  *  the server reports NFS_DATA_SYNC, but performs
  934.  *  NFS_FILE_SYNC. We therefore implement this checking
  935.  *  as a dprintk() in order to avoid filling syslog.
  936.  */
  937. static unsigned long    complain;
  938. if (time_before(complain, jiffies)) {
  939. dprintk("NFS: faulty NFSv3 server %s:"
  940. " (committed = %d) != (stable = %d)n",
  941. NFS_SERVER(inode)->hostname,
  942. resp->verf->committed, argp->stable);
  943. complain = jiffies + 300 * HZ;
  944. }
  945. }
  946. #endif
  947. /*
  948.  * Update attributes as result of writeback.
  949.  * FIXME: There is an inherent race with invalidate_inode_pages and
  950.  *   writebacks since the page->count is kept > 1 for as long
  951.  *   as the page has a write request pending.
  952.  */
  953. nfs_write_attributes(inode, resp->fattr);
  954. while (!list_empty(&data->pages)) {
  955. req = nfs_list_entry(data->pages.next);
  956. nfs_list_remove_request(req);
  957. page = req->wb_page;
  958. dprintk("NFS: write (%x/%Ld %d@%Ld)",
  959. req->wb_inode->i_dev,
  960. (long long)NFS_FILEID(req->wb_inode),
  961. req->wb_bytes,
  962. (long long)(page_offset(page) + req->wb_offset));
  963. if (task->tk_status < 0) {
  964. ClearPageUptodate(page);
  965. SetPageError(page);
  966. if (req->wb_file)
  967. req->wb_file->f_error = task->tk_status;
  968. nfs_inode_remove_request(req);
  969. dprintk(", error = %dn", task->tk_status);
  970. goto next;
  971. }
  972. #ifdef CONFIG_NFS_V3
  973. if (argp->stable != NFS_UNSTABLE || resp->verf->committed == NFS_FILE_SYNC) {
  974. nfs_inode_remove_request(req);
  975. dprintk(" OKn");
  976. goto next;
  977. }
  978. memcpy(&req->wb_verf, resp->verf, sizeof(req->wb_verf));
  979. req->wb_timeout = jiffies + NFS_COMMIT_DELAY;
  980. nfs_mark_request_commit(req);
  981. dprintk(" marked for commitn");
  982. #else
  983. nfs_inode_remove_request(req);
  984. #endif
  985. next:
  986. nfs_unlock_request(req);
  987. }
  988. }
  989. #ifdef CONFIG_NFS_V3
  990. /*
  991.  * Set up the argument/result storage required for the RPC call.
  992.  */
  993. static void
  994. nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data)
  995. {
  996. struct nfs_page *first, *last;
  997. struct inode *inode;
  998. loff_t start, end, len;
  999. /* Set up the RPC argument and reply structs
  1000.  * NB: take care not to mess about with data->commit et al. */
  1001. list_splice(head, &data->pages);
  1002. INIT_LIST_HEAD(head);
  1003. first = nfs_list_entry(data->pages.next);
  1004. last = nfs_list_entry(data->pages.prev);
  1005. inode = first->wb_inode;
  1006. /*
  1007.  * Determine the offset range of requests in the COMMIT call.
  1008.  * We rely on the fact that data->pages is an ordered list...
  1009.  */
  1010. start = page_offset(first->wb_page) + first->wb_offset;
  1011. end = page_offset(last->wb_page) + (last->wb_offset + last->wb_bytes);
  1012. len = end - start;
  1013. /* If 'len' is not a 32-bit quantity, pass '0' in the COMMIT call */
  1014. if (end >= inode->i_size || len < 0 || len > (~((u32)0) >> 1))
  1015. len = 0;
  1016. data->inode   = inode;
  1017. data->cred   = first->wb_cred;
  1018. data->args.fh     = NFS_FH(inode);
  1019. data->args.offset = start;
  1020. data->res.count   = data->args.count = (u32)len;
  1021. data->res.fattr   = &data->fattr;
  1022. data->res.verf    = &data->verf;
  1023. }
  1024. /*
  1025.  * Commit dirty pages
  1026.  */
  1027. int
  1028. nfs_commit_list(struct list_head *head, int how)
  1029. {
  1030. struct rpc_message msg;
  1031. struct rpc_clnt *clnt;
  1032. struct nfs_write_data *data;
  1033. struct rpc_task         *task;
  1034. struct nfs_page         *req;
  1035. int                     flags,
  1036. async = !(how & FLUSH_SYNC);
  1037. sigset_t oldset;
  1038. data = nfs_writedata_alloc();
  1039. if (!data)
  1040. goto out_bad;
  1041. task = &data->task;
  1042. flags = (async) ? RPC_TASK_ASYNC : 0;
  1043. /* Set up the argument struct */
  1044. nfs_commit_rpcsetup(head, data);
  1045. req = nfs_list_entry(data->pages.next);
  1046. clnt = NFS_CLIENT(req->wb_inode);
  1047. rpc_init_task(task, clnt, nfs_commit_done, flags);
  1048. task->tk_calldata = data;
  1049. /* Release requests */
  1050. task->tk_release = nfs_writedata_release;
  1051. msg.rpc_proc = NFS3PROC_COMMIT;
  1052. msg.rpc_argp = &data->args;
  1053. msg.rpc_resp = &data->res;
  1054. msg.rpc_cred = data->cred;
  1055. dprintk("NFS: %4d initiated commit calln", task->tk_pid);
  1056. rpc_clnt_sigmask(clnt, &oldset);
  1057. rpc_call_setup(task, &msg, 0);
  1058. lock_kernel();
  1059. rpc_execute(task);
  1060. unlock_kernel();
  1061. rpc_clnt_sigunmask(clnt, &oldset);
  1062. return 0;
  1063.  out_bad:
  1064. while (!list_empty(head)) {
  1065. req = nfs_list_entry(head->next);
  1066. nfs_list_remove_request(req);
  1067. nfs_mark_request_commit(req);
  1068. nfs_unlock_request(req);
  1069. }
  1070. return -ENOMEM;
  1071. }
  1072. /*
  1073.  * COMMIT call returned
  1074.  */
  1075. static void
  1076. nfs_commit_done(struct rpc_task *task)
  1077. {
  1078. struct nfs_write_data *data = (struct nfs_write_data *)task->tk_calldata;
  1079. struct nfs_writeres *resp = &data->res;
  1080. struct nfs_page *req;
  1081. struct inode *inode = data->inode;
  1082.         dprintk("NFS: %4d nfs_commit_done (status %d)n",
  1083.                                 task->tk_pid, task->tk_status);
  1084. if (nfs_async_handle_jukebox(task))
  1085. return;
  1086. nfs_write_attributes(inode, resp->fattr);
  1087. while (!list_empty(&data->pages)) {
  1088. req = nfs_list_entry(data->pages.next);
  1089. nfs_list_remove_request(req);
  1090. dprintk("NFS: commit (%x/%Ld %d@%Ld)",
  1091. req->wb_inode->i_dev,
  1092. (long long)NFS_FILEID(req->wb_inode),
  1093. req->wb_bytes,
  1094. (long long)(page_offset(req->wb_page) + req->wb_offset));
  1095. if (task->tk_status < 0) {
  1096. if (req->wb_file)
  1097. req->wb_file->f_error = task->tk_status;
  1098. nfs_inode_remove_request(req);
  1099. dprintk(", error = %dn", task->tk_status);
  1100. goto next;
  1101. }
  1102. /* Okay, COMMIT succeeded, apparently. Check the verifier
  1103.  * returned by the server against all stored verfs. */
  1104. if (!memcmp(req->wb_verf.verifier, data->verf.verifier, sizeof(data->verf.verifier))) {
  1105. /* We have a match */
  1106. nfs_inode_remove_request(req);
  1107. dprintk(" OKn");
  1108. goto next;
  1109. }
  1110. /* We have a mismatch. Write the page again */
  1111. dprintk(" mismatchn");
  1112. nfs_mark_request_dirty(req);
  1113. next:
  1114. nfs_unlock_request(req);
  1115. }
  1116. }
  1117. #endif
  1118. int nfs_flush_file(struct inode *inode, struct file *file, unsigned long idx_start,
  1119.    unsigned int npages, int how)
  1120. {
  1121. LIST_HEAD(head);
  1122. int res,
  1123. error = 0;
  1124. spin_lock(&nfs_wreq_lock);
  1125. res = nfs_scan_dirty(inode, &head, file, idx_start, npages);
  1126. spin_unlock(&nfs_wreq_lock);
  1127. if (res)
  1128. error = nfs_flush_list(&head, NFS_SERVER(inode)->wpages, how);
  1129. if (error < 0)
  1130. return error;
  1131. return res;
  1132. }
  1133. #ifdef CONFIG_NFS_V3
  1134. int nfs_commit_file(struct inode *inode, struct file *file, unsigned long idx_start,
  1135.     unsigned int npages, int how)
  1136. {
  1137. LIST_HEAD(head);
  1138. int res,
  1139. error = 0;
  1140. spin_lock(&nfs_wreq_lock);
  1141. res = nfs_scan_commit(inode, &head, file, idx_start, npages);
  1142. spin_unlock(&nfs_wreq_lock);
  1143. if (res)
  1144. error = nfs_commit_list(&head, how);
  1145. if (error < 0)
  1146. return error;
  1147. return res;
  1148. }
  1149. #endif
  1150. int nfs_sync_file(struct inode *inode, struct file *file, unsigned long idx_start,
  1151.   unsigned int npages, int how)
  1152. {
  1153. int error,
  1154. wait;
  1155. wait = how & FLUSH_WAIT;
  1156. how &= ~FLUSH_WAIT;
  1157. if (!inode && file)
  1158. inode = file->f_dentry->d_inode;
  1159. do {
  1160. error = 0;
  1161. if (wait)
  1162. error = nfs_wait_on_requests(inode, file, idx_start, npages);
  1163. if (error == 0)
  1164. error = nfs_flush_file(inode, file, idx_start, npages, how);
  1165. #ifdef CONFIG_NFS_V3
  1166. if (error == 0)
  1167. error = nfs_commit_file(inode, file, idx_start, npages, how);
  1168. #endif
  1169. } while (error > 0);
  1170. return error;
  1171. }
  1172. int nfs_init_writepagecache(void)
  1173. {
  1174. nfs_wdata_cachep = kmem_cache_create("nfs_write_data",
  1175.      sizeof(struct nfs_write_data),
  1176.      0, SLAB_HWCACHE_ALIGN,
  1177.      NULL, NULL);
  1178. if (nfs_wdata_cachep == NULL)
  1179. return -ENOMEM;
  1180. return 0;
  1181. }
  1182. void nfs_destroy_writepagecache(void)
  1183. {
  1184. if (kmem_cache_destroy(nfs_wdata_cachep))
  1185. printk(KERN_INFO "nfs_write_data: not all structures were freedn");
  1186. }