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->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
437 if (unlikely(c->ro_media))
438 return -EROFS;
439
440
441 page = grab_cache_page_write_begin(mapping, index, flags);
442 if (unlikely(!page))
443 return -ENOMEM;
444
445 if (!PageUptodate(page)) {
446
447 if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE) {
448
449
450
451
452
453
454
455 SetPageChecked(page);
456 skipped_read = 1;
457 } else {
458 err = do_readpage(page);
459 if (err) {
460 unlock_page(page);
461 page_cache_release(page);
462 return err;
463 }
464 }
465
466 SetPageUptodate(page);
467 ClearPageError(page);
468 }
469
470 err = allocate_budget(c, page, ui, appending);
471 if (unlikely(err)) {
472 ubifs_assert(err == -ENOSPC);
473
474
475
476
477 if (skipped_read) {
478 ClearPageChecked(page);
479 ClearPageUptodate(page);
480 }
481
482
483
484
485
486
487
488 if (appending) {
489 ubifs_assert(mutex_is_locked(&ui->ui_mutex));
490 mutex_unlock(&ui->ui_mutex);
491 }
492 unlock_page(page);
493 page_cache_release(page);
494
495 return write_begin_slow(mapping, pos, len, pagep, flags);
496 }
497
498
499
500
501
502
503
504 *pagep = page;
505 return 0;
506
507}
508
509
510
511
512
513
514
515
516
517
518
519static void cancel_budget(struct ubifs_info *c, struct page *page,
520 struct ubifs_inode *ui, int appending)
521{
522 if (appending) {
523 if (!ui->dirty)
524 ubifs_release_dirty_inode_budget(c, ui);
525 mutex_unlock(&ui->ui_mutex);
526 }
527 if (!PagePrivate(page)) {
528 if (PageChecked(page))
529 release_new_page_budget(c);
530 else
531 release_existing_page_budget(c);
532 }
533}
534
535static int ubifs_write_end(struct file *file, struct address_space *mapping,
536 loff_t pos, unsigned len, unsigned copied,
537 struct page *page, void *fsdata)
538{
539 struct inode *inode = mapping->host;
540 struct ubifs_inode *ui = ubifs_inode(inode);
541 struct ubifs_info *c = inode->i_sb->s_fs_info;
542 loff_t end_pos = pos + len;
543 int appending = !!(end_pos > inode->i_size);
544
545 dbg_gen("ino %lu, pos %llu, pg %lu, len %u, copied %d, i_size %lld",
546 inode->i_ino, pos, page->index, len, copied, inode->i_size);
547
548 if (unlikely(copied < len && len == PAGE_CACHE_SIZE)) {
549
550
551
552
553
554
555
556
557
558 dbg_gen("copied %d instead of %d, read page and repeat",
559 copied, len);
560 cancel_budget(c, page, ui, appending);
561
562
563
564
565
566 copied = do_readpage(page);
567 goto out;
568 }
569
570 if (!PagePrivate(page)) {
571 SetPagePrivate(page);
572 atomic_long_inc(&c->dirty_pg_cnt);
573 __set_page_dirty_nobuffers(page);
574 }
575
576 if (appending) {
577 i_size_write(inode, end_pos);
578 ui->ui_size = end_pos;
579
580
581
582
583
584 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
585 ubifs_assert(mutex_is_locked(&ui->ui_mutex));
586 mutex_unlock(&ui->ui_mutex);
587 }
588
589out:
590 unlock_page(page);
591 page_cache_release(page);
592 return copied;
593}
594
595
596
597
598
599
600
601
602
603
604static int populate_page(struct ubifs_info *c, struct page *page,
605 struct bu_info *bu, int *n)
606{
607 int i = 0, nn = *n, offs = bu->zbranch[0].offs, hole = 0, read = 0;
608 struct inode *inode = page->mapping->host;
609 loff_t i_size = i_size_read(inode);
610 unsigned int page_block;
611 void *addr, *zaddr;
612 pgoff_t end_index;
613
614 dbg_gen("ino %lu, pg %lu, i_size %lld, flags %#lx",
615 inode->i_ino, page->index, i_size, page->flags);
616
617 addr = zaddr = kmap(page);
618
619 end_index = (i_size - 1) >> PAGE_CACHE_SHIFT;
620 if (!i_size || page->index > end_index) {
621 hole = 1;
622 memset(addr, 0, PAGE_CACHE_SIZE);
623 goto out_hole;
624 }
625
626 page_block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
627 while (1) {
628 int err, len, out_len, dlen;
629
630 if (nn >= bu->cnt) {
631 hole = 1;
632 memset(addr, 0, UBIFS_BLOCK_SIZE);
633 } else if (key_block(c, &bu->zbranch[nn].key) == page_block) {
634 struct ubifs_data_node *dn;
635
636 dn = bu->buf + (bu->zbranch[nn].offs - offs);
637
638 ubifs_assert(le64_to_cpu(dn->ch.sqnum) >
639 ubifs_inode(inode)->creat_sqnum);
640
641 len = le32_to_cpu(dn->size);
642 if (len <= 0 || len > UBIFS_BLOCK_SIZE)
643 goto out_err;
644
645 dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
646 out_len = UBIFS_BLOCK_SIZE;
647 err = ubifs_decompress(&dn->data, dlen, addr, &out_len,
648 le16_to_cpu(dn->compr_type));
649 if (err || len != out_len)
650 goto out_err;
651
652 if (len < UBIFS_BLOCK_SIZE)
653 memset(addr + len, 0, UBIFS_BLOCK_SIZE - len);
654
655 nn += 1;
656 read = (i << UBIFS_BLOCK_SHIFT) + len;
657 } else if (key_block(c, &bu->zbranch[nn].key) < page_block) {
658 nn += 1;
659 continue;
660 } else {
661 hole = 1;
662 memset(addr, 0, UBIFS_BLOCK_SIZE);
663 }
664 if (++i >= UBIFS_BLOCKS_PER_PAGE)
665 break;
666 addr += UBIFS_BLOCK_SIZE;
667 page_block += 1;
668 }
669
670 if (end_index == page->index) {
671 int len = i_size & (PAGE_CACHE_SIZE - 1);
672
673 if (len && len < read)
674 memset(zaddr + len, 0, read - len);
675 }
676
677out_hole:
678 if (hole) {
679 SetPageChecked(page);
680 dbg_gen("hole");
681 }
682
683 SetPageUptodate(page);
684 ClearPageError(page);
685 flush_dcache_page(page);
686 kunmap(page);
687 *n = nn;
688 return 0;
689
690out_err:
691 ClearPageUptodate(page);
692 SetPageError(page);
693 flush_dcache_page(page);
694 kunmap(page);
695 ubifs_err("bad data node (block %u, inode %lu)",
696 page_block, inode->i_ino);
697 return -EINVAL;
698}
699
700
701
702
703
704
705
706
707
708static int ubifs_do_bulk_read(struct ubifs_info *c, struct bu_info *bu,
709 struct page *page1)
710{
711 pgoff_t offset = page1->index, end_index;
712 struct address_space *mapping = page1->mapping;
713 struct inode *inode = mapping->host;
714 struct ubifs_inode *ui = ubifs_inode(inode);
715 int err, page_idx, page_cnt, ret = 0, n = 0;
716 int allocate = bu->buf ? 0 : 1;
717 loff_t isize;
718
719 err = ubifs_tnc_get_bu_keys(c, bu);
720 if (err)
721 goto out_warn;
722
723 if (bu->eof) {
724
725 ui->read_in_a_row = 1;
726 ui->bulk_read = 0;
727 }
728
729 page_cnt = bu->blk_cnt >> UBIFS_BLOCKS_PER_PAGE_SHIFT;
730 if (!page_cnt) {
731
732
733
734
735
736
737 goto out_bu_off;
738 }
739
740 if (bu->cnt) {
741 if (allocate) {
742
743
744
745
746 bu->buf_len = bu->zbranch[bu->cnt - 1].offs +
747 bu->zbranch[bu->cnt - 1].len -
748 bu->zbranch[0].offs;
749 ubifs_assert(bu->buf_len > 0);
750 ubifs_assert(bu->buf_len <= c->leb_size);
751 bu->buf = kmalloc(bu->buf_len, GFP_NOFS | __GFP_NOWARN);
752 if (!bu->buf)
753 goto out_bu_off;
754 }
755
756 err = ubifs_tnc_bulk_read(c, bu);
757 if (err)
758 goto out_warn;
759 }
760
761 err = populate_page(c, page1, bu, &n);
762 if (err)
763 goto out_warn;
764
765 unlock_page(page1);
766 ret = 1;
767
768 isize = i_size_read(inode);
769 if (isize == 0)
770 goto out_free;
771 end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
772
773 for (page_idx = 1; page_idx < page_cnt; page_idx++) {
774 pgoff_t page_offset = offset + page_idx;
775 struct page *page;
776
777 if (page_offset > end_index)
778 break;
779 page = find_or_create_page(mapping, page_offset,
780 GFP_NOFS | __GFP_COLD);
781 if (!page)
782 break;
783 if (!PageUptodate(page))
784 err = populate_page(c, page, bu, &n);
785 unlock_page(page);
786 page_cache_release(page);
787 if (err)
788 break;
789 }
790
791 ui->last_page_read = offset + page_idx - 1;
792
793out_free:
794 if (allocate)
795 kfree(bu->buf);
796 return ret;
797
798out_warn:
799 ubifs_warn("ignoring error %d and skipping bulk-read", err);
800 goto out_free;
801
802out_bu_off:
803 ui->read_in_a_row = ui->bulk_read = 0;
804 goto out_free;
805}
806
807
808
809
810
811
812
813
814
815
816static int ubifs_bulk_read(struct page *page)
817{
818 struct inode *inode = page->mapping->host;
819 struct ubifs_info *c = inode->i_sb->s_fs_info;
820 struct ubifs_inode *ui = ubifs_inode(inode);
821 pgoff_t index = page->index, last_page_read = ui->last_page_read;
822 struct bu_info *bu;
823 int err = 0, allocated = 0;
824
825 ui->last_page_read = index;
826 if (!c->bulk_read)
827 return 0;
828
829
830
831
832
833 if (!mutex_trylock(&ui->ui_mutex))
834 return 0;
835
836 if (index != last_page_read + 1) {
837
838 ui->read_in_a_row = 1;
839 if (ui->bulk_read)
840 ui->bulk_read = 0;
841 goto out_unlock;
842 }
843
844 if (!ui->bulk_read) {
845 ui->read_in_a_row += 1;
846 if (ui->read_in_a_row < 3)
847 goto out_unlock;
848
849 ui->bulk_read = 1;
850 }
851
852
853
854
855
856 if (mutex_trylock(&c->bu_mutex))
857 bu = &c->bu;
858 else {
859 bu = kmalloc(sizeof(struct bu_info), GFP_NOFS | __GFP_NOWARN);
860 if (!bu)
861 goto out_unlock;
862
863 bu->buf = NULL;
864 allocated = 1;
865 }
866
867 bu->buf_len = c->max_bu_buf_len;
868 data_key_init(c, &bu->key, inode->i_ino,
869 page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT);
870 err = ubifs_do_bulk_read(c, bu, page);
871
872 if (!allocated)
873 mutex_unlock(&c->bu_mutex);
874 else
875 kfree(bu);
876
877out_unlock:
878 mutex_unlock(&ui->ui_mutex);
879 return err;
880}
881
882static int ubifs_readpage(struct file *file, struct page *page)
883{
884 if (ubifs_bulk_read(page))
885 return 0;
886 do_readpage(page);
887 unlock_page(page);
888 return 0;
889}
890
891static int do_writepage(struct page *page, int len)
892{
893 int err = 0, i, blen;
894 unsigned int block;
895 void *addr;
896 union ubifs_key key;
897 struct inode *inode = page->mapping->host;
898 struct ubifs_info *c = inode->i_sb->s_fs_info;
899
900#ifdef UBIFS_DEBUG
901 spin_lock(&ui->ui_lock);
902 ubifs_assert(page->index <= ui->synced_i_size << PAGE_CACHE_SIZE);
903 spin_unlock(&ui->ui_lock);
904#endif
905
906
907 set_page_writeback(page);
908
909 addr = kmap(page);
910 block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
911 i = 0;
912 while (len) {
913 blen = min_t(int, len, UBIFS_BLOCK_SIZE);
914 data_key_init(c, &key, inode->i_ino, block);
915 err = ubifs_jnl_write_data(c, inode, &key, addr, blen);
916 if (err)
917 break;
918 if (++i >= UBIFS_BLOCKS_PER_PAGE)
919 break;
920 block += 1;
921 addr += blen;
922 len -= blen;
923 }
924 if (err) {
925 SetPageError(page);
926 ubifs_err("cannot write page %lu of inode %lu, error %d",
927 page->index, inode->i_ino, err);
928 ubifs_ro_mode(c, err);
929 }
930
931 ubifs_assert(PagePrivate(page));
932 if (PageChecked(page))
933 release_new_page_budget(c);
934 else
935 release_existing_page_budget(c);
936
937 atomic_long_dec(&c->dirty_pg_cnt);
938 ClearPagePrivate(page);
939 ClearPageChecked(page);
940
941 kunmap(page);
942 unlock_page(page);
943 end_page_writeback(page);
944 return err;
945}
946
947
948
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
992static int ubifs_writepage(struct page *page, struct writeback_control *wbc)
993{
994 struct inode *inode = page->mapping->host;
995 struct ubifs_inode *ui = ubifs_inode(inode);
996 loff_t i_size = i_size_read(inode), synced_i_size;
997 pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
998 int err, len = i_size & (PAGE_CACHE_SIZE - 1);
999 void *kaddr;
1000
1001 dbg_gen("ino %lu, pg %lu, pg flags %#lx",
1002 inode->i_ino, page->index, page->flags);
1003 ubifs_assert(PagePrivate(page));
1004
1005
1006 if (page->index > end_index || (page->index == end_index && !len)) {
1007 err = 0;
1008 goto out_unlock;
1009 }
1010
1011 spin_lock(&ui->ui_lock);
1012 synced_i_size = ui->synced_i_size;
1013 spin_unlock(&ui->ui_lock);
1014
1015
1016 if (page->index < end_index) {
1017 if (page->index >= synced_i_size >> PAGE_CACHE_SHIFT) {
1018 err = inode->i_sb->s_op->write_inode(inode, NULL);
1019 if (err)
1020 goto out_unlock;
1021
1022
1023
1024
1025
1026
1027
1028
1029 }
1030 return do_writepage(page, PAGE_CACHE_SIZE);
1031 }
1032
1033
1034
1035
1036
1037
1038
1039
1040 kaddr = kmap_atomic(page, KM_USER0);
1041 memset(kaddr + len, 0, PAGE_CACHE_SIZE - len);
1042 flush_dcache_page(page);
1043 kunmap_atomic(kaddr, KM_USER0);
1044
1045 if (i_size > synced_i_size) {
1046 err = inode->i_sb->s_op->write_inode(inode, NULL);
1047 if (err)
1048 goto out_unlock;
1049 }
1050
1051 return do_writepage(page, len);
1052
1053out_unlock:
1054 unlock_page(page);
1055 return err;
1056}
1057
1058
1059
1060
1061
1062
1063static void do_attr_changes(struct inode *inode, const struct iattr *attr)
1064{
1065 if (attr->ia_valid & ATTR_UID)
1066 inode->i_uid = attr->ia_uid;
1067 if (attr->ia_valid & ATTR_GID)
1068 inode->i_gid = attr->ia_gid;
1069 if (attr->ia_valid & ATTR_ATIME)
1070 inode->i_atime = timespec_trunc(attr->ia_atime,
1071 inode->i_sb->s_time_gran);
1072 if (attr->ia_valid & ATTR_MTIME)
1073 inode->i_mtime = timespec_trunc(attr->ia_mtime,
1074 inode->i_sb->s_time_gran);
1075 if (attr->ia_valid & ATTR_CTIME)
1076 inode->i_ctime = timespec_trunc(attr->ia_ctime,
1077 inode->i_sb->s_time_gran);
1078 if (attr->ia_valid & ATTR_MODE) {
1079 umode_t mode = attr->ia_mode;
1080
1081 if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
1082 mode &= ~S_ISGID;
1083 inode->i_mode = mode;
1084 }
1085}
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097static int do_truncation(struct ubifs_info *c, struct inode *inode,
1098 const struct iattr *attr)
1099{
1100 int err;
1101 struct ubifs_budget_req req;
1102 loff_t old_size = inode->i_size, new_size = attr->ia_size;
1103 int offset = new_size & (UBIFS_BLOCK_SIZE - 1), budgeted = 1;
1104 struct ubifs_inode *ui = ubifs_inode(inode);
1105
1106 dbg_gen("ino %lu, size %lld -> %lld", inode->i_ino, old_size, new_size);
1107 memset(&req, 0, sizeof(struct ubifs_budget_req));
1108
1109
1110
1111
1112
1113
1114 if (new_size & (UBIFS_BLOCK_SIZE - 1))
1115 req.dirtied_page = 1;
1116
1117 req.dirtied_ino = 1;
1118
1119 req.dirtied_ino_d = UBIFS_TRUN_NODE_SZ;
1120 err = ubifs_budget_space(c, &req);
1121 if (err) {
1122
1123
1124
1125
1126 if (new_size || err != -ENOSPC)
1127 return err;
1128 budgeted = 0;
1129 }
1130
1131 err = simple_setsize(inode, new_size);
1132 if (err)
1133 goto out_budg;
1134
1135 if (offset) {
1136 pgoff_t index = new_size >> PAGE_CACHE_SHIFT;
1137 struct page *page;
1138
1139 page = find_lock_page(inode->i_mapping, index);
1140 if (page) {
1141 if (PageDirty(page)) {
1142
1143
1144
1145
1146
1147
1148
1149
1150 ubifs_assert(PagePrivate(page));
1151
1152 clear_page_dirty_for_io(page);
1153 if (UBIFS_BLOCKS_PER_PAGE_SHIFT)
1154 offset = new_size &
1155 (PAGE_CACHE_SIZE - 1);
1156 err = do_writepage(page, offset);
1157 page_cache_release(page);
1158 if (err)
1159 goto out_budg;
1160
1161
1162
1163
1164 } else {
1165
1166
1167
1168
1169
1170 unlock_page(page);
1171 page_cache_release(page);
1172 }
1173 }
1174 }
1175
1176 mutex_lock(&ui->ui_mutex);
1177 ui->ui_size = inode->i_size;
1178
1179 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1180
1181 do_attr_changes(inode, attr);
1182 err = ubifs_jnl_truncate(c, inode, old_size, new_size);
1183 mutex_unlock(&ui->ui_mutex);
1184
1185out_budg:
1186 if (budgeted)
1187 ubifs_release_budget(c, &req);
1188 else {
1189 c->nospace = c->nospace_rp = 0;
1190 smp_wmb();
1191 }
1192 return err;
1193}
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205static int do_setattr(struct ubifs_info *c, struct inode *inode,
1206 const struct iattr *attr)
1207{
1208 int err, release;
1209 loff_t new_size = attr->ia_size;
1210 struct ubifs_inode *ui = ubifs_inode(inode);
1211 struct ubifs_budget_req req = { .dirtied_ino = 1,
1212 .dirtied_ino_d = ALIGN(ui->data_len, 8) };
1213
1214 err = ubifs_budget_space(c, &req);
1215 if (err)
1216 return err;
1217
1218 if (attr->ia_valid & ATTR_SIZE) {
1219 dbg_gen("size %lld -> %lld", inode->i_size, new_size);
1220 err = simple_setsize(inode, new_size);
1221 if (err)
1222 goto out;
1223 }
1224
1225 mutex_lock(&ui->ui_mutex);
1226 if (attr->ia_valid & ATTR_SIZE) {
1227
1228 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1229
1230 ui->ui_size = inode->i_size;
1231 }
1232
1233 do_attr_changes(inode, attr);
1234
1235 release = ui->dirty;
1236 if (attr->ia_valid & ATTR_SIZE)
1237
1238
1239
1240
1241 __mark_inode_dirty(inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
1242 else
1243 mark_inode_dirty_sync(inode);
1244 mutex_unlock(&ui->ui_mutex);
1245
1246 if (release)
1247 ubifs_release_budget(c, &req);
1248 if (IS_SYNC(inode))
1249 err = inode->i_sb->s_op->write_inode(inode, NULL);
1250 return err;
1251
1252out:
1253 ubifs_release_budget(c, &req);
1254 return err;
1255}
1256
1257int ubifs_setattr(struct dentry *dentry, struct iattr *attr)
1258{
1259 int err;
1260 struct inode *inode = dentry->d_inode;
1261 struct ubifs_info *c = inode->i_sb->s_fs_info;
1262
1263 dbg_gen("ino %lu, mode %#x, ia_valid %#x",
1264 inode->i_ino, inode->i_mode, attr->ia_valid);
1265 err = inode_change_ok(inode, attr);
1266 if (err)
1267 return err;
1268
1269 err = dbg_check_synced_i_size(inode);
1270 if (err)
1271 return err;
1272
1273 if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size < inode->i_size)
1274
1275 err = do_truncation(c, inode, attr);
1276 else
1277 err = do_setattr(c, inode, attr);
1278
1279 return err;
1280}
1281
1282static void ubifs_invalidatepage(struct page *page, unsigned long offset)
1283{
1284 struct inode *inode = page->mapping->host;
1285 struct ubifs_info *c = inode->i_sb->s_fs_info;
1286
1287 ubifs_assert(PagePrivate(page));
1288 if (offset)
1289
1290 return;
1291
1292 if (PageChecked(page))
1293 release_new_page_budget(c);
1294 else
1295 release_existing_page_budget(c);
1296
1297 atomic_long_dec(&c->dirty_pg_cnt);
1298 ClearPagePrivate(page);
1299 ClearPageChecked(page);
1300}
1301
1302static void *ubifs_follow_link(struct dentry *dentry, struct nameidata *nd)
1303{
1304 struct ubifs_inode *ui = ubifs_inode(dentry->d_inode);
1305
1306 nd_set_link(nd, ui->data);
1307 return NULL;
1308}
1309
1310int ubifs_fsync(struct file *file, int datasync)
1311{
1312 struct inode *inode = file->f_mapping->host;
1313 struct ubifs_info *c = inode->i_sb->s_fs_info;
1314 int err;
1315
1316 dbg_gen("syncing inode %lu", inode->i_ino);
1317
1318
1319
1320
1321
1322 if (!datasync || (inode->i_state & I_DIRTY_DATASYNC)) {
1323 err = inode->i_sb->s_op->write_inode(inode, NULL);
1324 if (err)
1325 return err;
1326 }
1327
1328
1329
1330
1331
1332 err = ubifs_sync_wbufs_by_inode(c, inode);
1333 if (err)
1334 return err;
1335
1336 return 0;
1337}
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348static inline int mctime_update_needed(const struct inode *inode,
1349 const struct timespec *now)
1350{
1351 if (!timespec_equal(&inode->i_mtime, now) ||
1352 !timespec_equal(&inode->i_ctime, now))
1353 return 1;
1354 return 0;
1355}
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366static int update_mctime(struct ubifs_info *c, struct inode *inode)
1367{
1368 struct timespec now = ubifs_current_time(inode);
1369 struct ubifs_inode *ui = ubifs_inode(inode);
1370
1371 if (mctime_update_needed(inode, &now)) {
1372 int err, release;
1373 struct ubifs_budget_req req = { .dirtied_ino = 1,
1374 .dirtied_ino_d = ALIGN(ui->data_len, 8) };
1375
1376 err = ubifs_budget_space(c, &req);
1377 if (err)
1378 return err;
1379
1380 mutex_lock(&ui->ui_mutex);
1381 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1382 release = ui->dirty;
1383 mark_inode_dirty_sync(inode);
1384 mutex_unlock(&ui->ui_mutex);
1385 if (release)
1386 ubifs_release_budget(c, &req);
1387 }
1388
1389 return 0;
1390}
1391
1392static ssize_t ubifs_aio_write(struct kiocb *iocb, const struct iovec *iov,
1393 unsigned long nr_segs, loff_t pos)
1394{
1395 int err;
1396 struct inode *inode = iocb->ki_filp->f_mapping->host;
1397 struct ubifs_info *c = inode->i_sb->s_fs_info;
1398
1399 err = update_mctime(c, inode);
1400 if (err)
1401 return err;
1402
1403 return generic_file_aio_write(iocb, iov, nr_segs, pos);
1404}
1405
1406static int ubifs_set_page_dirty(struct page *page)
1407{
1408 int ret;
1409
1410 ret = __set_page_dirty_nobuffers(page);
1411
1412
1413
1414
1415 ubifs_assert(ret == 0);
1416 return ret;
1417}
1418
1419static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
1420{
1421
1422
1423
1424
1425 if (PageWriteback(page))
1426 return 0;
1427 ubifs_assert(PagePrivate(page));
1428 ubifs_assert(0);
1429 ClearPagePrivate(page);
1430 ClearPageChecked(page);
1431 return 1;
1432}
1433
1434
1435
1436
1437
1438static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
1439{
1440 struct page *page = vmf->page;
1441 struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
1442 struct ubifs_info *c = inode->i_sb->s_fs_info;
1443 struct timespec now = ubifs_current_time(inode);
1444 struct ubifs_budget_req req = { .new_page = 1 };
1445 int err, update_time;
1446
1447 dbg_gen("ino %lu, pg %lu, i_size %lld", inode->i_ino, page->index,
1448 i_size_read(inode));
1449 ubifs_assert(!(inode->i_sb->s_flags & MS_RDONLY));
1450
1451 if (unlikely(c->ro_media))
1452 return VM_FAULT_SIGBUS;
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472 update_time = mctime_update_needed(inode, &now);
1473 if (update_time)
1474
1475
1476
1477
1478 req.dirtied_ino = 1;
1479
1480 err = ubifs_budget_space(c, &req);
1481 if (unlikely(err)) {
1482 if (err == -ENOSPC)
1483 ubifs_warn("out of space for mmapped file "
1484 "(inode number %lu)", inode->i_ino);
1485 return VM_FAULT_SIGBUS;
1486 }
1487
1488 lock_page(page);
1489 if (unlikely(page->mapping != inode->i_mapping ||
1490 page_offset(page) > i_size_read(inode))) {
1491
1492 err = -EINVAL;
1493 goto out_unlock;
1494 }
1495
1496 if (PagePrivate(page))
1497 release_new_page_budget(c);
1498 else {
1499 if (!PageChecked(page))
1500 ubifs_convert_page_budget(c);
1501 SetPagePrivate(page);
1502 atomic_long_inc(&c->dirty_pg_cnt);
1503 __set_page_dirty_nobuffers(page);
1504 }
1505
1506 if (update_time) {
1507 int release;
1508 struct ubifs_inode *ui = ubifs_inode(inode);
1509
1510 mutex_lock(&ui->ui_mutex);
1511 inode->i_mtime = inode->i_ctime = ubifs_current_time(inode);
1512 release = ui->dirty;
1513 mark_inode_dirty_sync(inode);
1514 mutex_unlock(&ui->ui_mutex);
1515 if (release)
1516 ubifs_release_dirty_inode_budget(c, ui);
1517 }
1518
1519 unlock_page(page);
1520 return 0;
1521
1522out_unlock:
1523 unlock_page(page);
1524 ubifs_release_budget(c, &req);
1525 if (err)
1526 err = VM_FAULT_SIGBUS;
1527 return err;
1528}
1529
1530static const struct vm_operations_struct ubifs_file_vm_ops = {
1531 .fault = filemap_fault,
1532 .page_mkwrite = ubifs_vm_page_mkwrite,
1533};
1534
1535static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma)
1536{
1537 int err;
1538
1539
1540 err = generic_file_mmap(file, vma);
1541 if (err)
1542 return err;
1543 vma->vm_ops = &ubifs_file_vm_ops;
1544 return 0;
1545}
1546
1547const struct address_space_operations ubifs_file_address_operations = {
1548 .readpage = ubifs_readpage,
1549 .writepage = ubifs_writepage,
1550 .write_begin = ubifs_write_begin,
1551 .write_end = ubifs_write_end,
1552 .invalidatepage = ubifs_invalidatepage,
1553 .set_page_dirty = ubifs_set_page_dirty,
1554 .releasepage = ubifs_releasepage,
1555};
1556
1557const struct inode_operations ubifs_file_inode_operations = {
1558 .setattr = ubifs_setattr,
1559 .getattr = ubifs_getattr,
1560#ifdef CONFIG_UBIFS_FS_XATTR
1561 .setxattr = ubifs_setxattr,
1562 .getxattr = ubifs_getxattr,
1563 .listxattr = ubifs_listxattr,
1564 .removexattr = ubifs_removexattr,
1565#endif
1566};
1567
1568const struct inode_operations ubifs_symlink_inode_operations = {
1569 .readlink = generic_readlink,
1570 .follow_link = ubifs_follow_link,
1571 .setattr = ubifs_setattr,
1572 .getattr = ubifs_getattr,
1573};
1574
1575const struct file_operations ubifs_file_operations = {
1576 .llseek = generic_file_llseek,
1577 .read = do_sync_read,
1578 .write = do_sync_write,
1579 .aio_read = generic_file_aio_read,
1580 .aio_write = ubifs_aio_write,
1581 .mmap = ubifs_file_mmap,
1582 .fsync = ubifs_fsync,
1583 .unlocked_ioctl = ubifs_ioctl,
1584 .splice_read = generic_file_splice_read,
1585 .splice_write = generic_file_splice_write,
1586#ifdef CONFIG_COMPAT
1587 .compat_ioctl = ubifs_compat_ioctl,
1588#endif
1589};
1590