file.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. /*
  2. * Copyright (C) 2007 Oracle. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public
  6. * License v2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public
  14. * License along with this program; if not, write to the
  15. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16. * Boston, MA 021110-1307, USA.
  17. */
  18. #include <linux/module.h>
  19. #include <linux/buffer_head.h>
  20. #include <linux/fs.h>
  21. #include <linux/pagemap.h>
  22. #include <linux/highmem.h>
  23. #include <linux/time.h>
  24. #include <linux/init.h>
  25. #include <linux/string.h>
  26. #include <linux/smp_lock.h>
  27. #include <linux/backing-dev.h>
  28. #include <linux/mpage.h>
  29. #include <linux/swap.h>
  30. #include <linux/writeback.h>
  31. #include <linux/statfs.h>
  32. #include <linux/compat.h>
  33. #include "ctree.h"
  34. #include "disk-io.h"
  35. #include "transaction.h"
  36. #include "btrfs_inode.h"
  37. #include "ioctl.h"
  38. #include "print-tree.h"
  39. static int btrfs_copy_from_user(loff_t pos, int num_pages, int write_bytes,
  40. struct page **prepared_pages,
  41. const char __user * buf)
  42. {
  43. long page_fault = 0;
  44. int i;
  45. int offset = pos & (PAGE_CACHE_SIZE - 1);
  46. for (i = 0; i < num_pages && write_bytes > 0; i++, offset = 0) {
  47. size_t count = min_t(size_t,
  48. PAGE_CACHE_SIZE - offset, write_bytes);
  49. struct page *page = prepared_pages[i];
  50. fault_in_pages_readable(buf, count);
  51. /* Copy data from userspace to the current page */
  52. kmap(page);
  53. page_fault = __copy_from_user(page_address(page) + offset,
  54. buf, count);
  55. /* Flush processor's dcache for this page */
  56. flush_dcache_page(page);
  57. kunmap(page);
  58. buf += count;
  59. write_bytes -= count;
  60. if (page_fault)
  61. break;
  62. }
  63. return page_fault ? -EFAULT : 0;
  64. }
  65. static void btrfs_drop_pages(struct page **pages, size_t num_pages)
  66. {
  67. size_t i;
  68. for (i = 0; i < num_pages; i++) {
  69. if (!pages[i])
  70. break;
  71. unlock_page(pages[i]);
  72. mark_page_accessed(pages[i]);
  73. page_cache_release(pages[i]);
  74. }
  75. }
  76. static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
  77. struct btrfs_root *root,
  78. struct file *file,
  79. struct page **pages,
  80. size_t num_pages,
  81. loff_t pos,
  82. size_t write_bytes)
  83. {
  84. int i;
  85. int offset;
  86. int err = 0;
  87. int ret;
  88. int this_write;
  89. struct inode *inode = file->f_path.dentry->d_inode;
  90. struct buffer_head *bh;
  91. struct btrfs_file_extent_item *ei;
  92. for (i = 0; i < num_pages; i++) {
  93. offset = pos & (PAGE_CACHE_SIZE -1);
  94. this_write = min((size_t)PAGE_CACHE_SIZE - offset, write_bytes);
  95. /* FIXME, one block at a time */
  96. bh = page_buffers(pages[i]);
  97. if (buffer_mapped(bh) && bh->b_blocknr == 0) {
  98. struct btrfs_key key;
  99. struct btrfs_path *path;
  100. char *ptr, *kaddr;
  101. u32 datasize;
  102. mutex_lock(&root->fs_info->fs_mutex);
  103. trans = btrfs_start_transaction(root, 1);
  104. btrfs_set_trans_block_group(trans, inode);
  105. /* create an inline extent, and copy the data in */
  106. path = btrfs_alloc_path();
  107. BUG_ON(!path);
  108. key.objectid = inode->i_ino;
  109. key.offset = pages[i]->index << PAGE_CACHE_SHIFT;
  110. key.flags = 0;
  111. btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY);
  112. BUG_ON(write_bytes >= PAGE_CACHE_SIZE);
  113. datasize = offset +
  114. btrfs_file_extent_calc_inline_size(write_bytes);
  115. ret = btrfs_insert_empty_item(trans, root, path, &key,
  116. datasize);
  117. BUG_ON(ret);
  118. ei = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]),
  119. path->slots[0], struct btrfs_file_extent_item);
  120. btrfs_set_file_extent_generation(ei, trans->transid);
  121. btrfs_set_file_extent_type(ei,
  122. BTRFS_FILE_EXTENT_INLINE);
  123. ptr = btrfs_file_extent_inline_start(ei);
  124. kaddr = kmap_atomic(bh->b_page, KM_USER0);
  125. btrfs_memcpy(root, path->nodes[0]->b_data,
  126. ptr, kaddr + bh_offset(bh),
  127. offset + write_bytes);
  128. kunmap_atomic(kaddr, KM_USER0);
  129. mark_buffer_dirty(path->nodes[0]);
  130. btrfs_free_path(path);
  131. ret = btrfs_end_transaction(trans, root);
  132. BUG_ON(ret);
  133. mutex_unlock(&root->fs_info->fs_mutex);
  134. }
  135. ret = btrfs_commit_write(file, pages[i], offset,
  136. offset + this_write);
  137. pos += this_write;
  138. if (ret) {
  139. err = ret;
  140. goto failed;
  141. }
  142. WARN_ON(this_write > write_bytes);
  143. write_bytes -= this_write;
  144. }
  145. failed:
  146. return err;
  147. }
  148. /*
  149. * this is very complex, but the basic idea is to drop all extents
  150. * in the range start - end. hint_block is filled in with a block number
  151. * that would be a good hint to the block allocator for this file.
  152. *
  153. * If an extent intersects the range but is not entirely inside the range
  154. * it is either truncated or split. Anything entirely inside the range
  155. * is deleted from the tree.
  156. */
  157. int btrfs_drop_extents(struct btrfs_trans_handle *trans,
  158. struct btrfs_root *root, struct inode *inode,
  159. u64 start, u64 end, u64 *hint_block)
  160. {
  161. int ret;
  162. struct btrfs_key key;
  163. struct btrfs_leaf *leaf;
  164. int slot;
  165. struct btrfs_file_extent_item *extent;
  166. u64 extent_end = 0;
  167. int keep;
  168. struct btrfs_file_extent_item old;
  169. struct btrfs_path *path;
  170. u64 search_start = start;
  171. int bookend;
  172. int found_type;
  173. int found_extent;
  174. int found_inline;
  175. path = btrfs_alloc_path();
  176. if (!path)
  177. return -ENOMEM;
  178. while(1) {
  179. btrfs_release_path(root, path);
  180. ret = btrfs_lookup_file_extent(trans, root, path, inode->i_ino,
  181. search_start, -1);
  182. if (ret < 0)
  183. goto out;
  184. if (ret > 0) {
  185. if (path->slots[0] == 0) {
  186. ret = 0;
  187. goto out;
  188. }
  189. path->slots[0]--;
  190. }
  191. keep = 0;
  192. bookend = 0;
  193. found_extent = 0;
  194. found_inline = 0;
  195. extent = NULL;
  196. leaf = btrfs_buffer_leaf(path->nodes[0]);
  197. slot = path->slots[0];
  198. btrfs_disk_key_to_cpu(&key, &leaf->items[slot].key);
  199. if (key.offset >= end || key.objectid != inode->i_ino) {
  200. ret = 0;
  201. goto out;
  202. }
  203. if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY) {
  204. ret = 0;
  205. goto out;
  206. }
  207. extent = btrfs_item_ptr(leaf, slot,
  208. struct btrfs_file_extent_item);
  209. found_type = btrfs_file_extent_type(extent);
  210. if (found_type == BTRFS_FILE_EXTENT_REG) {
  211. extent_end = key.offset +
  212. (btrfs_file_extent_num_blocks(extent) <<
  213. inode->i_blkbits);
  214. found_extent = 1;
  215. } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
  216. found_inline = 1;
  217. extent_end = key.offset +
  218. btrfs_file_extent_inline_len(leaf->items + slot);
  219. }
  220. /* we found nothing we can drop */
  221. if (!found_extent && !found_inline) {
  222. ret = 0;
  223. goto out;
  224. }
  225. /* we found nothing inside the range */
  226. if (search_start >= extent_end) {
  227. ret = 0;
  228. goto out;
  229. }
  230. /* FIXME, there's only one inline extent allowed right now */
  231. if (found_inline) {
  232. u64 mask = root->blocksize - 1;
  233. search_start = (extent_end + mask) & ~mask;
  234. } else
  235. search_start = extent_end;
  236. if (end < extent_end && end >= key.offset) {
  237. if (found_extent) {
  238. u64 disk_blocknr =
  239. btrfs_file_extent_disk_blocknr(extent);
  240. u64 disk_num_blocks =
  241. btrfs_file_extent_disk_num_blocks(extent);
  242. memcpy(&old, extent, sizeof(old));
  243. if (disk_blocknr != 0) {
  244. ret = btrfs_inc_extent_ref(trans, root,
  245. disk_blocknr, disk_num_blocks);
  246. BUG_ON(ret);
  247. }
  248. }
  249. WARN_ON(found_inline);
  250. bookend = 1;
  251. }
  252. /* truncate existing extent */
  253. if (start > key.offset) {
  254. u64 new_num;
  255. u64 old_num;
  256. keep = 1;
  257. WARN_ON(start & (root->blocksize - 1));
  258. if (found_extent) {
  259. new_num = (start - key.offset) >>
  260. inode->i_blkbits;
  261. old_num = btrfs_file_extent_num_blocks(extent);
  262. *hint_block =
  263. btrfs_file_extent_disk_blocknr(extent);
  264. if (btrfs_file_extent_disk_blocknr(extent)) {
  265. inode->i_blocks -=
  266. (old_num - new_num) << 3;
  267. }
  268. btrfs_set_file_extent_num_blocks(extent,
  269. new_num);
  270. mark_buffer_dirty(path->nodes[0]);
  271. } else {
  272. WARN_ON(1);
  273. }
  274. }
  275. /* delete the entire extent */
  276. if (!keep) {
  277. u64 disk_blocknr = 0;
  278. u64 disk_num_blocks = 0;
  279. u64 extent_num_blocks = 0;
  280. if (found_extent) {
  281. disk_blocknr =
  282. btrfs_file_extent_disk_blocknr(extent);
  283. disk_num_blocks =
  284. btrfs_file_extent_disk_num_blocks(extent);
  285. extent_num_blocks =
  286. btrfs_file_extent_num_blocks(extent);
  287. *hint_block =
  288. btrfs_file_extent_disk_blocknr(extent);
  289. }
  290. ret = btrfs_del_item(trans, root, path);
  291. BUG_ON(ret);
  292. btrfs_release_path(root, path);
  293. extent = NULL;
  294. if (found_extent && disk_blocknr != 0) {
  295. inode->i_blocks -= extent_num_blocks << 3;
  296. ret = btrfs_free_extent(trans, root,
  297. disk_blocknr,
  298. disk_num_blocks, 0);
  299. }
  300. BUG_ON(ret);
  301. if (!bookend && search_start >= end) {
  302. ret = 0;
  303. goto out;
  304. }
  305. if (!bookend)
  306. continue;
  307. }
  308. /* create bookend, splitting the extent in two */
  309. if (bookend && found_extent) {
  310. struct btrfs_key ins;
  311. ins.objectid = inode->i_ino;
  312. ins.offset = end;
  313. ins.flags = 0;
  314. btrfs_set_key_type(&ins, BTRFS_EXTENT_DATA_KEY);
  315. btrfs_release_path(root, path);
  316. ret = btrfs_insert_empty_item(trans, root, path, &ins,
  317. sizeof(*extent));
  318. BUG_ON(ret);
  319. extent = btrfs_item_ptr(
  320. btrfs_buffer_leaf(path->nodes[0]),
  321. path->slots[0],
  322. struct btrfs_file_extent_item);
  323. btrfs_set_file_extent_disk_blocknr(extent,
  324. btrfs_file_extent_disk_blocknr(&old));
  325. btrfs_set_file_extent_disk_num_blocks(extent,
  326. btrfs_file_extent_disk_num_blocks(&old));
  327. btrfs_set_file_extent_offset(extent,
  328. btrfs_file_extent_offset(&old) +
  329. ((end - key.offset) >> inode->i_blkbits));
  330. WARN_ON(btrfs_file_extent_num_blocks(&old) <
  331. (extent_end - end) >> inode->i_blkbits);
  332. btrfs_set_file_extent_num_blocks(extent,
  333. (extent_end - end) >> inode->i_blkbits);
  334. btrfs_set_file_extent_type(extent,
  335. BTRFS_FILE_EXTENT_REG);
  336. btrfs_set_file_extent_generation(extent,
  337. btrfs_file_extent_generation(&old));
  338. btrfs_mark_buffer_dirty(path->nodes[0]);
  339. if (btrfs_file_extent_disk_blocknr(&old) != 0) {
  340. inode->i_blocks +=
  341. btrfs_file_extent_num_blocks(extent) << 3;
  342. }
  343. ret = 0;
  344. goto out;
  345. }
  346. }
  347. out:
  348. btrfs_free_path(path);
  349. return ret;
  350. }
  351. /*
  352. * this gets pages into the page cache and locks them down
  353. */
  354. static int prepare_pages(struct btrfs_root *root,
  355. struct file *file,
  356. struct page **pages,
  357. size_t num_pages,
  358. loff_t pos,
  359. unsigned long first_index,
  360. unsigned long last_index,
  361. size_t write_bytes,
  362. u64 alloc_extent_start)
  363. {
  364. int i;
  365. unsigned long index = pos >> PAGE_CACHE_SHIFT;
  366. struct inode *inode = file->f_path.dentry->d_inode;
  367. int offset;
  368. int err = 0;
  369. int this_write;
  370. struct buffer_head *bh;
  371. struct buffer_head *head;
  372. loff_t isize = i_size_read(inode);
  373. memset(pages, 0, num_pages * sizeof(struct page *));
  374. for (i = 0; i < num_pages; i++) {
  375. pages[i] = grab_cache_page(inode->i_mapping, index + i);
  376. if (!pages[i]) {
  377. err = -ENOMEM;
  378. goto failed_release;
  379. }
  380. cancel_dirty_page(pages[i], PAGE_CACHE_SIZE);
  381. wait_on_page_writeback(pages[i]);
  382. offset = pos & (PAGE_CACHE_SIZE -1);
  383. this_write = min((size_t)PAGE_CACHE_SIZE - offset, write_bytes);
  384. if (!page_has_buffers(pages[i])) {
  385. create_empty_buffers(pages[i],
  386. root->fs_info->sb->s_blocksize,
  387. (1 << BH_Uptodate));
  388. }
  389. head = page_buffers(pages[i]);
  390. bh = head;
  391. do {
  392. err = btrfs_map_bh_to_logical(root, bh,
  393. alloc_extent_start);
  394. BUG_ON(err);
  395. if (err)
  396. goto failed_truncate;
  397. bh = bh->b_this_page;
  398. if (alloc_extent_start)
  399. alloc_extent_start++;
  400. } while (bh != head);
  401. pos += this_write;
  402. WARN_ON(this_write > write_bytes);
  403. write_bytes -= this_write;
  404. }
  405. return 0;
  406. failed_release:
  407. btrfs_drop_pages(pages, num_pages);
  408. return err;
  409. failed_truncate:
  410. btrfs_drop_pages(pages, num_pages);
  411. if (pos > isize)
  412. vmtruncate(inode, isize);
  413. return err;
  414. }
  415. static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
  416. size_t count, loff_t *ppos)
  417. {
  418. loff_t pos;
  419. size_t num_written = 0;
  420. int err = 0;
  421. int ret = 0;
  422. struct inode *inode = file->f_path.dentry->d_inode;
  423. struct btrfs_root *root = BTRFS_I(inode)->root;
  424. struct page *pages[8];
  425. struct page *pinned[2];
  426. unsigned long first_index;
  427. unsigned long last_index;
  428. u64 start_pos;
  429. u64 num_blocks;
  430. u64 alloc_extent_start;
  431. u64 hint_block;
  432. struct btrfs_trans_handle *trans;
  433. struct btrfs_key ins;
  434. pinned[0] = NULL;
  435. pinned[1] = NULL;
  436. if (file->f_flags & O_DIRECT)
  437. return -EINVAL;
  438. pos = *ppos;
  439. vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE);
  440. current->backing_dev_info = inode->i_mapping->backing_dev_info;
  441. err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
  442. if (err)
  443. goto out;
  444. if (count == 0)
  445. goto out;
  446. err = remove_suid(file->f_path.dentry);
  447. if (err)
  448. goto out;
  449. file_update_time(file);
  450. start_pos = pos & ~((u64)PAGE_CACHE_SIZE - 1);
  451. num_blocks = (count + pos - start_pos + root->blocksize - 1) >>
  452. inode->i_blkbits;
  453. mutex_lock(&inode->i_mutex);
  454. first_index = pos >> PAGE_CACHE_SHIFT;
  455. last_index = (pos + count) >> PAGE_CACHE_SHIFT;
  456. /*
  457. * there are lots of better ways to do this, but this code
  458. * makes sure the first and last page in the file range are
  459. * up to date and ready for cow
  460. */
  461. if ((pos & (PAGE_CACHE_SIZE - 1))) {
  462. pinned[0] = grab_cache_page(inode->i_mapping, first_index);
  463. if (!PageUptodate(pinned[0])) {
  464. ret = btrfs_readpage(NULL, pinned[0]);
  465. BUG_ON(ret);
  466. wait_on_page_locked(pinned[0]);
  467. } else {
  468. unlock_page(pinned[0]);
  469. }
  470. }
  471. if ((pos + count) & (PAGE_CACHE_SIZE - 1)) {
  472. pinned[1] = grab_cache_page(inode->i_mapping, last_index);
  473. if (!PageUptodate(pinned[1])) {
  474. ret = btrfs_readpage(NULL, pinned[1]);
  475. BUG_ON(ret);
  476. wait_on_page_locked(pinned[1]);
  477. } else {
  478. unlock_page(pinned[1]);
  479. }
  480. }
  481. mutex_lock(&root->fs_info->fs_mutex);
  482. trans = btrfs_start_transaction(root, 1);
  483. if (!trans) {
  484. err = -ENOMEM;
  485. mutex_unlock(&root->fs_info->fs_mutex);
  486. goto out_unlock;
  487. }
  488. btrfs_set_trans_block_group(trans, inode);
  489. /* FIXME blocksize != 4096 */
  490. inode->i_blocks += num_blocks << 3;
  491. hint_block = 0;
  492. /* FIXME...EIEIO, ENOSPC and more */
  493. /* step one, delete the existing extents in this range */
  494. if (start_pos < inode->i_size) {
  495. /* FIXME blocksize != pagesize */
  496. ret = btrfs_drop_extents(trans, root, inode,
  497. start_pos,
  498. (pos + count + root->blocksize -1) &
  499. ~((u64)root->blocksize - 1),
  500. &hint_block);
  501. BUG_ON(ret);
  502. }
  503. /* insert any holes we need to create */
  504. if (inode->i_size < start_pos) {
  505. u64 last_pos_in_file;
  506. u64 hole_size;
  507. u64 mask = root->blocksize - 1;
  508. last_pos_in_file = (inode->i_size + mask) & ~mask;
  509. hole_size = (start_pos - last_pos_in_file + mask) & ~mask;
  510. hole_size >>= inode->i_blkbits;
  511. if (last_pos_in_file < start_pos) {
  512. ret = btrfs_insert_file_extent(trans, root,
  513. inode->i_ino,
  514. last_pos_in_file,
  515. 0, 0, hole_size);
  516. }
  517. BUG_ON(ret);
  518. }
  519. /*
  520. * either allocate an extent for the new bytes or setup the key
  521. * to show we are doing inline data in the extent
  522. */
  523. if (inode->i_size >= PAGE_CACHE_SIZE || pos + count < inode->i_size ||
  524. pos + count - start_pos > BTRFS_MAX_INLINE_DATA_SIZE(root)) {
  525. ret = btrfs_alloc_extent(trans, root, inode->i_ino,
  526. num_blocks, hint_block, (u64)-1,
  527. &ins, 1);
  528. BUG_ON(ret);
  529. ret = btrfs_insert_file_extent(trans, root, inode->i_ino,
  530. start_pos, ins.objectid, ins.offset,
  531. ins.offset);
  532. BUG_ON(ret);
  533. } else {
  534. ins.offset = 0;
  535. ins.objectid = 0;
  536. }
  537. BUG_ON(ret);
  538. alloc_extent_start = ins.objectid;
  539. ret = btrfs_end_transaction(trans, root);
  540. mutex_unlock(&root->fs_info->fs_mutex);
  541. while(count > 0) {
  542. size_t offset = pos & (PAGE_CACHE_SIZE - 1);
  543. size_t write_bytes = min(count,
  544. (size_t)PAGE_CACHE_SIZE - offset);
  545. size_t num_pages = (write_bytes + PAGE_CACHE_SIZE - 1) >>
  546. PAGE_CACHE_SHIFT;
  547. memset(pages, 0, sizeof(pages));
  548. ret = prepare_pages(root, file, pages, num_pages,
  549. pos, first_index, last_index,
  550. write_bytes, alloc_extent_start);
  551. BUG_ON(ret);
  552. /* FIXME blocks != pagesize */
  553. if (alloc_extent_start)
  554. alloc_extent_start += num_pages;
  555. ret = btrfs_copy_from_user(pos, num_pages,
  556. write_bytes, pages, buf);
  557. BUG_ON(ret);
  558. ret = dirty_and_release_pages(NULL, root, file, pages,
  559. num_pages, pos, write_bytes);
  560. BUG_ON(ret);
  561. btrfs_drop_pages(pages, num_pages);
  562. buf += write_bytes;
  563. count -= write_bytes;
  564. pos += write_bytes;
  565. num_written += write_bytes;
  566. balance_dirty_pages_ratelimited(inode->i_mapping);
  567. btrfs_btree_balance_dirty(root);
  568. cond_resched();
  569. }
  570. out_unlock:
  571. mutex_unlock(&inode->i_mutex);
  572. out:
  573. if (pinned[0])
  574. page_cache_release(pinned[0]);
  575. if (pinned[1])
  576. page_cache_release(pinned[1]);
  577. *ppos = pos;
  578. current->backing_dev_info = NULL;
  579. mark_inode_dirty(inode);
  580. return num_written ? num_written : err;
  581. }
  582. static int btrfs_sync_file(struct file *file,
  583. struct dentry *dentry, int datasync)
  584. {
  585. struct inode *inode = dentry->d_inode;
  586. struct btrfs_root *root = BTRFS_I(inode)->root;
  587. int ret;
  588. struct btrfs_trans_handle *trans;
  589. /*
  590. * FIXME, use inode generation number to check if we can skip the
  591. * commit
  592. */
  593. mutex_lock(&root->fs_info->fs_mutex);
  594. trans = btrfs_start_transaction(root, 1);
  595. if (!trans) {
  596. ret = -ENOMEM;
  597. goto out;
  598. }
  599. ret = btrfs_commit_transaction(trans, root);
  600. mutex_unlock(&root->fs_info->fs_mutex);
  601. out:
  602. return ret > 0 ? EIO : ret;
  603. }
  604. static struct vm_operations_struct btrfs_file_vm_ops = {
  605. .nopage = filemap_nopage,
  606. .populate = filemap_populate,
  607. .page_mkwrite = btrfs_page_mkwrite,
  608. };
  609. static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma)
  610. {
  611. vma->vm_ops = &btrfs_file_vm_ops;
  612. file_accessed(filp);
  613. return 0;
  614. }
  615. struct file_operations btrfs_file_operations = {
  616. .llseek = generic_file_llseek,
  617. .read = do_sync_read,
  618. .aio_read = generic_file_aio_read,
  619. .write = btrfs_file_write,
  620. .mmap = btrfs_file_mmap,
  621. .open = generic_file_open,
  622. .ioctl = btrfs_ioctl,
  623. .fsync = btrfs_sync_file,
  624. #ifdef CONFIG_COMPAT
  625. .compat_ioctl = btrfs_compat_ioctl,
  626. #endif
  627. };