write.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. /* handling of writes to regular files and writing back to the server
  2. *
  3. * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/backing-dev.h>
  12. #include <linux/slab.h>
  13. #include <linux/fs.h>
  14. #include <linux/pagemap.h>
  15. #include <linux/writeback.h>
  16. #include <linux/pagevec.h>
  17. #include "internal.h"
  18. /*
  19. * mark a page as having been made dirty and thus needing writeback
  20. */
  21. int afs_set_page_dirty(struct page *page)
  22. {
  23. _enter("");
  24. return __set_page_dirty_nobuffers(page);
  25. }
  26. /*
  27. * partly or wholly fill a page that's under preparation for writing
  28. */
  29. static int afs_fill_page(struct afs_vnode *vnode, struct key *key,
  30. loff_t pos, unsigned int len, struct page *page)
  31. {
  32. struct afs_read *req;
  33. int ret;
  34. _enter(",,%llu", (unsigned long long)pos);
  35. req = kzalloc(sizeof(struct afs_read) + sizeof(struct page *),
  36. GFP_KERNEL);
  37. if (!req)
  38. return -ENOMEM;
  39. refcount_set(&req->usage, 1);
  40. req->pos = pos;
  41. req->len = len;
  42. req->nr_pages = 1;
  43. req->pages = req->array;
  44. req->pages[0] = page;
  45. get_page(page);
  46. ret = afs_fetch_data(vnode, key, req);
  47. afs_put_read(req);
  48. if (ret < 0) {
  49. if (ret == -ENOENT) {
  50. _debug("got NOENT from server"
  51. " - marking file deleted and stale");
  52. set_bit(AFS_VNODE_DELETED, &vnode->flags);
  53. ret = -ESTALE;
  54. }
  55. }
  56. _leave(" = %d", ret);
  57. return ret;
  58. }
  59. /*
  60. * prepare to perform part of a write to a page
  61. */
  62. int afs_write_begin(struct file *file, struct address_space *mapping,
  63. loff_t pos, unsigned len, unsigned flags,
  64. struct page **pagep, void **fsdata)
  65. {
  66. struct afs_vnode *vnode = AFS_FS_I(file_inode(file));
  67. struct page *page;
  68. struct key *key = afs_file_key(file);
  69. unsigned long priv;
  70. unsigned f, from = pos & (PAGE_SIZE - 1);
  71. unsigned t, to = from + len;
  72. pgoff_t index = pos >> PAGE_SHIFT;
  73. int ret;
  74. _enter("{%x:%u},{%lx},%u,%u",
  75. vnode->fid.vid, vnode->fid.vnode, index, from, to);
  76. /* We want to store information about how much of a page is altered in
  77. * page->private.
  78. */
  79. BUILD_BUG_ON(PAGE_SIZE > 32768 && sizeof(page->private) < 8);
  80. page = grab_cache_page_write_begin(mapping, index, flags);
  81. if (!page)
  82. return -ENOMEM;
  83. if (!PageUptodate(page) && len != PAGE_SIZE) {
  84. ret = afs_fill_page(vnode, key, pos & PAGE_MASK, PAGE_SIZE, page);
  85. if (ret < 0) {
  86. unlock_page(page);
  87. put_page(page);
  88. _leave(" = %d [prep]", ret);
  89. return ret;
  90. }
  91. SetPageUptodate(page);
  92. }
  93. /* page won't leak in error case: it eventually gets cleaned off LRU */
  94. *pagep = page;
  95. try_again:
  96. /* See if this page is already partially written in a way that we can
  97. * merge the new write with.
  98. */
  99. t = f = 0;
  100. if (PagePrivate(page)) {
  101. priv = page_private(page);
  102. f = priv & AFS_PRIV_MAX;
  103. t = priv >> AFS_PRIV_SHIFT;
  104. ASSERTCMP(f, <=, t);
  105. }
  106. if (f != t) {
  107. if (PageWriteback(page)) {
  108. trace_afs_page_dirty(vnode, tracepoint_string("alrdy"),
  109. page->index, priv);
  110. goto flush_conflicting_write;
  111. }
  112. /* If the file is being filled locally, allow inter-write
  113. * spaces to be merged into writes. If it's not, only write
  114. * back what the user gives us.
  115. */
  116. if (!test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags) &&
  117. (to < f || from > t))
  118. goto flush_conflicting_write;
  119. if (from < f)
  120. f = from;
  121. if (to > t)
  122. t = to;
  123. } else {
  124. f = from;
  125. t = to;
  126. }
  127. priv = (unsigned long)t << AFS_PRIV_SHIFT;
  128. priv |= f;
  129. trace_afs_page_dirty(vnode, tracepoint_string("begin"),
  130. page->index, priv);
  131. SetPagePrivate(page);
  132. set_page_private(page, priv);
  133. _leave(" = 0");
  134. return 0;
  135. /* The previous write and this write aren't adjacent or overlapping, so
  136. * flush the page out.
  137. */
  138. flush_conflicting_write:
  139. _debug("flush conflict");
  140. ret = write_one_page(page);
  141. if (ret < 0) {
  142. _leave(" = %d", ret);
  143. return ret;
  144. }
  145. ret = lock_page_killable(page);
  146. if (ret < 0) {
  147. _leave(" = %d", ret);
  148. return ret;
  149. }
  150. goto try_again;
  151. }
  152. /*
  153. * finalise part of a write to a page
  154. */
  155. int afs_write_end(struct file *file, struct address_space *mapping,
  156. loff_t pos, unsigned len, unsigned copied,
  157. struct page *page, void *fsdata)
  158. {
  159. struct afs_vnode *vnode = AFS_FS_I(file_inode(file));
  160. struct key *key = afs_file_key(file);
  161. loff_t i_size, maybe_i_size;
  162. int ret;
  163. _enter("{%x:%u},{%lx}",
  164. vnode->fid.vid, vnode->fid.vnode, page->index);
  165. maybe_i_size = pos + copied;
  166. i_size = i_size_read(&vnode->vfs_inode);
  167. if (maybe_i_size > i_size) {
  168. spin_lock(&vnode->wb_lock);
  169. i_size = i_size_read(&vnode->vfs_inode);
  170. if (maybe_i_size > i_size)
  171. i_size_write(&vnode->vfs_inode, maybe_i_size);
  172. spin_unlock(&vnode->wb_lock);
  173. }
  174. if (!PageUptodate(page)) {
  175. if (copied < len) {
  176. /* Try and load any missing data from the server. The
  177. * unmarshalling routine will take care of clearing any
  178. * bits that are beyond the EOF.
  179. */
  180. ret = afs_fill_page(vnode, key, pos + copied,
  181. len - copied, page);
  182. if (ret < 0)
  183. goto out;
  184. }
  185. SetPageUptodate(page);
  186. }
  187. set_page_dirty(page);
  188. if (PageDirty(page))
  189. _debug("dirtied");
  190. ret = copied;
  191. out:
  192. unlock_page(page);
  193. put_page(page);
  194. return ret;
  195. }
  196. /*
  197. * kill all the pages in the given range
  198. */
  199. static void afs_kill_pages(struct address_space *mapping,
  200. pgoff_t first, pgoff_t last)
  201. {
  202. struct afs_vnode *vnode = AFS_FS_I(mapping->host);
  203. struct pagevec pv;
  204. unsigned count, loop;
  205. _enter("{%x:%u},%lx-%lx",
  206. vnode->fid.vid, vnode->fid.vnode, first, last);
  207. pagevec_init(&pv);
  208. do {
  209. _debug("kill %lx-%lx", first, last);
  210. count = last - first + 1;
  211. if (count > PAGEVEC_SIZE)
  212. count = PAGEVEC_SIZE;
  213. pv.nr = find_get_pages_contig(mapping, first, count, pv.pages);
  214. ASSERTCMP(pv.nr, ==, count);
  215. for (loop = 0; loop < count; loop++) {
  216. struct page *page = pv.pages[loop];
  217. ClearPageUptodate(page);
  218. SetPageError(page);
  219. end_page_writeback(page);
  220. if (page->index >= first)
  221. first = page->index + 1;
  222. lock_page(page);
  223. generic_error_remove_page(mapping, page);
  224. }
  225. __pagevec_release(&pv);
  226. } while (first <= last);
  227. _leave("");
  228. }
  229. /*
  230. * Redirty all the pages in a given range.
  231. */
  232. static void afs_redirty_pages(struct writeback_control *wbc,
  233. struct address_space *mapping,
  234. pgoff_t first, pgoff_t last)
  235. {
  236. struct afs_vnode *vnode = AFS_FS_I(mapping->host);
  237. struct pagevec pv;
  238. unsigned count, loop;
  239. _enter("{%x:%u},%lx-%lx",
  240. vnode->fid.vid, vnode->fid.vnode, first, last);
  241. pagevec_init(&pv);
  242. do {
  243. _debug("redirty %lx-%lx", first, last);
  244. count = last - first + 1;
  245. if (count > PAGEVEC_SIZE)
  246. count = PAGEVEC_SIZE;
  247. pv.nr = find_get_pages_contig(mapping, first, count, pv.pages);
  248. ASSERTCMP(pv.nr, ==, count);
  249. for (loop = 0; loop < count; loop++) {
  250. struct page *page = pv.pages[loop];
  251. redirty_page_for_writepage(wbc, page);
  252. end_page_writeback(page);
  253. if (page->index >= first)
  254. first = page->index + 1;
  255. }
  256. __pagevec_release(&pv);
  257. } while (first <= last);
  258. _leave("");
  259. }
  260. /*
  261. * write to a file
  262. */
  263. static int afs_store_data(struct address_space *mapping,
  264. pgoff_t first, pgoff_t last,
  265. unsigned offset, unsigned to)
  266. {
  267. struct afs_vnode *vnode = AFS_FS_I(mapping->host);
  268. struct afs_fs_cursor fc;
  269. struct afs_wb_key *wbk = NULL;
  270. struct list_head *p;
  271. int ret = -ENOKEY, ret2;
  272. _enter("%s{%x:%u.%u},%lx,%lx,%x,%x",
  273. vnode->volume->name,
  274. vnode->fid.vid,
  275. vnode->fid.vnode,
  276. vnode->fid.unique,
  277. first, last, offset, to);
  278. spin_lock(&vnode->wb_lock);
  279. p = vnode->wb_keys.next;
  280. /* Iterate through the list looking for a valid key to use. */
  281. try_next_key:
  282. while (p != &vnode->wb_keys) {
  283. wbk = list_entry(p, struct afs_wb_key, vnode_link);
  284. _debug("wbk %u", key_serial(wbk->key));
  285. ret2 = key_validate(wbk->key);
  286. if (ret2 == 0)
  287. goto found_key;
  288. if (ret == -ENOKEY)
  289. ret = ret2;
  290. p = p->next;
  291. }
  292. spin_unlock(&vnode->wb_lock);
  293. afs_put_wb_key(wbk);
  294. _leave(" = %d [no keys]", ret);
  295. return ret;
  296. found_key:
  297. refcount_inc(&wbk->usage);
  298. spin_unlock(&vnode->wb_lock);
  299. _debug("USE WB KEY %u", key_serial(wbk->key));
  300. ret = -ERESTARTSYS;
  301. if (afs_begin_vnode_operation(&fc, vnode, wbk->key)) {
  302. while (afs_select_fileserver(&fc)) {
  303. fc.cb_break = afs_calc_vnode_cb_break(vnode);
  304. afs_fs_store_data(&fc, mapping, first, last, offset, to);
  305. }
  306. afs_check_for_remote_deletion(&fc, fc.vnode);
  307. afs_vnode_commit_status(&fc, vnode, fc.cb_break);
  308. ret = afs_end_vnode_operation(&fc);
  309. }
  310. switch (ret) {
  311. case 0:
  312. afs_stat_v(vnode, n_stores);
  313. atomic_long_add((last * PAGE_SIZE + to) -
  314. (first * PAGE_SIZE + offset),
  315. &afs_v2net(vnode)->n_store_bytes);
  316. break;
  317. case -EACCES:
  318. case -EPERM:
  319. case -ENOKEY:
  320. case -EKEYEXPIRED:
  321. case -EKEYREJECTED:
  322. case -EKEYREVOKED:
  323. _debug("next");
  324. spin_lock(&vnode->wb_lock);
  325. p = wbk->vnode_link.next;
  326. afs_put_wb_key(wbk);
  327. goto try_next_key;
  328. }
  329. afs_put_wb_key(wbk);
  330. _leave(" = %d", ret);
  331. return ret;
  332. }
  333. /*
  334. * Synchronously write back the locked page and any subsequent non-locked dirty
  335. * pages.
  336. */
  337. static int afs_write_back_from_locked_page(struct address_space *mapping,
  338. struct writeback_control *wbc,
  339. struct page *primary_page,
  340. pgoff_t final_page)
  341. {
  342. struct afs_vnode *vnode = AFS_FS_I(mapping->host);
  343. struct page *pages[8], *page;
  344. unsigned long count, priv;
  345. unsigned n, offset, to, f, t;
  346. pgoff_t start, first, last;
  347. int loop, ret;
  348. _enter(",%lx", primary_page->index);
  349. count = 1;
  350. if (test_set_page_writeback(primary_page))
  351. BUG();
  352. /* Find all consecutive lockable dirty pages that have contiguous
  353. * written regions, stopping when we find a page that is not
  354. * immediately lockable, is not dirty or is missing, or we reach the
  355. * end of the range.
  356. */
  357. start = primary_page->index;
  358. priv = page_private(primary_page);
  359. offset = priv & AFS_PRIV_MAX;
  360. to = priv >> AFS_PRIV_SHIFT;
  361. trace_afs_page_dirty(vnode, tracepoint_string("store"),
  362. primary_page->index, priv);
  363. WARN_ON(offset == to);
  364. if (offset == to)
  365. trace_afs_page_dirty(vnode, tracepoint_string("WARN"),
  366. primary_page->index, priv);
  367. if (start >= final_page ||
  368. (to < PAGE_SIZE && !test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags)))
  369. goto no_more;
  370. start++;
  371. do {
  372. _debug("more %lx [%lx]", start, count);
  373. n = final_page - start + 1;
  374. if (n > ARRAY_SIZE(pages))
  375. n = ARRAY_SIZE(pages);
  376. n = find_get_pages_contig(mapping, start, ARRAY_SIZE(pages), pages);
  377. _debug("fgpc %u", n);
  378. if (n == 0)
  379. goto no_more;
  380. if (pages[0]->index != start) {
  381. do {
  382. put_page(pages[--n]);
  383. } while (n > 0);
  384. goto no_more;
  385. }
  386. for (loop = 0; loop < n; loop++) {
  387. page = pages[loop];
  388. if (to != PAGE_SIZE &&
  389. !test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags))
  390. break;
  391. if (page->index > final_page)
  392. break;
  393. if (!trylock_page(page))
  394. break;
  395. if (!PageDirty(page) || PageWriteback(page)) {
  396. unlock_page(page);
  397. break;
  398. }
  399. priv = page_private(page);
  400. f = priv & AFS_PRIV_MAX;
  401. t = priv >> AFS_PRIV_SHIFT;
  402. if (f != 0 &&
  403. !test_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags)) {
  404. unlock_page(page);
  405. break;
  406. }
  407. to = t;
  408. trace_afs_page_dirty(vnode, tracepoint_string("store+"),
  409. page->index, priv);
  410. if (!clear_page_dirty_for_io(page))
  411. BUG();
  412. if (test_set_page_writeback(page))
  413. BUG();
  414. unlock_page(page);
  415. put_page(page);
  416. }
  417. count += loop;
  418. if (loop < n) {
  419. for (; loop < n; loop++)
  420. put_page(pages[loop]);
  421. goto no_more;
  422. }
  423. start += loop;
  424. } while (start <= final_page && count < 65536);
  425. no_more:
  426. /* We now have a contiguous set of dirty pages, each with writeback
  427. * set; the first page is still locked at this point, but all the rest
  428. * have been unlocked.
  429. */
  430. unlock_page(primary_page);
  431. first = primary_page->index;
  432. last = first + count - 1;
  433. _debug("write back %lx[%u..] to %lx[..%u]", first, offset, last, to);
  434. ret = afs_store_data(mapping, first, last, offset, to);
  435. switch (ret) {
  436. case 0:
  437. ret = count;
  438. break;
  439. default:
  440. pr_notice("kAFS: Unexpected error from FS.StoreData %d\n", ret);
  441. /* Fall through */
  442. case -EACCES:
  443. case -EPERM:
  444. case -ENOKEY:
  445. case -EKEYEXPIRED:
  446. case -EKEYREJECTED:
  447. case -EKEYREVOKED:
  448. afs_redirty_pages(wbc, mapping, first, last);
  449. mapping_set_error(mapping, ret);
  450. break;
  451. case -EDQUOT:
  452. case -ENOSPC:
  453. afs_redirty_pages(wbc, mapping, first, last);
  454. mapping_set_error(mapping, -ENOSPC);
  455. break;
  456. case -EROFS:
  457. case -EIO:
  458. case -EREMOTEIO:
  459. case -EFBIG:
  460. case -ENOENT:
  461. case -ENOMEDIUM:
  462. case -ENXIO:
  463. afs_kill_pages(mapping, first, last);
  464. mapping_set_error(mapping, ret);
  465. break;
  466. }
  467. _leave(" = %d", ret);
  468. return ret;
  469. }
  470. /*
  471. * write a page back to the server
  472. * - the caller locked the page for us
  473. */
  474. int afs_writepage(struct page *page, struct writeback_control *wbc)
  475. {
  476. int ret;
  477. _enter("{%lx},", page->index);
  478. ret = afs_write_back_from_locked_page(page->mapping, wbc, page,
  479. wbc->range_end >> PAGE_SHIFT);
  480. if (ret < 0) {
  481. _leave(" = %d", ret);
  482. return 0;
  483. }
  484. wbc->nr_to_write -= ret;
  485. _leave(" = 0");
  486. return 0;
  487. }
  488. /*
  489. * write a region of pages back to the server
  490. */
  491. static int afs_writepages_region(struct address_space *mapping,
  492. struct writeback_control *wbc,
  493. pgoff_t index, pgoff_t end, pgoff_t *_next)
  494. {
  495. struct page *page;
  496. int ret, n;
  497. _enter(",,%lx,%lx,", index, end);
  498. do {
  499. n = find_get_pages_range_tag(mapping, &index, end,
  500. PAGECACHE_TAG_DIRTY, 1, &page);
  501. if (!n)
  502. break;
  503. _debug("wback %lx", page->index);
  504. /*
  505. * at this point we hold neither the i_pages lock nor the
  506. * page lock: the page may be truncated or invalidated
  507. * (changing page->mapping to NULL), or even swizzled
  508. * back from swapper_space to tmpfs file mapping
  509. */
  510. ret = lock_page_killable(page);
  511. if (ret < 0) {
  512. put_page(page);
  513. _leave(" = %d", ret);
  514. return ret;
  515. }
  516. if (page->mapping != mapping || !PageDirty(page)) {
  517. unlock_page(page);
  518. put_page(page);
  519. continue;
  520. }
  521. if (PageWriteback(page)) {
  522. unlock_page(page);
  523. if (wbc->sync_mode != WB_SYNC_NONE)
  524. wait_on_page_writeback(page);
  525. put_page(page);
  526. continue;
  527. }
  528. if (!clear_page_dirty_for_io(page))
  529. BUG();
  530. ret = afs_write_back_from_locked_page(mapping, wbc, page, end);
  531. put_page(page);
  532. if (ret < 0) {
  533. _leave(" = %d", ret);
  534. return ret;
  535. }
  536. wbc->nr_to_write -= ret;
  537. cond_resched();
  538. } while (index < end && wbc->nr_to_write > 0);
  539. *_next = index;
  540. _leave(" = 0 [%lx]", *_next);
  541. return 0;
  542. }
  543. /*
  544. * write some of the pending data back to the server
  545. */
  546. int afs_writepages(struct address_space *mapping,
  547. struct writeback_control *wbc)
  548. {
  549. pgoff_t start, end, next;
  550. int ret;
  551. _enter("");
  552. if (wbc->range_cyclic) {
  553. start = mapping->writeback_index;
  554. end = -1;
  555. ret = afs_writepages_region(mapping, wbc, start, end, &next);
  556. if (start > 0 && wbc->nr_to_write > 0 && ret == 0)
  557. ret = afs_writepages_region(mapping, wbc, 0, start,
  558. &next);
  559. mapping->writeback_index = next;
  560. } else if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) {
  561. end = (pgoff_t)(LLONG_MAX >> PAGE_SHIFT);
  562. ret = afs_writepages_region(mapping, wbc, 0, end, &next);
  563. if (wbc->nr_to_write > 0)
  564. mapping->writeback_index = next;
  565. } else {
  566. start = wbc->range_start >> PAGE_SHIFT;
  567. end = wbc->range_end >> PAGE_SHIFT;
  568. ret = afs_writepages_region(mapping, wbc, start, end, &next);
  569. }
  570. _leave(" = %d", ret);
  571. return ret;
  572. }
  573. /*
  574. * completion of write to server
  575. */
  576. void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)
  577. {
  578. struct pagevec pv;
  579. unsigned long priv;
  580. unsigned count, loop;
  581. pgoff_t first = call->first, last = call->last;
  582. _enter("{%x:%u},{%lx-%lx}",
  583. vnode->fid.vid, vnode->fid.vnode, first, last);
  584. pagevec_init(&pv);
  585. do {
  586. _debug("done %lx-%lx", first, last);
  587. count = last - first + 1;
  588. if (count > PAGEVEC_SIZE)
  589. count = PAGEVEC_SIZE;
  590. pv.nr = find_get_pages_contig(vnode->vfs_inode.i_mapping,
  591. first, count, pv.pages);
  592. ASSERTCMP(pv.nr, ==, count);
  593. for (loop = 0; loop < count; loop++) {
  594. priv = page_private(pv.pages[loop]);
  595. trace_afs_page_dirty(vnode, tracepoint_string("clear"),
  596. pv.pages[loop]->index, priv);
  597. set_page_private(pv.pages[loop], 0);
  598. end_page_writeback(pv.pages[loop]);
  599. }
  600. first += count;
  601. __pagevec_release(&pv);
  602. } while (first <= last);
  603. afs_prune_wb_keys(vnode);
  604. _leave("");
  605. }
  606. /*
  607. * write to an AFS file
  608. */
  609. ssize_t afs_file_write(struct kiocb *iocb, struct iov_iter *from)
  610. {
  611. struct afs_vnode *vnode = AFS_FS_I(file_inode(iocb->ki_filp));
  612. ssize_t result;
  613. size_t count = iov_iter_count(from);
  614. _enter("{%x.%u},{%zu},",
  615. vnode->fid.vid, vnode->fid.vnode, count);
  616. if (IS_SWAPFILE(&vnode->vfs_inode)) {
  617. printk(KERN_INFO
  618. "AFS: Attempt to write to active swap file!\n");
  619. return -EBUSY;
  620. }
  621. if (!count)
  622. return 0;
  623. result = generic_file_write_iter(iocb, from);
  624. _leave(" = %zd", result);
  625. return result;
  626. }
  627. /*
  628. * flush any dirty pages for this process, and check for write errors.
  629. * - the return status from this call provides a reliable indication of
  630. * whether any write errors occurred for this process.
  631. */
  632. int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
  633. {
  634. struct inode *inode = file_inode(file);
  635. struct afs_vnode *vnode = AFS_FS_I(inode);
  636. _enter("{%x:%u},{n=%pD},%d",
  637. vnode->fid.vid, vnode->fid.vnode, file,
  638. datasync);
  639. return file_write_and_wait_range(file, start, end);
  640. }
  641. /*
  642. * notification that a previously read-only page is about to become writable
  643. * - if it returns an error, the caller will deliver a bus error signal
  644. */
  645. vm_fault_t afs_page_mkwrite(struct vm_fault *vmf)
  646. {
  647. struct file *file = vmf->vma->vm_file;
  648. struct inode *inode = file_inode(file);
  649. struct afs_vnode *vnode = AFS_FS_I(inode);
  650. unsigned long priv;
  651. _enter("{{%x:%u}},{%lx}",
  652. vnode->fid.vid, vnode->fid.vnode, vmf->page->index);
  653. sb_start_pagefault(inode->i_sb);
  654. /* Wait for the page to be written to the cache before we allow it to
  655. * be modified. We then assume the entire page will need writing back.
  656. */
  657. #ifdef CONFIG_AFS_FSCACHE
  658. fscache_wait_on_page_write(vnode->cache, vmf->page);
  659. #endif
  660. if (PageWriteback(vmf->page) &&
  661. wait_on_page_bit_killable(vmf->page, PG_writeback) < 0)
  662. return VM_FAULT_RETRY;
  663. if (lock_page_killable(vmf->page) < 0)
  664. return VM_FAULT_RETRY;
  665. /* We mustn't change page->private until writeback is complete as that
  666. * details the portion of the page we need to write back and we might
  667. * need to redirty the page if there's a problem.
  668. */
  669. wait_on_page_writeback(vmf->page);
  670. priv = (unsigned long)PAGE_SIZE << AFS_PRIV_SHIFT; /* To */
  671. priv |= 0; /* From */
  672. trace_afs_page_dirty(vnode, tracepoint_string("mkwrite"),
  673. vmf->page->index, priv);
  674. SetPagePrivate(vmf->page);
  675. set_page_private(vmf->page, priv);
  676. sb_end_pagefault(inode->i_sb);
  677. return VM_FAULT_LOCKED;
  678. }
  679. /*
  680. * Prune the keys cached for writeback. The caller must hold vnode->wb_lock.
  681. */
  682. void afs_prune_wb_keys(struct afs_vnode *vnode)
  683. {
  684. LIST_HEAD(graveyard);
  685. struct afs_wb_key *wbk, *tmp;
  686. /* Discard unused keys */
  687. spin_lock(&vnode->wb_lock);
  688. if (!mapping_tagged(&vnode->vfs_inode.i_data, PAGECACHE_TAG_WRITEBACK) &&
  689. !mapping_tagged(&vnode->vfs_inode.i_data, PAGECACHE_TAG_DIRTY)) {
  690. list_for_each_entry_safe(wbk, tmp, &vnode->wb_keys, vnode_link) {
  691. if (refcount_read(&wbk->usage) == 1)
  692. list_move(&wbk->vnode_link, &graveyard);
  693. }
  694. }
  695. spin_unlock(&vnode->wb_lock);
  696. while (!list_empty(&graveyard)) {
  697. wbk = list_entry(graveyard.next, struct afs_wb_key, vnode_link);
  698. list_del(&wbk->vnode_link);
  699. afs_put_wb_key(wbk);
  700. }
  701. }
  702. /*
  703. * Clean up a page during invalidation.
  704. */
  705. int afs_launder_page(struct page *page)
  706. {
  707. struct address_space *mapping = page->mapping;
  708. struct afs_vnode *vnode = AFS_FS_I(mapping->host);
  709. unsigned long priv;
  710. unsigned int f, t;
  711. int ret = 0;
  712. _enter("{%lx}", page->index);
  713. priv = page_private(page);
  714. if (clear_page_dirty_for_io(page)) {
  715. f = 0;
  716. t = PAGE_SIZE;
  717. if (PagePrivate(page)) {
  718. f = priv & AFS_PRIV_MAX;
  719. t = priv >> AFS_PRIV_SHIFT;
  720. }
  721. trace_afs_page_dirty(vnode, tracepoint_string("launder"),
  722. page->index, priv);
  723. ret = afs_store_data(mapping, page->index, page->index, t, f);
  724. }
  725. trace_afs_page_dirty(vnode, tracepoint_string("laundered"),
  726. page->index, priv);
  727. set_page_private(page, 0);
  728. ClearPagePrivate(page);
  729. #ifdef CONFIG_AFS_FSCACHE
  730. if (PageFsCache(page)) {
  731. fscache_wait_on_page_write(vnode->cache, page);
  732. fscache_uncache_page(vnode->cache, page);
  733. }
  734. #endif
  735. return ret;
  736. }