1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52#include "ubifs.h"
53#include <linux/mount.h>
54#include <linux/namei.h>
55#include <linux/slab.h>
56
57static int read_block(struct inode *inode, void *addr, unsigned int block,
58 struct ubifs_data_node *dn)
59{
60 struct ubifs_info *c = inode->i_sb->s_fs_info;
61 int err, len, out_len;
62 union ubifs_key key;
63 unsigned int dlen;
64
65 data_key_init(c, &key, inode->i_ino, block);
66 err = ubifs_tnc_lookup(c, &key, dn);
67 if (err) {
68 if (err == -ENOENT)
69
70 memset(addr, 0, UBIFS_BLOCK_SIZE);
71 return err;
72 }
73
74 ubifs_assert(le64_to_cpu(dn->ch.sqnum) >
75 ubifs_inode(inode)->creat_sqnum);
76 len = le32_to_cpu(dn->size);
77 if (len <= 0 || len > UBIFS_BLOCK_SIZE)
78 goto dump;
79
80 dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
81 out_len = UBIFS_BLOCK_SIZE;
82 err = ubifs_decompress(&dn->data, dlen, addr, &out_len,
83 le16_to_cpu(dn->compr_type));
84 if (err || len != out_len)
85 goto dump;
86
87
88
89
90
91
92 if (len < UBIFS_BLOCK_SIZE)
93 memset(addr + len, 0, UBIFS_BLOCK_SIZE - len);
94
95 return 0;
96
97dump:
98 ubifs_err("bad data node (block %u, inode %lu)",
99 block, inode->i_ino);
100 dbg_dump_node(c, dn);
101 return -EINVAL;
102}
103
104static int do_readpage(struct page *page)
105{
106 void *addr;
107 int err = 0, i;
108 unsigned int block, beyond;
109 struct ubifs_data_node *dn;
110 struct inode *inode = page->mapping->host;
111 loff_t i_size = i_size_read(inode);
112
113 dbg_gen("ino %lu, pg %lu, i_size %lld, flags %#lx",
114 inode->i_ino, page->index, i_size, page->flags);
115 ubifs_assert(!PageChecked(page));
116 ubifs_assert(!PagePrivate(page));
117
118 addr = kmap(page);
119
120 block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
121 beyond = (i_size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT;
122 if (block >= beyond) {
123
124 SetPageChecked(page);
125 memset(addr, 0, PAGE_CACHE_SIZE);
126 goto out;
127 }
128
129 dn = kmalloc(UBIFS_MAX_DATA_NODE_SZ, GFP_NOFS);
130 if (!dn) {
131 err = -ENOMEM;
132 goto error;
133 }
134
135 i = 0;
136 while (1) {
137 int ret;
138
139 if (block >= beyond) {
140
141 err = -ENOENT;
142 memset(addr, 0, UBIFS_BLOCK_SIZE);
143 } else {
144 ret = read_block(inode, addr, block, dn);
145 if (ret) {
146 err = ret;
147 if (err != -ENOENT)
148 break;
149 } else if (block + 1 == beyond) {
150 int dlen = le32_to_cpu(dn->size);
151 int ilen = i_size & (UBIFS_BLOCK_SIZE - 1);
152
153 if (ilen && ilen < dlen)
154 memset(addr + ilen, 0, dlen - ilen);
155 }
156 }
157 if (++i >= UBIFS_BLOCKS_PER_PAGE)
158 break;
159 block += 1;
160 addr += UBIFS_BLOCK_SIZE;
161 }
162 if (err) {
163 if (err == -ENOENT) {
164
165 SetPageChecked(page);
166 dbg_gen("hole");
167 goto out_free;
168 }
169 ubifs_err("cannot read page %lu of inode %lu, error %d",
170 page->index, inode->i_ino, err);
171 goto error;
172 }
173
174out_free:
175 kfree(dn);
176out:
177 SetPageUptodate(page);
178 ClearPageError(page);
179 flush_dcache_page(page);
180 kunmap(page);
181 return 0;
182
183error:
184 kfree(dn);
185 ClearPageUptodate(page);
186 SetPageError(page);
187 flush_dcache_page(page);
188 kunmap(page);
189 return err;
190}
191
192
193
194
195
196
197
198
199static void release_new_page_budget(struct ubifs_info *c)
200{
201 struct ubifs_budget_req req = { .recalculate = 1, .new_page = 1 };
202
203 ubifs_release_budget(c, &req);
204}
205
206
207
208
209
210
211
212
213static void release_existing_page_budget(struct ubifs_info *c)
214{
215 struct ubifs_budget_req req = { .dd_growth = c->bi.page_budget};
216
217 ubifs_release_budget(c, &req);
218}
219
220static int write_begin_slow(struct address_space *mapping,
221 loff_t pos, unsigned len, struct page **pagep,
222 unsigned flags)
223{
224 struct inode *inode = mapping->host;
225 struct ubifs_info *c = inode->i_sb->s_fs_info;
226 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
227 struct ubifs_budget_req req = { .new_page = 1 };
228 int uninitialized_var(err), appending = !!(pos + len > inode->i_size);
229 struct page *page;
230
231 dbg_gen("ino %lu, pos %llu, len %u, i_size %lld",
232 inode->i_ino, pos, len, inode->i_size);
233
234
235
236
237
238
239
240
241
242 if (appending)
243
244 req.dirtied_ino = 1;
245
246 err = ubifs_budget_space(c, &req);
247 if (unlikely(err))
248 return err;
249
250 page = grab_cache_page_write_begin(mapping, index, flags);
251 if (unlikely(!page)) {
252 ubifs_release_budget(c, &req);
253 return -ENOMEM;
254 }
255
256 if (!PageUptodate(page)) {
257 if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE)
258 SetPageChecked(page);
259 else {
260 err = do_readpage(page);
261 if (err) {
262 unlock_page(page);
263 page_cache_release(page);
264 return err;
265 }
266 }
267
268 SetPageUptodate(page);
269 ClearPageError(page);
270 }
271
272 if (PagePrivate(page))
273
274
275
276
277
278
279
280
281
282
283 release_new_page_budget(c);
284 else if (!PageChecked(page))
285
286
287
288
289
290
291 ubifs_convert_page_budget(c);
292
293 if (appending) {
294 struct ubifs_inode *ui = ubifs_inode(inode);
295
296
297
298
299
300
301 mutex_lock(&ui->ui_mutex);
302 if (ui->dirty)
303
304
305
306
307 ubifs_release_dirty_inode_budget(c, ui);
308 }
309
310 *pagep = page;
311 return 0;
312}
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327static int allocate_budget(struct ubifs_info *c, struct page *page,
328 struct ubifs_inode *ui, int appending)
329{
330 struct ubifs_budget_req req = { .fast = 1 };
331
332 if (PagePrivate(page)) {
333 if (!appending)
334
335
336
337
338 return 0;
339
340 mutex_lock(&ui->ui_mutex);
341 if (ui->dirty)
342
343
344
345
346
347
348
349
350
351 return 0;
352
353
354
355
356
357 req.dirtied_ino = 1;
358 } else {
359 if (PageChecked(page))
360
361
362
363
364
365
366
367 req.new_page = 1;
368 else
369
370
371
372
373
374 req.dirtied_page = 1;
375
376 if (appending) {
377 mutex_lock(&ui->ui_mutex);
378 if (!ui->dirty)
379
380
381
382
383
384 req.dirtied_ino = 1;
385 }
386 }
387
388 return ubifs_budget_space(c, &req);
389}
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423static int ubifs_write_begin(struct file *file, struct address_space *mapping,
424 loff_t pos, unsigned len, unsigned flags,
425 struct page **pagep, void **fsdata)
426{
427 struct inode *inode = mapping->host;
428 struct ubifs_info *c = inode->i_sb->s_fs_info;
429 struct ubifs_inode *ui = ubifs_inode(inode);
430 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
431 int uninitialized_var(err), appending = !!(pos + len > inode->i_size);
432 int skipped_read = 0;
433 struct page *page;
434
435 ubifs_assert(ubifs_inode(inode)->ui_size == inode->i_size);
436 ubifs_assert(!c->ro_media && !c->ro_mount);
437
438 if (unlikely(c->ro_error))
439 return -EROFS;
440
441
442 page = grab_cache_page_write_begin(mapping, index, flags);
443 if (unlikely(!page))
444 return -ENOMEM;
445
446 if (!PageUptodate(page)) {
447
448 if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE) {
449
450
451
452
453
454
455
456
457
458 SetPageChecked(page);
459 skipped_read = 1;
460 } else {
461 err = do_readpage(page);
462 if (err) {
463 unlock_page(page);
464 page_cache_release(page);
465 return err;
466 }
467 }
468
469 SetPageUptodate(page);
470 ClearPageError(page);
471 }
472
473 err = allocate_budget(c, page, ui, appending);
474 if (unlikely(err)) {
475 ubifs_assert(err == -ENOSPC);
476
477
478
479
480 if (skipped_read) {
481 ClearPageChecked(page);
482 ClearPageUptodate(page);
483 }
484
485
486
487
488
489
490
491 if (appending) {
492 ubifs_assert(mutex_is_locked(&ui->ui_mutex));
493 mutex_unlock(&ui->ui_mutex);
494 }
495 unlock_page(page);
496 page_cache_release(page);
497
498 return write_begin_slow(mapping, pos, len, pagep, flags);
499 }
500
501
502
503
504
505
506
507 *pagep = page;
508 return 0;
509
510}
511
512
513
514
515
516
517
518
519
520
521
522static void cancel_budget(struct ubifs_info *c, struct page *page,
523 struct ubifs_inode *ui, int appending)
524{
525 if (appending) {
526 if (!ui->dirty)
527 ubifs_release_dirty_inode_budget(c, ui);
528 mutex_unlock(&ui->ui_mutex);
529 }
530 if (!PagePrivate(page)) {
531 if (PageChecked(page))
532 release_new_page_budget(c);
533 else
534 release_existing_page_budget(c);
535 }
536}
537
538static int ubifs_write_end(struct file *file, struct address_space *mapping,
539 loff_t pos, unsigned len, unsigned copied,
540 struct page *page, void *fsdata)
541{
542 struct inode *inode = mapping->host;
543 struct ubifs_inode *ui = ubifs_inode(inode);
544 struct ubifs_info *c = inode->i_sb->s_fs_info;
545 loff_t end_pos = pos + len;
546 int appending = !!(end_pos > inode->i_size);
547
548 dbg_gen("ino %lu, pos %llu, pg %lu, len %u, copied %d, i_size %lld",
549 inode->i_ino, pos, page->index, len, copied, inode->i_size);
550
551 if (unlikely(copied < len && len == PAGE_CACHE_SIZE)) {
552
553
554
555
556
557
558
559
560
561 dbg_gen("copied %d instead of %d, read page and repeat",
562 copied, len);
563 cancel_budget(c, page, ui, appending);
564 ClearPageChecked(page);
565
566
567
568
569
570 copied = do_readpage(page);
571 goto out;
572 }
573
574 if (!PagePrivate(page)) {
575 SetPagePrivate(page);
576 atomic_long_inc(&c->dirty_pg_cnt);
577 __set_page_dirty_nobuffers(page);
578 }
579
580 if (appending) {
581 i_size_write(inode, end_pos);
582 ui->ui_size = end_pos;
583
584
585
586
587
588 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
589 ubifs_assert(mutex_is_locked(&ui->ui_mutex));
590 mutex_unlock(&ui->ui_mutex);
591 }
592
593out:
594 unlock_page(page);
595 page_cache_release(page);
596 return copied;
597}
598
599
600
601
602
603
604
605
606
607
608static int populate_page(struct ubifs_info *c, struct page *page,
609 struct bu_info *bu, int *n)
610{
611 int i = 0, nn = *n, offs = bu->zbranch[0].offs, hole = 0, read = 0;
612 struct inode *inode = page->mapping->host;
613 loff_t i_size = i_size_read(inode);
614 unsigned int page_block;
615 void *addr, *zaddr;
616 pgoff_t end_index;
617
618 dbg_gen("ino %lu, pg %lu, i_size %lld, flags %#lx",
619 inode->i_ino, page->index, i_size, page->flags);
620
621 addr = zaddr = kmap(page);
622
623 end_index = (i_size - 1) >> PAGE_CACHE_SHIFT;
624 if (!i_size || page->index > end_index) {
625 hole = 1;
626 memset(addr, 0, PAGE_CACHE_SIZE);
627 goto out_hole;
628 }
629
630 page_block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
631 while (1) {
632 int err, len, out_len, dlen;
633
634 if (nn >= bu->cnt) {
635 hole = 1;
636 memset(addr, 0, UBIFS_BLOCK_SIZE);
637 } else if (key_block(c, &bu->zbranch[nn].key) == page_block) {
638 struct ubifs_data_node *dn;
639
640 dn = bu->buf + (bu->zbranch[nn].offs - offs);
641
642 ubifs_assert(le64_to_cpu(dn->ch.sqnum) >
643 ubifs_inode(inode)->creat_sqnum);
644
645 len = le32_to_cpu(dn->size);
646 if (len <= 0 || len > UBIFS_BLOCK_SIZE)
647 goto out_err;
648
649 dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
650 out_len = UBIFS_BLOCK_SIZE;
651 err = ubifs_decompress(&dn->data, dlen, addr, &out_len,
652 le16_to_cpu(dn->compr_type));
653 if (err || len != out_len)
654 goto out_err;
655
656 if (len < UBIFS_BLOCK_SIZE)
657 memset(addr + len, 0, UBIFS_BLOCK_SIZE - len);
658
659 nn += 1;
660 read = (i << UBIFS_BLOCK_SHIFT) + len;
661 } else if (key_block(c, &bu->zbranch[nn].key) < page_block) {
662 nn += 1;
663 continue;
664 } else {
665 hole = 1;
666 memset(addr, 0, UBIFS_BLOCK_SIZE);
667 }
668 if (++i >= UBIFS_BLOCKS_PER_PAGE)
669 break;
670 addr += UBIFS_BLOCK_SIZE;
671 page_block += 1;
672 }
673
674 if (end_index == page->index) {
675 int len = i_size & (PAGE_CACHE_SIZE - 1);
676
677 if (len && len < read)
678 memset(zaddr + len, 0, read - len);
679 }
680
681out_hole:
682 if (hole) {
683 SetPageChecked(page);
684 dbg_gen("hole");
685 }
686
687 SetPageUptodate(page);
688 ClearPageError(page);
689 flush_dcache_page(page);
690 kunmap(page);
691 *n = nn;
692 return 0;
693
694out_err:
695 ClearPageUptodate(page);
696 SetPageError(page);
697 flush_dcache_page(page);
698 kunmap(page);
699 ubifs_err("bad data node (block %u, inode %lu)",
700 page_block, inode->i_ino);
701 return -EINVAL;
702}
703
704
705
706
707
708
709
710
711
712static int ubifs_do_bulk_read(struct ubifs_info *c, struct bu_info *bu,
713 struct page *page1)
714{
715 pgoff_t offset = page1->index, end_index;
716 struct address_space *mapping = page1->mapping;
717 struct inode *inode = mapping->host;
718 struct ubifs_inode *ui = ubifs_inode(inode);
719 int err, page_idx, page_cnt, ret = 0, n = 0;
720 int allocate = bu->buf ? 0 : 1;
721 loff_t isize;
722
723 err = ubifs_tnc_get_bu_keys(c, bu);
724 if (err)
725 goto out_warn;
726
727 if (bu->eof) {
728
729 ui->read_in_a_row = 1;
730 ui->bulk_read = 0;
731 }
732
733 page_cnt = bu->blk_cnt >> UBIFS_BLOCKS_PER_PAGE_SHIFT;
734 if (!page_cnt) {
735
736
737
738
739
740
741 goto out_bu_off;
742 }
743
744 if (bu->cnt) {
745 if (allocate) {
746
747
748
749
750 bu->buf_len = bu->zbranch[bu->cnt - 1].offs +
751 bu->zbranch[bu->cnt - 1].len -
752 bu->zbranch[0].offs;
753 ubifs_assert(bu->buf_len > 0);
754 ubifs_assert(bu->buf_len <= c->leb_size);
755 bu->buf = kmalloc(bu->buf_len, GFP_NOFS | __GFP_NOWARN);
756 if (!bu->buf)
757 goto out_bu_off;
758 }
759
760 err = ubifs_tnc_bulk_read(c, bu);
761 if (err)
762 goto out_warn;
763 }
764
765 err = populate_page(c, page1, bu, &n);
766 if (err)
767 goto out_warn;
768
769 unlock_page(page1);
770 ret = 1;
771
772 isize = i_size_read(inode);
773 if (isize == 0)
774 goto out_free;
775 end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
776
777 for (page_idx = 1; page_idx < page_cnt; page_idx++) {
778 pgoff_t page_offset = offset + page_idx;
779 struct page *page;
780
781 if (page_offset > end_index)
782 break;
783 page = find_or_create_page(mapping, page_offset,
784 GFP_NOFS | __GFP_COLD);
785 if (!page)
786 break;
787 if (!PageUptodate(page))
788 err = populate_page(c, page, bu, &n);
789 unlock_page(page);
790 page_cache_release(page);
791 if (err)
792 break;
793 }
794
795 ui->last_page_read = offset + page_idx - 1;
796
797out_free:
798 if (allocate)
799 kfree(bu->buf);
800 return ret;
801
802out_warn:
803 ubifs_warn("ignoring error %d and skipping bulk-read", err);
804 goto out_free;
805
806out_bu_off:
807 ui->read_in_a_row = ui->bulk_read = 0;
808 goto out_free;
809}
810
811
812
813
814
815
816
817
818
819
820static int ubifs_bulk_read(struct page *page)
821{
822 struct inode *inode = page->mapping->host;
823 struct ubifs_info *c = inode->i_sb->s_fs_info;
824 struct ubifs_inode *ui = ubifs_inode(inode);
825 pgoff_t index = page->index, last_page_read = ui->last_page_read;
826 struct bu_info *bu;
827 int err = 0, allocated = 0;
828
829 ui->last_page_read = index;
830 if (!c->bulk_read)
831 return 0;
832
833
834
835
836
837 if (!mutex_trylock(&ui->ui_mutex))
838 return 0;
839
840 if (index != last_page_read + 1) {
841
842 ui->read_in_a_row = 1;
843 if (ui->bulk_read)
844 ui->bulk_read = 0;
845 goto out_unlock;
846 }
847
848 if (!ui->bulk_read) {
849 ui->read_in_a_row += 1;
850 if (ui->read_in_a_row < 3)
851 goto out_unlock;
852
853 ui->bulk_read = 1;
854 }
855
856
857
858
859
860 if (mutex_trylock(&c->bu_mutex))
861 bu = &c->bu;
862 else {
863 bu = kmalloc(sizeof(struct bu_info), GFP_NOFS | __GFP_NOWARN);
864 if (!bu)
865 goto out_unlock;
866
867 bu->buf = NULL;
868 allocated = 1;
869 }
870
871 bu->buf_len = c->max_bu_buf_len;
872 data_key_init(c, &bu->key, inode->i_ino,
873 page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT);
874 err = ubifs_do_bulk_read(c, bu, page);
875
876 if (!allocated)
877 mutex_unlock(&c->bu_mutex);
878 else
879 kfree(bu);
880
881out_unlock:
882 mutex_unlock(&ui->ui_mutex);
883 return err;
884}
885
886static int ubifs_readpage(struct file *file, struct page *page)
887{
888 if (ubifs_bulk_read(page))
889 return 0;
890 do_readpage(page);
891 unlock_page(page);
892 return 0;
893}
894
895static int do_writepage(struct page *page, int len)
896{
897 int err = 0, i, blen;
898 unsigned int block;
899 void *addr;
900 union ubifs_key key;
901 struct inode *inode = page->mapping->host;
902 struct ubifs_info *c = inode->i_sb->s_fs_info;
903
904#ifdef UBIFS_DEBUG
905 spin_lock(&ui->ui_lock);
906 ubifs_assert(page->index <= ui->synced_i_size << PAGE_CACHE_SIZE);
907 spin_unlock(&ui->ui_lock);
908#endif
909
910
911 set_page_writeback(page);
912
913 addr = kmap(page);
914 block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
915 i = 0;
916 while (len) {
917 blen = min_t(int, len, UBIFS_BLOCK_SIZE);
918 data_key_init(c, &key, inode->i_ino, block);
919 err = ubifs_jnl_write_data(c, inode, &key, addr, blen);
920 if (err)
921 break;
922 if (++i >= UBIFS_BLOCKS_PER_PAGE)
923 break;
924 block += 1;
925 addr += blen;
926 len -= blen;
927 }
928 if (err) {
929 SetPageError(page);
930 ubifs_err("cannot write page %lu of inode %lu, error %d",
931 page->index, inode->i_ino, err);
932 ubifs_ro_mode(c, err);
933 }
934
935 ubifs_assert(PagePrivate(page));
936 if (PageChecked(page))
937 release_new_page_budget(c);
938 else
939 release_existing_page_budget(c);
940
941 atomic_long_dec(&c->dirty_pg_cnt);
942 ClearPagePrivate(page);
943 ClearPageChecked(page);
944
945 kunmap(page);
946 unlock_page(page);
947 end_page_writeback(page);
948 return err;
949}
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997static int ubifs_writepage(struct page *page, struct writeback_control *wbc)
998{
999 struct inode *inode = page->mapping->host;
1000 struct ubifs_inode *ui = ubifs_inode(inode);
1001 loff_t i_size = i_size_read(inode), synced_i_size;
1002 pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
1003 int err, len = i_size & (PAGE_CACHE_SIZE - 1);
1004 void *kaddr;
1005
1006 dbg_gen("ino %lu, pg %lu, pg flags %#lx",
1007 inode->i_ino, page->index, page->flags);
1008 ubifs_assert(PagePrivate(page));
1009
1010
1011 if (page->index > end_index || (page->index == end_index && !len)) {
1012 err = 0;
1013 goto out_unlock;
1014 }
1015
1016 spin_lock(&ui->ui_lock);
1017 synced_i_size = ui->synced_i_size;
1018 spin_unlock(&ui->ui_lock);
1019
1020
1021 if (page->index < end_index) {
1022 if (page->index >= synced_i_size >> PAGE_CACHE_SHIFT) {
1023 err = inode->i_sb->s_op->write_inode(inode, NULL);
1024 if (err)
1025 goto out_unlock;
1026
1027
1028
1029
1030
1031
1032
1033
1034 }
1035 return do_writepage(page, PAGE_CACHE_SIZE);
1036 }
1037
1038
1039
1040
1041
1042
1043
1044
1045 kaddr = kmap_atomic(page, KM_USER0);
1046 memset(kaddr + len, 0, PAGE_CACHE_SIZE - len);
1047 flush_dcache_page(page);
1048 kunmap_atomic(kaddr, KM_USER0);
1049
1050 if (i_size > synced_i_size) {
1051 err = inode->i_sb->s_op->write_inode(inode, NULL);
1052 if (err)
1053 goto out_unlock;
1054 }
1055
1056 return do_writepage(page, len);
1057
1058out_unlock:
1059 unlock_page(page);
1060 return err;
1061}
1062
1063
1064
1065
1066
1067
1068static void do_attr_changes(struct inode *inode, const struct iattr *attr)
1069{
1070 if (attr->ia_valid & ATTR_UID)
1071 inode->i_uid = attr->ia_uid;
1072 if (attr->ia_valid & ATTR_GID)
1073 inode->i_gid = attr->ia_gid;
1074 if (attr->ia_valid & ATTR_ATIME)
1075 inode->i_atime = timespec_trunc(attr->ia_atime,
1076 inode->i_sb->s_time_gran);
1077 if (attr->ia_valid & ATTR_MTIME)
1078 inode->i_mtime = timespec_trunc(attr->ia_mtime,
1079 inode->i_sb->s_time_gran);
1080 if (attr->ia_valid & ATTR_CTIME)
1081 inode->i_ctime = timespec_trunc(attr->ia_ctime,
1082 inode->i_sb->s_time_gran);
1083 if (attr->ia_valid & ATTR_MODE) {
1084 umode_t mode = attr->ia_mode;
1085
1086 if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
1087 mode &= ~S_ISGID;
1088 inode->i_mode = mode;
1089 }
1090}
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102static int do_truncation(struct ubifs_info *c, struct inode *inode,
1103 const struct iattr *attr)
1104{
1105 int err;
1106 struct ubifs_budget_req req;
1107 loff_t old_size = inode->i_size, new_size = attr->ia_size;
1108 int offset = new_size & (UBIFS_BLOCK_SIZE - 1), budgeted = 1;
1109 struct ubifs_inode *ui = ubifs_inode(inode);
1110
1111 dbg_gen("ino %lu, size %lld -> %lld", inode->i_ino, old_size, new_size);
1112 memset(&req, 0, sizeof(struct ubifs_budget_req));
1113
1114
1115
1116
1117
1118
1119 if (new_size & (UBIFS_BLOCK_SIZE - 1))
1120 req.dirtied_page = 1;
1121
1122 req.dirtied_ino = 1;
1123
1124 req.dirtied_ino_d = UBIFS_TRUN_NODE_SZ;
1125 err = ubifs_budget_space(c, &req);
1126 if (err) {
1127
1128
1129
1130
1131 if (new_size || err != -ENOSPC)
1132 return err;
1133 budgeted = 0;
1134 }
1135
1136 truncate_setsize(inode, new_size);
1137
1138 if (offset) {
1139 pgoff_t index = new_size >> PAGE_CACHE_SHIFT;
1140 struct page *page;
1141
1142 page = find_lock_page(inode->i_mapping, index);
1143 if (page) {
1144 if (PageDirty(page)) {
1145
1146
1147
1148
1149
1150
1151
1152
1153 ubifs_assert(PagePrivate(page));
1154
1155 clear_page_dirty_for_io(page);
1156 if (UBIFS_BLOCKS_PER_PAGE_SHIFT)
1157 offset = new_size &
1158 (PAGE_CACHE_SIZE - 1);
1159 err = do_writepage(page, offset);
1160 page_cache_release(page);
1161 if (err)
1162 goto out_budg;
1163
1164
1165
1166
1167 } else {
1168
1169
1170
1171
1172
1173 unlock_page(page);
1174 page_cache_release(page);
1175 }
1176 }
1177 }
1178
1179 mutex_lock(&ui->ui_mutex);
1180 ui->ui_size = inode->i_size;
1181
1182 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1183
1184 do_attr_changes(inode, attr);
1185 err = ubifs_jnl_truncate(c, inode, old_size, new_size);
1186 mutex_unlock(&ui->ui_mutex);
1187
1188out_budg:
1189 if (budgeted)
1190 ubifs_release_budget(c, &req);
1191 else {
1192 c->bi.nospace = c->bi.nospace_rp = 0;
1193 smp_wmb();
1194 }
1195 return err;
1196}
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208static int do_setattr(struct ubifs_info *c, struct inode *inode,
1209 const struct iattr *attr)
1210{
1211 int err, release;
1212 loff_t new_size = attr->ia_size;
1213 struct ubifs_inode *ui = ubifs_inode(inode);
1214 struct ubifs_budget_req req = { .dirtied_ino = 1,
1215 .dirtied_ino_d = ALIGN(ui->data_len, 8) };
1216
1217 err = ubifs_budget_space(c, &req);
1218 if (err)
1219 return err;
1220
1221 if (attr->ia_valid & ATTR_SIZE) {
1222 dbg_gen("size %lld -> %lld", inode->i_size, new_size);
1223 truncate_setsize(inode, new_size);
1224 }
1225
1226 mutex_lock(&ui->ui_mutex);
1227 if (attr->ia_valid & ATTR_SIZE) {
1228
1229 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1230
1231 ui->ui_size = inode->i_size;
1232 }
1233
1234 do_attr_changes(inode, attr);
1235
1236 release = ui->dirty;
1237 if (attr->ia_valid & ATTR_SIZE)
1238
1239
1240
1241
1242 __mark_inode_dirty(inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
1243 else
1244 mark_inode_dirty_sync(inode);
1245 mutex_unlock(&ui->ui_mutex);
1246
1247 if (release)
1248 ubifs_release_budget(c, &req);
1249 if (IS_SYNC(inode))
1250 err = inode->i_sb->s_op->write_inode(inode, NULL);
1251 return err;
1252}
1253
1254int ubifs_setattr(struct dentry *dentry, struct iattr *attr)
1255{
1256 int err;
1257 struct inode *inode = dentry->d_inode;
1258 struct ubifs_info *c = inode->i_sb->s_fs_info;
1259
1260 dbg_gen("ino %lu, mode %#x, ia_valid %#x",
1261 inode->i_ino, inode->i_mode, attr->ia_valid);
1262 err = inode_change_ok(inode, attr);
1263 if (err)
1264 return err;
1265
1266 err = dbg_check_synced_i_size(c, inode);
1267 if (err)
1268 return err;
1269
1270 if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size < inode->i_size)
1271
1272 err = do_truncation(c, inode, attr);
1273 else
1274 err = do_setattr(c, inode, attr);
1275
1276 return err;
1277}
1278
1279static void ubifs_invalidatepage(struct page *page, unsigned long offset)
1280{
1281 struct inode *inode = page->mapping->host;
1282 struct ubifs_info *c = inode->i_sb->s_fs_info;
1283
1284 ubifs_assert(PagePrivate(page));
1285 if (offset)
1286
1287 return;
1288
1289 if (PageChecked(page))
1290 release_new_page_budget(c);
1291 else
1292 release_existing_page_budget(c);
1293
1294 atomic_long_dec(&c->dirty_pg_cnt);
1295 ClearPagePrivate(page);
1296 ClearPageChecked(page);
1297}
1298
1299static void *ubifs_follow_link(struct dentry *dentry, struct nameidata *nd)
1300{
1301 struct ubifs_inode *ui = ubifs_inode(dentry->d_inode);
1302
1303 nd_set_link(nd, ui->data);
1304 return NULL;
1305}
1306
1307int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1308{
1309 struct inode *inode = file->f_mapping->host;
1310 struct ubifs_info *c = inode->i_sb->s_fs_info;
1311 int err;
1312
1313 dbg_gen("syncing inode %lu", inode->i_ino);
1314
1315 if (c->ro_mount)
1316
1317
1318
1319
1320 return 0;
1321
1322 err = filemap_write_and_wait_range(inode->i_mapping, start, end);
1323 if (err)
1324 return err;
1325 mutex_lock(&inode->i_mutex);
1326
1327
1328 if (!datasync || (inode->i_state & I_DIRTY_DATASYNC)) {
1329 err = inode->i_sb->s_op->write_inode(inode, NULL);
1330 if (err)
1331 goto out;
1332 }
1333
1334
1335
1336
1337
1338 err = ubifs_sync_wbufs_by_inode(c, inode);
1339out:
1340 mutex_unlock(&inode->i_mutex);
1341 return err;
1342}
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353static inline int mctime_update_needed(const struct inode *inode,
1354 const struct timespec *now)
1355{
1356 if (!timespec_equal(&inode->i_mtime, now) ||
1357 !timespec_equal(&inode->i_ctime, now))
1358 return 1;
1359 return 0;
1360}
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371static int update_mctime(struct ubifs_info *c, struct inode *inode)
1372{
1373 struct timespec now = ubifs_current_time(inode);
1374 struct ubifs_inode *ui = ubifs_inode(inode);
1375
1376 if (mctime_update_needed(inode, &now)) {
1377 int err, release;
1378 struct ubifs_budget_req req = { .dirtied_ino = 1,
1379 .dirtied_ino_d = ALIGN(ui->data_len, 8) };
1380
1381 err = ubifs_budget_space(c, &req);
1382 if (err)
1383 return err;
1384
1385 mutex_lock(&ui->ui_mutex);
1386 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1387 release = ui->dirty;
1388 mark_inode_dirty_sync(inode);
1389 mutex_unlock(&ui->ui_mutex);
1390 if (release)
1391 ubifs_release_budget(c, &req);
1392 }
1393
1394 return 0;
1395}
1396
1397static ssize_t ubifs_aio_write(struct kiocb *iocb, const struct iovec *iov,
1398 unsigned long nr_segs, loff_t pos)
1399{
1400 int err;
1401 struct inode *inode = iocb->ki_filp->f_mapping->host;
1402 struct ubifs_info *c = inode->i_sb->s_fs_info;
1403
1404 err = update_mctime(c, inode);
1405 if (err)
1406 return err;
1407
1408 return generic_file_aio_write(iocb, iov, nr_segs, pos);
1409}
1410
1411static int ubifs_set_page_dirty(struct page *page)
1412{
1413 int ret;
1414
1415 ret = __set_page_dirty_nobuffers(page);
1416
1417
1418
1419
1420 ubifs_assert(ret == 0);
1421 return ret;
1422}
1423
1424static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
1425{
1426
1427
1428
1429
1430 if (PageWriteback(page))
1431 return 0;
1432 ubifs_assert(PagePrivate(page));
1433 ubifs_assert(0);
1434 ClearPagePrivate(page);
1435 ClearPageChecked(page);
1436 return 1;
1437}
1438
1439
1440
1441
1442
1443static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma,
1444 struct vm_fault *vmf)
1445{
1446 struct page *page = vmf->page;
1447 struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
1448 struct ubifs_info *c = inode->i_sb->s_fs_info;
1449 struct timespec now = ubifs_current_time(inode);
1450 struct ubifs_budget_req req = { .new_page = 1 };
1451 int err, update_time;
1452
1453 dbg_gen("ino %lu, pg %lu, i_size %lld", inode->i_ino, page->index,
1454 i_size_read(inode));
1455 ubifs_assert(!c->ro_media && !c->ro_mount);
1456
1457 if (unlikely(c->ro_error))
1458 return VM_FAULT_SIGBUS;
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478 update_time = mctime_update_needed(inode, &now);
1479 if (update_time)
1480
1481
1482
1483
1484 req.dirtied_ino = 1;
1485
1486 err = ubifs_budget_space(c, &req);
1487 if (unlikely(err)) {
1488 if (err == -ENOSPC)
1489 ubifs_warn("out of space for mmapped file "
1490 "(inode number %lu)", inode->i_ino);
1491 return VM_FAULT_SIGBUS;
1492 }
1493
1494 lock_page(page);
1495 if (unlikely(page->mapping != inode->i_mapping ||
1496 page_offset(page) > i_size_read(inode))) {
1497
1498 err = -EINVAL;
1499 goto out_unlock;
1500 }
1501
1502 if (PagePrivate(page))
1503 release_new_page_budget(c);
1504 else {
1505 if (!PageChecked(page))
1506 ubifs_convert_page_budget(c);
1507 SetPagePrivate(page);
1508 atomic_long_inc(&c->dirty_pg_cnt);
1509 __set_page_dirty_nobuffers(page);
1510 }
1511
1512 if (update_time) {
1513 int release;
1514 struct ubifs_inode *ui = ubifs_inode(inode);
1515
1516 mutex_lock(&ui->ui_mutex);
1517 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1518 release = ui->dirty;
1519 mark_inode_dirty_sync(inode);
1520 mutex_unlock(&ui->ui_mutex);
1521 if (release)
1522 ubifs_release_dirty_inode_budget(c, ui);
1523 }
1524
1525 unlock_page(page);
1526 return 0;
1527
1528out_unlock:
1529 unlock_page(page);
1530 ubifs_release_budget(c, &req);
1531 if (err)
1532 err = VM_FAULT_SIGBUS;
1533 return err;
1534}
1535
1536static const struct vm_operations_struct ubifs_file_vm_ops = {
1537 .fault = filemap_fault,
1538 .page_mkwrite = ubifs_vm_page_mkwrite,
1539};
1540
1541static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma)
1542{
1543 int err;
1544
1545 err = generic_file_mmap(file, vma);
1546 if (err)
1547 return err;
1548 vma->vm_ops = &ubifs_file_vm_ops;
1549 return 0;
1550}
1551
1552const struct address_space_operations ubifs_file_address_operations = {
1553 .readpage = ubifs_readpage,
1554 .writepage = ubifs_writepage,
1555 .write_begin = ubifs_write_begin,
1556 .write_end = ubifs_write_end,
1557 .invalidatepage = ubifs_invalidatepage,
1558 .set_page_dirty = ubifs_set_page_dirty,
1559 .releasepage = ubifs_releasepage,
1560};
1561
1562const struct inode_operations ubifs_file_inode_operations = {
1563 .setattr = ubifs_setattr,
1564 .getattr = ubifs_getattr,
1565#ifdef CONFIG_UBIFS_FS_XATTR
1566 .setxattr = ubifs_setxattr,
1567 .getxattr = ubifs_getxattr,
1568 .listxattr = ubifs_listxattr,
1569 .removexattr = ubifs_removexattr,
1570#endif
1571};
1572
1573const struct inode_operations ubifs_symlink_inode_operations = {
1574 .readlink = generic_readlink,
1575 .follow_link = ubifs_follow_link,
1576 .setattr = ubifs_setattr,
1577 .getattr = ubifs_getattr,
1578};
1579
1580const struct file_operations ubifs_file_operations = {
1581 .llseek = generic_file_llseek,
1582 .read = do_sync_read,
1583 .write = do_sync_write,
1584 .aio_read = generic_file_aio_read,
1585 .aio_write = ubifs_aio_write,
1586 .mmap = ubifs_file_mmap,
1587 .fsync = ubifs_fsync,
1588 .unlocked_ioctl = ubifs_ioctl,
1589 .splice_read = generic_file_splice_read,
1590 .splice_write = generic_file_splice_write,
1591#ifdef CONFIG_COMPAT
1592 .compat_ioctl = ubifs_compat_ioctl,
1593#endif
1594};
1595