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
53
54
55
56
57
58
59
60
61#include "ubifs.h"
62
63
64
65
66
67static inline void zero_ino_node_unused(struct ubifs_ino_node *ino)
68{
69 memset(ino->padding1, 0, 4);
70 memset(ino->padding2, 0, 26);
71}
72
73
74
75
76
77
78static inline void zero_dent_node_unused(struct ubifs_dent_node *dent)
79{
80 dent->padding1 = 0;
81 memset(dent->padding2, 0, 4);
82}
83
84
85
86
87
88static inline void zero_data_node_unused(struct ubifs_data_node *data)
89{
90 memset(data->padding, 0, 2);
91}
92
93
94
95
96
97
98static inline void zero_trun_node_unused(struct ubifs_trun_node *trun)
99{
100 memset(trun->padding, 0, 12);
101}
102
103
104
105
106
107
108
109
110
111
112
113
114
115static int reserve_space(struct ubifs_info *c, int jhead, int len)
116{
117 int err = 0, err1, retries = 0, avail, lnum, offs, squeeze;
118 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf;
119
120
121
122
123
124
125 ubifs_assert(!c->ro_media && !c->ro_mount);
126 squeeze = (jhead == BASEHD);
127again:
128 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead);
129
130 if (c->ro_error) {
131 err = -EROFS;
132 goto out_unlock;
133 }
134
135 avail = c->leb_size - wbuf->offs - wbuf->used;
136 if (wbuf->lnum != -1 && avail >= len)
137 return 0;
138
139
140
141
142
143 lnum = ubifs_find_free_space(c, len, &offs, squeeze);
144 if (lnum >= 0)
145 goto out;
146
147 err = lnum;
148 if (err != -ENOSPC)
149 goto out_unlock;
150
151
152
153
154
155
156 dbg_jnl("no free space in jhead %s, run GC", dbg_jhead(jhead));
157 mutex_unlock(&wbuf->io_mutex);
158
159 lnum = ubifs_garbage_collect(c, 0);
160 if (lnum < 0) {
161 err = lnum;
162 if (err != -ENOSPC)
163 return err;
164
165
166
167
168
169
170
171 dbg_jnl("GC couldn't make a free LEB for jhead %s",
172 dbg_jhead(jhead));
173 if (retries++ < 2) {
174 dbg_jnl("retry (%d)", retries);
175 goto again;
176 }
177
178 dbg_jnl("return -ENOSPC");
179 return err;
180 }
181
182 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead);
183 dbg_jnl("got LEB %d for jhead %s", lnum, dbg_jhead(jhead));
184 avail = c->leb_size - wbuf->offs - wbuf->used;
185
186 if (wbuf->lnum != -1 && avail >= len) {
187
188
189
190
191
192 dbg_jnl("return LEB %d back, already have LEB %d:%d",
193 lnum, wbuf->lnum, wbuf->offs + wbuf->used);
194 err = ubifs_return_leb(c, lnum);
195 if (err)
196 goto out_unlock;
197 return 0;
198 }
199
200 offs = 0;
201
202out:
203
204
205
206
207
208
209
210
211 err = ubifs_wbuf_sync_nolock(wbuf);
212 if (err)
213 goto out_return;
214 err = ubifs_add_bud_to_log(c, jhead, lnum, offs);
215 if (err)
216 goto out_return;
217 err = ubifs_wbuf_seek_nolock(wbuf, lnum, offs, wbuf->dtype);
218 if (err)
219 goto out_unlock;
220
221 return 0;
222
223out_unlock:
224 mutex_unlock(&wbuf->io_mutex);
225 return err;
226
227out_return:
228
229 ubifs_assert(err < 0);
230 err1 = ubifs_return_leb(c, lnum);
231 if (err1 && err == -EAGAIN)
232
233
234
235
236
237 err = err1;
238 mutex_unlock(&wbuf->io_mutex);
239 return err;
240}
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255static int write_node(struct ubifs_info *c, int jhead, void *node, int len,
256 int *lnum, int *offs)
257{
258 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf;
259
260 ubifs_assert(jhead != GCHD);
261
262 *lnum = c->jheads[jhead].wbuf.lnum;
263 *offs = c->jheads[jhead].wbuf.offs + c->jheads[jhead].wbuf.used;
264
265 dbg_jnl("jhead %s, LEB %d:%d, len %d",
266 dbg_jhead(jhead), *lnum, *offs, len);
267 ubifs_prepare_node(c, node, len, 0);
268
269 return ubifs_wbuf_write_nolock(wbuf, node, len);
270}
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286static int write_head(struct ubifs_info *c, int jhead, void *buf, int len,
287 int *lnum, int *offs, int sync)
288{
289 int err;
290 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf;
291
292 ubifs_assert(jhead != GCHD);
293
294 *lnum = c->jheads[jhead].wbuf.lnum;
295 *offs = c->jheads[jhead].wbuf.offs + c->jheads[jhead].wbuf.used;
296 dbg_jnl("jhead %s, LEB %d:%d, len %d",
297 dbg_jhead(jhead), *lnum, *offs, len);
298
299 err = ubifs_wbuf_write_nolock(wbuf, buf, len);
300 if (err)
301 return err;
302 if (sync)
303 err = ubifs_wbuf_sync_nolock(wbuf);
304 return err;
305}
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323static int make_reservation(struct ubifs_info *c, int jhead, int len)
324{
325 int err, cmt_retries = 0, nospc_retries = 0;
326
327again:
328 down_read(&c->commit_sem);
329 err = reserve_space(c, jhead, len);
330 if (!err)
331 return 0;
332 up_read(&c->commit_sem);
333
334 if (err == -ENOSPC) {
335
336
337
338
339
340
341 if (nospc_retries++ < 2) {
342 dbg_jnl("no space, retry");
343 err = -EAGAIN;
344 }
345
346
347
348
349
350
351
352 }
353
354 if (err != -EAGAIN)
355 goto out;
356
357
358
359
360
361 if (cmt_retries > 128) {
362
363
364
365
366 ubifs_err("stuck in space allocation");
367 err = -ENOSPC;
368 goto out;
369 } else if (cmt_retries > 32)
370 ubifs_warn("too many space allocation re-tries (%d)",
371 cmt_retries);
372
373 dbg_jnl("-EAGAIN, commit and retry (retried %d times)",
374 cmt_retries);
375 cmt_retries += 1;
376
377 err = ubifs_run_commit(c);
378 if (err)
379 return err;
380 goto again;
381
382out:
383 ubifs_err("cannot reserve %d bytes in jhead %d, error %d",
384 len, jhead, err);
385 if (err == -ENOSPC) {
386
387 down_write(&c->commit_sem);
388 dbg_dump_stack();
389 dbg_dump_budg(c, &c->bi);
390 dbg_dump_lprops(c);
391 cmt_retries = dbg_check_lprops(c);
392 up_write(&c->commit_sem);
393 }
394 return err;
395}
396
397
398
399
400
401
402
403
404
405
406static inline void release_head(struct ubifs_info *c, int jhead)
407{
408 mutex_unlock(&c->jheads[jhead].wbuf.io_mutex);
409}
410
411
412
413
414
415
416
417
418static void finish_reservation(struct ubifs_info *c)
419{
420 up_read(&c->commit_sem);
421}
422
423
424
425
426
427static int get_dent_type(int mode)
428{
429 switch (mode & S_IFMT) {
430 case S_IFREG:
431 return UBIFS_ITYPE_REG;
432 case S_IFDIR:
433 return UBIFS_ITYPE_DIR;
434 case S_IFLNK:
435 return UBIFS_ITYPE_LNK;
436 case S_IFBLK:
437 return UBIFS_ITYPE_BLK;
438 case S_IFCHR:
439 return UBIFS_ITYPE_CHR;
440 case S_IFIFO:
441 return UBIFS_ITYPE_FIFO;
442 case S_IFSOCK:
443 return UBIFS_ITYPE_SOCK;
444 default:
445 BUG();
446 }
447 return 0;
448}
449
450
451
452
453
454
455
456
457static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino,
458 const struct inode *inode, int last)
459{
460 int data_len = 0, last_reference = !inode->i_nlink;
461 struct ubifs_inode *ui = ubifs_inode(inode);
462
463 ino->ch.node_type = UBIFS_INO_NODE;
464 ino_key_init_flash(c, &ino->key, inode->i_ino);
465 ino->creat_sqnum = cpu_to_le64(ui->creat_sqnum);
466 ino->atime_sec = cpu_to_le64(inode->i_atime.tv_sec);
467 ino->atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
468 ino->ctime_sec = cpu_to_le64(inode->i_ctime.tv_sec);
469 ino->ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
470 ino->mtime_sec = cpu_to_le64(inode->i_mtime.tv_sec);
471 ino->mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
472 ino->uid = cpu_to_le32(inode->i_uid);
473 ino->gid = cpu_to_le32(inode->i_gid);
474 ino->mode = cpu_to_le32(inode->i_mode);
475 ino->flags = cpu_to_le32(ui->flags);
476 ino->size = cpu_to_le64(ui->ui_size);
477 ino->nlink = cpu_to_le32(inode->i_nlink);
478 ino->compr_type = cpu_to_le16(ui->compr_type);
479 ino->data_len = cpu_to_le32(ui->data_len);
480 ino->xattr_cnt = cpu_to_le32(ui->xattr_cnt);
481 ino->xattr_size = cpu_to_le32(ui->xattr_size);
482 ino->xattr_names = cpu_to_le32(ui->xattr_names);
483 zero_ino_node_unused(ino);
484
485
486
487
488
489 if (!last_reference) {
490 memcpy(ino->data, ui->data, ui->data_len);
491 data_len = ui->data_len;
492 }
493
494 ubifs_prep_grp_node(c, ino, UBIFS_INO_NODE_SZ + data_len, last);
495}
496
497
498
499
500
501
502
503
504
505
506
507static void mark_inode_clean(struct ubifs_info *c, struct ubifs_inode *ui)
508{
509 if (ui->dirty)
510 ubifs_release_dirty_inode_budget(c, ui);
511 ui->dirty = 0;
512}
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
542 const struct qstr *nm, const struct inode *inode,
543 int deletion, int xent)
544{
545 int err, dlen, ilen, len, lnum, ino_offs, dent_offs;
546 int aligned_dlen, aligned_ilen, sync = IS_DIRSYNC(dir);
547 int last_reference = !!(deletion && inode->i_nlink == 0);
548 struct ubifs_inode *ui = ubifs_inode(inode);
549 struct ubifs_inode *dir_ui = ubifs_inode(dir);
550 struct ubifs_dent_node *dent;
551 struct ubifs_ino_node *ino;
552 union ubifs_key dent_key, ino_key;
553
554 dbg_jnl("ino %lu, dent '%.*s', data len %d in dir ino %lu",
555 inode->i_ino, nm->len, nm->name, ui->data_len, dir->i_ino);
556 ubifs_assert(dir_ui->data_len == 0);
557 ubifs_assert(mutex_is_locked(&dir_ui->ui_mutex));
558
559 dlen = UBIFS_DENT_NODE_SZ + nm->len + 1;
560 ilen = UBIFS_INO_NODE_SZ;
561
562
563
564
565
566
567
568 if (!last_reference) {
569 ilen += ui->data_len;
570 sync |= IS_SYNC(inode);
571 }
572
573 aligned_dlen = ALIGN(dlen, 8);
574 aligned_ilen = ALIGN(ilen, 8);
575 len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
576 dent = kmalloc(len, GFP_NOFS);
577 if (!dent)
578 return -ENOMEM;
579
580
581 err = make_reservation(c, BASEHD, len);
582 if (err)
583 goto out_free;
584
585 if (!xent) {
586 dent->ch.node_type = UBIFS_DENT_NODE;
587 dent_key_init(c, &dent_key, dir->i_ino, nm);
588 } else {
589 dent->ch.node_type = UBIFS_XENT_NODE;
590 xent_key_init(c, &dent_key, dir->i_ino, nm);
591 }
592
593 key_write(c, &dent_key, dent->key);
594 dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino);
595 dent->type = get_dent_type(inode->i_mode);
596 dent->nlen = cpu_to_le16(nm->len);
597 memcpy(dent->name, nm->name, nm->len);
598 dent->name[nm->len] = '\0';
599 zero_dent_node_unused(dent);
600 ubifs_prep_grp_node(c, dent, dlen, 0);
601
602 ino = (void *)dent + aligned_dlen;
603 pack_inode(c, ino, inode, 0);
604 ino = (void *)ino + aligned_ilen;
605 pack_inode(c, ino, dir, 1);
606
607 if (last_reference) {
608 err = ubifs_add_orphan(c, inode->i_ino);
609 if (err) {
610 release_head(c, BASEHD);
611 goto out_finish;
612 }
613 ui->del_cmtno = c->cmt_no;
614 }
615
616 err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync);
617 if (err)
618 goto out_release;
619 if (!sync) {
620 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
621
622 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino);
623 ubifs_wbuf_add_ino_nolock(wbuf, dir->i_ino);
624 }
625 release_head(c, BASEHD);
626 kfree(dent);
627
628 if (deletion) {
629 err = ubifs_tnc_remove_nm(c, &dent_key, nm);
630 if (err)
631 goto out_ro;
632 err = ubifs_add_dirt(c, lnum, dlen);
633 } else
634 err = ubifs_tnc_add_nm(c, &dent_key, lnum, dent_offs, dlen, nm);
635 if (err)
636 goto out_ro;
637
638
639
640
641
642
643
644 ino_key_init(c, &ino_key, inode->i_ino);
645 ino_offs = dent_offs + aligned_dlen;
646 err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, ilen);
647 if (err)
648 goto out_ro;
649
650 ino_key_init(c, &ino_key, dir->i_ino);
651 ino_offs += aligned_ilen;
652 err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, UBIFS_INO_NODE_SZ);
653 if (err)
654 goto out_ro;
655
656 finish_reservation(c);
657 spin_lock(&ui->ui_lock);
658 ui->synced_i_size = ui->ui_size;
659 spin_unlock(&ui->ui_lock);
660 mark_inode_clean(c, ui);
661 mark_inode_clean(c, dir_ui);
662 return 0;
663
664out_finish:
665 finish_reservation(c);
666out_free:
667 kfree(dent);
668 return err;
669
670out_release:
671 release_head(c, BASEHD);
672 kfree(dent);
673out_ro:
674 ubifs_ro_mode(c, err);
675 if (last_reference)
676 ubifs_delete_orphan(c, inode->i_ino);
677 finish_reservation(c);
678 return err;
679}
680
681
682
683
684
685
686
687
688
689
690
691
692int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
693 const union ubifs_key *key, const void *buf, int len)
694{
695 struct ubifs_data_node *data;
696 int err, lnum, offs, compr_type, out_len;
697 int dlen = COMPRESSED_DATA_NODE_BUF_SZ, allocated = 1;
698 struct ubifs_inode *ui = ubifs_inode(inode);
699
700 dbg_jnl("ino %lu, blk %u, len %d, key %s",
701 (unsigned long)key_inum(c, key), key_block(c, key), len,
702 DBGKEY(key));
703 ubifs_assert(len <= UBIFS_BLOCK_SIZE);
704
705 data = kmalloc(dlen, GFP_NOFS | __GFP_NOWARN);
706 if (!data) {
707
708
709
710
711
712
713
714 allocated = 0;
715 mutex_lock(&c->write_reserve_mutex);
716 data = c->write_reserve_buf;
717 }
718
719 data->ch.node_type = UBIFS_DATA_NODE;
720 key_write(c, key, &data->key);
721 data->size = cpu_to_le32(len);
722 zero_data_node_unused(data);
723
724 if (!(ui->flags & UBIFS_COMPR_FL))
725
726 compr_type = UBIFS_COMPR_NONE;
727 else
728 compr_type = ui->compr_type;
729
730 out_len = dlen - UBIFS_DATA_NODE_SZ;
731 ubifs_compress(buf, len, &data->data, &out_len, &compr_type);
732 ubifs_assert(out_len <= UBIFS_BLOCK_SIZE);
733
734 dlen = UBIFS_DATA_NODE_SZ + out_len;
735 data->compr_type = cpu_to_le16(compr_type);
736
737
738 err = make_reservation(c, DATAHD, dlen);
739 if (err)
740 goto out_free;
741
742 err = write_node(c, DATAHD, data, dlen, &lnum, &offs);
743 if (err)
744 goto out_release;
745 ubifs_wbuf_add_ino_nolock(&c->jheads[DATAHD].wbuf, key_inum(c, key));
746 release_head(c, DATAHD);
747
748 err = ubifs_tnc_add(c, key, lnum, offs, dlen);
749 if (err)
750 goto out_ro;
751
752 finish_reservation(c);
753 if (!allocated)
754 mutex_unlock(&c->write_reserve_mutex);
755 else
756 kfree(data);
757 return 0;
758
759out_release:
760 release_head(c, DATAHD);
761out_ro:
762 ubifs_ro_mode(c, err);
763 finish_reservation(c);
764out_free:
765 if (!allocated)
766 mutex_unlock(&c->write_reserve_mutex);
767 else
768 kfree(data);
769 return err;
770}
771
772
773
774
775
776
777
778
779
780
781int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
782{
783 int err, lnum, offs;
784 struct ubifs_ino_node *ino;
785 struct ubifs_inode *ui = ubifs_inode(inode);
786 int sync = 0, len = UBIFS_INO_NODE_SZ, last_reference = !inode->i_nlink;
787
788 dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink);
789
790
791
792
793
794 if (!last_reference) {
795 len += ui->data_len;
796 sync = IS_SYNC(inode);
797 }
798 ino = kmalloc(len, GFP_NOFS);
799 if (!ino)
800 return -ENOMEM;
801
802
803 err = make_reservation(c, BASEHD, len);
804 if (err)
805 goto out_free;
806
807 pack_inode(c, ino, inode, 1);
808 err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync);
809 if (err)
810 goto out_release;
811 if (!sync)
812 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
813 inode->i_ino);
814 release_head(c, BASEHD);
815
816 if (last_reference) {
817 err = ubifs_tnc_remove_ino(c, inode->i_ino);
818 if (err)
819 goto out_ro;
820 ubifs_delete_orphan(c, inode->i_ino);
821 err = ubifs_add_dirt(c, lnum, len);
822 } else {
823 union ubifs_key key;
824
825 ino_key_init(c, &key, inode->i_ino);
826 err = ubifs_tnc_add(c, &key, lnum, offs, len);
827 }
828 if (err)
829 goto out_ro;
830
831 finish_reservation(c);
832 spin_lock(&ui->ui_lock);
833 ui->synced_i_size = ui->ui_size;
834 spin_unlock(&ui->ui_lock);
835 kfree(ino);
836 return 0;
837
838out_release:
839 release_head(c, BASEHD);
840out_ro:
841 ubifs_ro_mode(c, err);
842 finish_reservation(c);
843out_free:
844 kfree(ino);
845 return err;
846}
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode)
878{
879 int err;
880 struct ubifs_inode *ui = ubifs_inode(inode);
881
882 ubifs_assert(inode->i_nlink == 0);
883
884 if (ui->del_cmtno != c->cmt_no)
885
886 return ubifs_jnl_write_inode(c, inode);
887
888 down_read(&c->commit_sem);
889
890
891
892
893 if (ui->del_cmtno != c->cmt_no) {
894 up_read(&c->commit_sem);
895 return ubifs_jnl_write_inode(c, inode);
896 }
897
898 err = ubifs_tnc_remove_ino(c, inode->i_ino);
899 if (err)
900 ubifs_ro_mode(c, err);
901 else
902 ubifs_delete_orphan(c, inode->i_ino);
903 up_read(&c->commit_sem);
904 return err;
905}
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
922 const struct dentry *old_dentry,
923 const struct inode *new_dir,
924 const struct dentry *new_dentry, int sync)
925{
926 void *p;
927 union ubifs_key key;
928 struct ubifs_dent_node *dent, *dent2;
929 int err, dlen1, dlen2, ilen, lnum, offs, len;
930 const struct inode *old_inode = old_dentry->d_inode;
931 const struct inode *new_inode = new_dentry->d_inode;
932 int aligned_dlen1, aligned_dlen2, plen = UBIFS_INO_NODE_SZ;
933 int last_reference = !!(new_inode && new_inode->i_nlink == 0);
934 int move = (old_dir != new_dir);
935 struct ubifs_inode *uninitialized_var(new_ui);
936
937 dbg_jnl("dent '%.*s' in dir ino %lu to dent '%.*s' in dir ino %lu",
938 old_dentry->d_name.len, old_dentry->d_name.name,
939 old_dir->i_ino, new_dentry->d_name.len,
940 new_dentry->d_name.name, new_dir->i_ino);
941 ubifs_assert(ubifs_inode(old_dir)->data_len == 0);
942 ubifs_assert(ubifs_inode(new_dir)->data_len == 0);
943 ubifs_assert(mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex));
944 ubifs_assert(mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex));
945
946 dlen1 = UBIFS_DENT_NODE_SZ + new_dentry->d_name.len + 1;
947 dlen2 = UBIFS_DENT_NODE_SZ + old_dentry->d_name.len + 1;
948 if (new_inode) {
949 new_ui = ubifs_inode(new_inode);
950 ubifs_assert(mutex_is_locked(&new_ui->ui_mutex));
951 ilen = UBIFS_INO_NODE_SZ;
952 if (!last_reference)
953 ilen += new_ui->data_len;
954 } else
955 ilen = 0;
956
957 aligned_dlen1 = ALIGN(dlen1, 8);
958 aligned_dlen2 = ALIGN(dlen2, 8);
959 len = aligned_dlen1 + aligned_dlen2 + ALIGN(ilen, 8) + ALIGN(plen, 8);
960 if (old_dir != new_dir)
961 len += plen;
962 dent = kmalloc(len, GFP_NOFS);
963 if (!dent)
964 return -ENOMEM;
965
966
967 err = make_reservation(c, BASEHD, len);
968 if (err)
969 goto out_free;
970
971
972 dent->ch.node_type = UBIFS_DENT_NODE;
973 dent_key_init_flash(c, &dent->key, new_dir->i_ino, &new_dentry->d_name);
974 dent->inum = cpu_to_le64(old_inode->i_ino);
975 dent->type = get_dent_type(old_inode->i_mode);
976 dent->nlen = cpu_to_le16(new_dentry->d_name.len);
977 memcpy(dent->name, new_dentry->d_name.name, new_dentry->d_name.len);
978 dent->name[new_dentry->d_name.len] = '\0';
979 zero_dent_node_unused(dent);
980 ubifs_prep_grp_node(c, dent, dlen1, 0);
981
982
983 dent2 = (void *)dent + aligned_dlen1;
984 dent2->ch.node_type = UBIFS_DENT_NODE;
985 dent_key_init_flash(c, &dent2->key, old_dir->i_ino,
986 &old_dentry->d_name);
987 dent2->inum = 0;
988 dent2->type = DT_UNKNOWN;
989 dent2->nlen = cpu_to_le16(old_dentry->d_name.len);
990 memcpy(dent2->name, old_dentry->d_name.name, old_dentry->d_name.len);
991 dent2->name[old_dentry->d_name.len] = '\0';
992 zero_dent_node_unused(dent2);
993 ubifs_prep_grp_node(c, dent2, dlen2, 0);
994
995 p = (void *)dent2 + aligned_dlen2;
996 if (new_inode) {
997 pack_inode(c, p, new_inode, 0);
998 p += ALIGN(ilen, 8);
999 }
1000
1001 if (!move)
1002 pack_inode(c, p, old_dir, 1);
1003 else {
1004 pack_inode(c, p, old_dir, 0);
1005 p += ALIGN(plen, 8);
1006 pack_inode(c, p, new_dir, 1);
1007 }
1008
1009 if (last_reference) {
1010 err = ubifs_add_orphan(c, new_inode->i_ino);
1011 if (err) {
1012 release_head(c, BASEHD);
1013 goto out_finish;
1014 }
1015 new_ui->del_cmtno = c->cmt_no;
1016 }
1017
1018 err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync);
1019 if (err)
1020 goto out_release;
1021 if (!sync) {
1022 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1023
1024 ubifs_wbuf_add_ino_nolock(wbuf, new_dir->i_ino);
1025 ubifs_wbuf_add_ino_nolock(wbuf, old_dir->i_ino);
1026 if (new_inode)
1027 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
1028 new_inode->i_ino);
1029 }
1030 release_head(c, BASEHD);
1031
1032 dent_key_init(c, &key, new_dir->i_ino, &new_dentry->d_name);
1033 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, &new_dentry->d_name);
1034 if (err)
1035 goto out_ro;
1036
1037 err = ubifs_add_dirt(c, lnum, dlen2);
1038 if (err)
1039 goto out_ro;
1040
1041 dent_key_init(c, &key, old_dir->i_ino, &old_dentry->d_name);
1042 err = ubifs_tnc_remove_nm(c, &key, &old_dentry->d_name);
1043 if (err)
1044 goto out_ro;
1045
1046 offs += aligned_dlen1 + aligned_dlen2;
1047 if (new_inode) {
1048 ino_key_init(c, &key, new_inode->i_ino);
1049 err = ubifs_tnc_add(c, &key, lnum, offs, ilen);
1050 if (err)
1051 goto out_ro;
1052 offs += ALIGN(ilen, 8);
1053 }
1054
1055 ino_key_init(c, &key, old_dir->i_ino);
1056 err = ubifs_tnc_add(c, &key, lnum, offs, plen);
1057 if (err)
1058 goto out_ro;
1059
1060 if (old_dir != new_dir) {
1061 offs += ALIGN(plen, 8);
1062 ino_key_init(c, &key, new_dir->i_ino);
1063 err = ubifs_tnc_add(c, &key, lnum, offs, plen);
1064 if (err)
1065 goto out_ro;
1066 }
1067
1068 finish_reservation(c);
1069 if (new_inode) {
1070 mark_inode_clean(c, new_ui);
1071 spin_lock(&new_ui->ui_lock);
1072 new_ui->synced_i_size = new_ui->ui_size;
1073 spin_unlock(&new_ui->ui_lock);
1074 }
1075 mark_inode_clean(c, ubifs_inode(old_dir));
1076 if (move)
1077 mark_inode_clean(c, ubifs_inode(new_dir));
1078 kfree(dent);
1079 return 0;
1080
1081out_release:
1082 release_head(c, BASEHD);
1083out_ro:
1084 ubifs_ro_mode(c, err);
1085 if (last_reference)
1086 ubifs_delete_orphan(c, new_inode->i_ino);
1087out_finish:
1088 finish_reservation(c);
1089out_free:
1090 kfree(dent);
1091 return err;
1092}
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102static int recomp_data_node(struct ubifs_data_node *dn, int *new_len)
1103{
1104 void *buf;
1105 int err, len, compr_type, out_len;
1106
1107 out_len = le32_to_cpu(dn->size);
1108 buf = kmalloc(out_len * WORST_COMPR_FACTOR, GFP_NOFS);
1109 if (!buf)
1110 return -ENOMEM;
1111
1112 len = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
1113 compr_type = le16_to_cpu(dn->compr_type);
1114 err = ubifs_decompress(&dn->data, len, buf, &out_len, compr_type);
1115 if (err)
1116 goto out;
1117
1118 ubifs_compress(buf, *new_len, &dn->data, &out_len, &compr_type);
1119 ubifs_assert(out_len <= UBIFS_BLOCK_SIZE);
1120 dn->compr_type = cpu_to_le16(compr_type);
1121 dn->size = cpu_to_le32(*new_len);
1122 *new_len = UBIFS_DATA_NODE_SZ + out_len;
1123out:
1124 kfree(buf);
1125 return err;
1126}
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
1144 loff_t old_size, loff_t new_size)
1145{
1146 union ubifs_key key, to_key;
1147 struct ubifs_ino_node *ino;
1148 struct ubifs_trun_node *trun;
1149 struct ubifs_data_node *uninitialized_var(dn);
1150 int err, dlen, len, lnum, offs, bit, sz, sync = IS_SYNC(inode);
1151 struct ubifs_inode *ui = ubifs_inode(inode);
1152 ino_t inum = inode->i_ino;
1153 unsigned int blk;
1154
1155 dbg_jnl("ino %lu, size %lld -> %lld",
1156 (unsigned long)inum, old_size, new_size);
1157 ubifs_assert(!ui->data_len);
1158 ubifs_assert(S_ISREG(inode->i_mode));
1159 ubifs_assert(mutex_is_locked(&ui->ui_mutex));
1160
1161 sz = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ +
1162 UBIFS_MAX_DATA_NODE_SZ * WORST_COMPR_FACTOR;
1163 ino = kmalloc(sz, GFP_NOFS);
1164 if (!ino)
1165 return -ENOMEM;
1166
1167 trun = (void *)ino + UBIFS_INO_NODE_SZ;
1168 trun->ch.node_type = UBIFS_TRUN_NODE;
1169 trun->inum = cpu_to_le32(inum);
1170 trun->old_size = cpu_to_le64(old_size);
1171 trun->new_size = cpu_to_le64(new_size);
1172 zero_trun_node_unused(trun);
1173
1174 dlen = new_size & (UBIFS_BLOCK_SIZE - 1);
1175 if (dlen) {
1176
1177 dn = (void *)trun + UBIFS_TRUN_NODE_SZ;
1178 blk = new_size >> UBIFS_BLOCK_SHIFT;
1179 data_key_init(c, &key, inum, blk);
1180 dbg_jnl("last block key %s", DBGKEY(&key));
1181 err = ubifs_tnc_lookup(c, &key, dn);
1182 if (err == -ENOENT)
1183 dlen = 0;
1184 else if (err)
1185 goto out_free;
1186 else {
1187 if (le32_to_cpu(dn->size) <= dlen)
1188 dlen = 0;
1189 else {
1190 int compr_type = le16_to_cpu(dn->compr_type);
1191
1192 if (compr_type != UBIFS_COMPR_NONE) {
1193 err = recomp_data_node(dn, &dlen);
1194 if (err)
1195 goto out_free;
1196 } else {
1197 dn->size = cpu_to_le32(dlen);
1198 dlen += UBIFS_DATA_NODE_SZ;
1199 }
1200 zero_data_node_unused(dn);
1201 }
1202 }
1203 }
1204
1205
1206 len = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ;
1207 if (dlen)
1208 len += dlen;
1209 err = make_reservation(c, BASEHD, len);
1210 if (err)
1211 goto out_free;
1212
1213 pack_inode(c, ino, inode, 0);
1214 ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1);
1215 if (dlen)
1216 ubifs_prep_grp_node(c, dn, dlen, 1);
1217
1218 err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync);
1219 if (err)
1220 goto out_release;
1221 if (!sync)
1222 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, inum);
1223 release_head(c, BASEHD);
1224
1225 if (dlen) {
1226 sz = offs + UBIFS_INO_NODE_SZ + UBIFS_TRUN_NODE_SZ;
1227 err = ubifs_tnc_add(c, &key, lnum, sz, dlen);
1228 if (err)
1229 goto out_ro;
1230 }
1231
1232 ino_key_init(c, &key, inum);
1233 err = ubifs_tnc_add(c, &key, lnum, offs, UBIFS_INO_NODE_SZ);
1234 if (err)
1235 goto out_ro;
1236
1237 err = ubifs_add_dirt(c, lnum, UBIFS_TRUN_NODE_SZ);
1238 if (err)
1239 goto out_ro;
1240
1241 bit = new_size & (UBIFS_BLOCK_SIZE - 1);
1242 blk = (new_size >> UBIFS_BLOCK_SHIFT) + (bit ? 1 : 0);
1243 data_key_init(c, &key, inum, blk);
1244
1245 bit = old_size & (UBIFS_BLOCK_SIZE - 1);
1246 blk = (old_size >> UBIFS_BLOCK_SHIFT) - (bit ? 0 : 1);
1247 data_key_init(c, &to_key, inum, blk);
1248
1249 err = ubifs_tnc_remove_range(c, &key, &to_key);
1250 if (err)
1251 goto out_ro;
1252
1253 finish_reservation(c);
1254 spin_lock(&ui->ui_lock);
1255 ui->synced_i_size = ui->ui_size;
1256 spin_unlock(&ui->ui_lock);
1257 mark_inode_clean(c, ui);
1258 kfree(ino);
1259 return 0;
1260
1261out_release:
1262 release_head(c, BASEHD);
1263out_ro:
1264 ubifs_ro_mode(c, err);
1265 finish_reservation(c);
1266out_free:
1267 kfree(ino);
1268 return err;
1269}
1270
1271#ifdef CONFIG_UBIFS_FS_XATTR
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
1286 const struct inode *inode, const struct qstr *nm)
1287{
1288 int err, xlen, hlen, len, lnum, xent_offs, aligned_xlen;
1289 struct ubifs_dent_node *xent;
1290 struct ubifs_ino_node *ino;
1291 union ubifs_key xent_key, key1, key2;
1292 int sync = IS_DIRSYNC(host);
1293 struct ubifs_inode *host_ui = ubifs_inode(host);
1294
1295 dbg_jnl("host %lu, xattr ino %lu, name '%s', data len %d",
1296 host->i_ino, inode->i_ino, nm->name,
1297 ubifs_inode(inode)->data_len);
1298 ubifs_assert(inode->i_nlink == 0);
1299 ubifs_assert(mutex_is_locked(&host_ui->ui_mutex));
1300
1301
1302
1303
1304
1305 xlen = UBIFS_DENT_NODE_SZ + nm->len + 1;
1306 aligned_xlen = ALIGN(xlen, 8);
1307 hlen = host_ui->data_len + UBIFS_INO_NODE_SZ;
1308 len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
1309
1310 xent = kmalloc(len, GFP_NOFS);
1311 if (!xent)
1312 return -ENOMEM;
1313
1314
1315 err = make_reservation(c, BASEHD, len);
1316 if (err) {
1317 kfree(xent);
1318 return err;
1319 }
1320
1321 xent->ch.node_type = UBIFS_XENT_NODE;
1322 xent_key_init(c, &xent_key, host->i_ino, nm);
1323 key_write(c, &xent_key, xent->key);
1324 xent->inum = 0;
1325 xent->type = get_dent_type(inode->i_mode);
1326 xent->nlen = cpu_to_le16(nm->len);
1327 memcpy(xent->name, nm->name, nm->len);
1328 xent->name[nm->len] = '\0';
1329 zero_dent_node_unused(xent);
1330 ubifs_prep_grp_node(c, xent, xlen, 0);
1331
1332 ino = (void *)xent + aligned_xlen;
1333 pack_inode(c, ino, inode, 0);
1334 ino = (void *)ino + UBIFS_INO_NODE_SZ;
1335 pack_inode(c, ino, host, 1);
1336
1337 err = write_head(c, BASEHD, xent, len, &lnum, &xent_offs, sync);
1338 if (!sync && !err)
1339 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, host->i_ino);
1340 release_head(c, BASEHD);
1341 kfree(xent);
1342 if (err)
1343 goto out_ro;
1344
1345
1346 err = ubifs_tnc_remove_nm(c, &xent_key, nm);
1347 if (err)
1348 goto out_ro;
1349 err = ubifs_add_dirt(c, lnum, xlen);
1350 if (err)
1351 goto out_ro;
1352
1353
1354
1355
1356
1357 lowest_ino_key(c, &key1, inode->i_ino);
1358 highest_ino_key(c, &key2, inode->i_ino);
1359 err = ubifs_tnc_remove_range(c, &key1, &key2);
1360 if (err)
1361 goto out_ro;
1362 err = ubifs_add_dirt(c, lnum, UBIFS_INO_NODE_SZ);
1363 if (err)
1364 goto out_ro;
1365
1366
1367 ino_key_init(c, &key1, host->i_ino);
1368 err = ubifs_tnc_add(c, &key1, lnum, xent_offs + len - hlen, hlen);
1369 if (err)
1370 goto out_ro;
1371
1372 finish_reservation(c);
1373 spin_lock(&host_ui->ui_lock);
1374 host_ui->synced_i_size = host_ui->ui_size;
1375 spin_unlock(&host_ui->ui_lock);
1376 mark_inode_clean(c, host_ui);
1377 return 0;
1378
1379out_ro:
1380 ubifs_ro_mode(c, err);
1381 finish_reservation(c);
1382 return err;
1383}
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
1399 const struct inode *host)
1400{
1401 int err, len1, len2, aligned_len, aligned_len1, lnum, offs;
1402 struct ubifs_inode *host_ui = ubifs_inode(host);
1403 struct ubifs_ino_node *ino;
1404 union ubifs_key key;
1405 int sync = IS_DIRSYNC(host);
1406
1407 dbg_jnl("ino %lu, ino %lu", host->i_ino, inode->i_ino);
1408 ubifs_assert(host->i_nlink > 0);
1409 ubifs_assert(inode->i_nlink > 0);
1410 ubifs_assert(mutex_is_locked(&host_ui->ui_mutex));
1411
1412 len1 = UBIFS_INO_NODE_SZ + host_ui->data_len;
1413 len2 = UBIFS_INO_NODE_SZ + ubifs_inode(inode)->data_len;
1414 aligned_len1 = ALIGN(len1, 8);
1415 aligned_len = aligned_len1 + ALIGN(len2, 8);
1416
1417 ino = kmalloc(aligned_len, GFP_NOFS);
1418 if (!ino)
1419 return -ENOMEM;
1420
1421
1422 err = make_reservation(c, BASEHD, aligned_len);
1423 if (err)
1424 goto out_free;
1425
1426 pack_inode(c, ino, host, 0);
1427 pack_inode(c, (void *)ino + aligned_len1, inode, 1);
1428
1429 err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0);
1430 if (!sync && !err) {
1431 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1432
1433 ubifs_wbuf_add_ino_nolock(wbuf, host->i_ino);
1434 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino);
1435 }
1436 release_head(c, BASEHD);
1437 if (err)
1438 goto out_ro;
1439
1440 ino_key_init(c, &key, host->i_ino);
1441 err = ubifs_tnc_add(c, &key, lnum, offs, len1);
1442 if (err)
1443 goto out_ro;
1444
1445 ino_key_init(c, &key, inode->i_ino);
1446 err = ubifs_tnc_add(c, &key, lnum, offs + aligned_len1, len2);
1447 if (err)
1448 goto out_ro;
1449
1450 finish_reservation(c);
1451 spin_lock(&host_ui->ui_lock);
1452 host_ui->synced_i_size = host_ui->ui_size;
1453 spin_unlock(&host_ui->ui_lock);
1454 mark_inode_clean(c, host_ui);
1455 kfree(ino);
1456 return 0;
1457
1458out_ro:
1459 ubifs_ro_mode(c, err);
1460 finish_reservation(c);
1461out_free:
1462 kfree(ino);
1463 return err;
1464}
1465
1466#endif
1467