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#include "ubifs.h"
50
51
52
53
54
55static inline void zero_ino_node_unused(struct ubifs_ino_node *ino)
56{
57 memset(ino->padding1, 0, 4);
58 memset(ino->padding2, 0, 26);
59}
60
61
62
63
64
65
66static inline void zero_dent_node_unused(struct ubifs_dent_node *dent)
67{
68 dent->padding1 = 0;
69}
70
71
72
73
74
75
76static inline void zero_trun_node_unused(struct ubifs_trun_node *trun)
77{
78 memset(trun->padding, 0, 12);
79}
80
81static void ubifs_add_auth_dirt(struct ubifs_info *c, int lnum)
82{
83 if (ubifs_authenticated(c))
84 ubifs_add_dirt(c, lnum, ubifs_auth_node_sz(c));
85}
86
87
88
89
90
91
92
93
94
95
96
97
98static int reserve_space(struct ubifs_info *c, int jhead, int len)
99{
100 int err = 0, err1, retries = 0, avail, lnum, offs, squeeze;
101 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf;
102
103
104
105
106
107
108 ubifs_assert(c, !c->ro_media && !c->ro_mount);
109 squeeze = (jhead == BASEHD);
110again:
111 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead);
112
113 if (c->ro_error) {
114 err = -EROFS;
115 goto out_unlock;
116 }
117
118 avail = c->leb_size - wbuf->offs - wbuf->used;
119 if (wbuf->lnum != -1 && avail >= len)
120 return 0;
121
122
123
124
125
126 lnum = ubifs_find_free_space(c, len, &offs, squeeze);
127 if (lnum >= 0)
128 goto out;
129
130 err = lnum;
131 if (err != -ENOSPC)
132 goto out_unlock;
133
134
135
136
137
138
139 dbg_jnl("no free space in jhead %s, run GC", dbg_jhead(jhead));
140 mutex_unlock(&wbuf->io_mutex);
141
142 lnum = ubifs_garbage_collect(c, 0);
143 if (lnum < 0) {
144 err = lnum;
145 if (err != -ENOSPC)
146 return err;
147
148
149
150
151
152
153
154 dbg_jnl("GC couldn't make a free LEB for jhead %s",
155 dbg_jhead(jhead));
156 if (retries++ < 2) {
157 dbg_jnl("retry (%d)", retries);
158 goto again;
159 }
160
161 dbg_jnl("return -ENOSPC");
162 return err;
163 }
164
165 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead);
166 dbg_jnl("got LEB %d for jhead %s", lnum, dbg_jhead(jhead));
167 avail = c->leb_size - wbuf->offs - wbuf->used;
168
169 if (wbuf->lnum != -1 && avail >= len) {
170
171
172
173
174
175 dbg_jnl("return LEB %d back, already have LEB %d:%d",
176 lnum, wbuf->lnum, wbuf->offs + wbuf->used);
177 err = ubifs_return_leb(c, lnum);
178 if (err)
179 goto out_unlock;
180 return 0;
181 }
182
183 offs = 0;
184
185out:
186
187
188
189
190
191
192
193
194 err = ubifs_wbuf_sync_nolock(wbuf);
195 if (err)
196 goto out_return;
197 err = ubifs_add_bud_to_log(c, jhead, lnum, offs);
198 if (err)
199 goto out_return;
200 err = ubifs_wbuf_seek_nolock(wbuf, lnum, offs);
201 if (err)
202 goto out_unlock;
203
204 return 0;
205
206out_unlock:
207 mutex_unlock(&wbuf->io_mutex);
208 return err;
209
210out_return:
211
212 ubifs_assert(c, err < 0);
213 err1 = ubifs_return_leb(c, lnum);
214 if (err1 && err == -EAGAIN)
215
216
217
218
219
220 err = err1;
221 mutex_unlock(&wbuf->io_mutex);
222 return err;
223}
224
225static int ubifs_hash_nodes(struct ubifs_info *c, void *node,
226 int len, struct shash_desc *hash)
227{
228 int auth_node_size = ubifs_auth_node_sz(c);
229 int err;
230
231 while (1) {
232 const struct ubifs_ch *ch = node;
233 int nodelen = le32_to_cpu(ch->len);
234
235 ubifs_assert(c, len >= auth_node_size);
236
237 if (len == auth_node_size)
238 break;
239
240 ubifs_assert(c, len > nodelen);
241 ubifs_assert(c, ch->magic == cpu_to_le32(UBIFS_NODE_MAGIC));
242
243 err = ubifs_shash_update(c, hash, (void *)node, nodelen);
244 if (err)
245 return err;
246
247 node += ALIGN(nodelen, 8);
248 len -= ALIGN(nodelen, 8);
249 }
250
251 return ubifs_prepare_auth_node(c, node, hash);
252}
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268static int write_head(struct ubifs_info *c, int jhead, void *buf, int len,
269 int *lnum, int *offs, int sync)
270{
271 int err;
272 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf;
273
274 ubifs_assert(c, jhead != GCHD);
275
276 *lnum = c->jheads[jhead].wbuf.lnum;
277 *offs = c->jheads[jhead].wbuf.offs + c->jheads[jhead].wbuf.used;
278 dbg_jnl("jhead %s, LEB %d:%d, len %d",
279 dbg_jhead(jhead), *lnum, *offs, len);
280
281 if (ubifs_authenticated(c)) {
282 err = ubifs_hash_nodes(c, buf, len, c->jheads[jhead].log_hash);
283 if (err)
284 return err;
285 }
286
287 err = ubifs_wbuf_write_nolock(wbuf, buf, len);
288 if (err)
289 return err;
290 if (sync)
291 err = ubifs_wbuf_sync_nolock(wbuf);
292 return err;
293}
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311static int make_reservation(struct ubifs_info *c, int jhead, int len)
312{
313 int err, cmt_retries = 0, nospc_retries = 0;
314
315again:
316 down_read(&c->commit_sem);
317 err = reserve_space(c, jhead, len);
318 if (!err)
319
320 return 0;
321 up_read(&c->commit_sem);
322
323 if (err == -ENOSPC) {
324
325
326
327
328
329
330 if (nospc_retries++ < 2) {
331 dbg_jnl("no space, retry");
332 err = -EAGAIN;
333 }
334
335
336
337
338
339
340
341 }
342
343 if (err != -EAGAIN)
344 goto out;
345
346
347
348
349
350 if (cmt_retries > 128) {
351
352
353
354
355 ubifs_err(c, "stuck in space allocation");
356 err = -ENOSPC;
357 goto out;
358 } else if (cmt_retries > 32)
359 ubifs_warn(c, "too many space allocation re-tries (%d)",
360 cmt_retries);
361
362 dbg_jnl("-EAGAIN, commit and retry (retried %d times)",
363 cmt_retries);
364 cmt_retries += 1;
365
366 err = ubifs_run_commit(c);
367 if (err)
368 return err;
369 goto again;
370
371out:
372 ubifs_err(c, "cannot reserve %d bytes in jhead %d, error %d",
373 len, jhead, err);
374 if (err == -ENOSPC) {
375
376 down_write(&c->commit_sem);
377 dump_stack();
378 ubifs_dump_budg(c, &c->bi);
379 ubifs_dump_lprops(c);
380 cmt_retries = dbg_check_lprops(c);
381 up_write(&c->commit_sem);
382 }
383 return err;
384}
385
386
387
388
389
390
391
392
393
394
395static inline void release_head(struct ubifs_info *c, int jhead)
396{
397 mutex_unlock(&c->jheads[jhead].wbuf.io_mutex);
398}
399
400
401
402
403
404
405
406
407static void finish_reservation(struct ubifs_info *c)
408{
409 up_read(&c->commit_sem);
410}
411
412
413
414
415
416static int get_dent_type(int mode)
417{
418 switch (mode & S_IFMT) {
419 case S_IFREG:
420 return UBIFS_ITYPE_REG;
421 case S_IFDIR:
422 return UBIFS_ITYPE_DIR;
423 case S_IFLNK:
424 return UBIFS_ITYPE_LNK;
425 case S_IFBLK:
426 return UBIFS_ITYPE_BLK;
427 case S_IFCHR:
428 return UBIFS_ITYPE_CHR;
429 case S_IFIFO:
430 return UBIFS_ITYPE_FIFO;
431 case S_IFSOCK:
432 return UBIFS_ITYPE_SOCK;
433 default:
434 BUG();
435 }
436 return 0;
437}
438
439
440
441
442
443
444
445
446static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino,
447 const struct inode *inode, int last)
448{
449 int data_len = 0, last_reference = !inode->i_nlink;
450 struct ubifs_inode *ui = ubifs_inode(inode);
451
452 ino->ch.node_type = UBIFS_INO_NODE;
453 ino_key_init_flash(c, &ino->key, inode->i_ino);
454 ino->creat_sqnum = cpu_to_le64(ui->creat_sqnum);
455 ino->atime_sec = cpu_to_le64(inode->i_atime.tv_sec);
456 ino->atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
457 ino->ctime_sec = cpu_to_le64(inode->i_ctime.tv_sec);
458 ino->ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
459 ino->mtime_sec = cpu_to_le64(inode->i_mtime.tv_sec);
460 ino->mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
461 ino->uid = cpu_to_le32(i_uid_read(inode));
462 ino->gid = cpu_to_le32(i_gid_read(inode));
463 ino->mode = cpu_to_le32(inode->i_mode);
464 ino->flags = cpu_to_le32(ui->flags);
465 ino->size = cpu_to_le64(ui->ui_size);
466 ino->nlink = cpu_to_le32(inode->i_nlink);
467 ino->compr_type = cpu_to_le16(ui->compr_type);
468 ino->data_len = cpu_to_le32(ui->data_len);
469 ino->xattr_cnt = cpu_to_le32(ui->xattr_cnt);
470 ino->xattr_size = cpu_to_le32(ui->xattr_size);
471 ino->xattr_names = cpu_to_le32(ui->xattr_names);
472 zero_ino_node_unused(ino);
473
474
475
476
477
478 if (!last_reference) {
479 memcpy(ino->data, ui->data, ui->data_len);
480 data_len = ui->data_len;
481 }
482
483 ubifs_prep_grp_node(c, ino, UBIFS_INO_NODE_SZ + data_len, last);
484}
485
486
487
488
489
490
491
492
493
494
495
496static void mark_inode_clean(struct ubifs_info *c, struct ubifs_inode *ui)
497{
498 if (ui->dirty)
499 ubifs_release_dirty_inode_budget(c, ui);
500 ui->dirty = 0;
501}
502
503static void set_dent_cookie(struct ubifs_info *c, struct ubifs_dent_node *dent)
504{
505 if (c->double_hash)
506 dent->cookie = (__force __le32) prandom_u32();
507 else
508 dent->cookie = 0;
509}
510
511
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
538int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
539 const struct fscrypt_name *nm, const struct inode *inode,
540 int deletion, int xent)
541{
542 int err, dlen, ilen, len, lnum, ino_offs, dent_offs, orphan_added = 0;
543 int aligned_dlen, aligned_ilen, sync = IS_DIRSYNC(dir);
544 int last_reference = !!(deletion && inode->i_nlink == 0);
545 struct ubifs_inode *ui = ubifs_inode(inode);
546 struct ubifs_inode *host_ui = ubifs_inode(dir);
547 struct ubifs_dent_node *dent;
548 struct ubifs_ino_node *ino;
549 union ubifs_key dent_key, ino_key;
550 u8 hash_dent[UBIFS_HASH_ARR_SZ];
551 u8 hash_ino[UBIFS_HASH_ARR_SZ];
552 u8 hash_ino_host[UBIFS_HASH_ARR_SZ];
553
554 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex));
555
556 dlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
557 ilen = UBIFS_INO_NODE_SZ;
558
559
560
561
562
563
564
565 if (!last_reference) {
566 ilen += ui->data_len;
567 sync |= IS_SYNC(inode);
568 }
569
570 aligned_dlen = ALIGN(dlen, 8);
571 aligned_ilen = ALIGN(ilen, 8);
572
573 len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
574
575 if (ubifs_authenticated(c))
576 len += ALIGN(host_ui->data_len, 8) + ubifs_auth_node_sz(c);
577 else
578 len += host_ui->data_len;
579
580 dent = kzalloc(len, GFP_NOFS);
581 if (!dent)
582 return -ENOMEM;
583
584
585 err = make_reservation(c, BASEHD, len);
586 if (err)
587 goto out_free;
588
589 if (!xent) {
590 dent->ch.node_type = UBIFS_DENT_NODE;
591 if (fname_name(nm) == NULL)
592 dent_key_init_hash(c, &dent_key, dir->i_ino, nm->hash);
593 else
594 dent_key_init(c, &dent_key, dir->i_ino, nm);
595 } else {
596 dent->ch.node_type = UBIFS_XENT_NODE;
597 xent_key_init(c, &dent_key, dir->i_ino, nm);
598 }
599
600 key_write(c, &dent_key, dent->key);
601 dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino);
602 dent->type = get_dent_type(inode->i_mode);
603 dent->nlen = cpu_to_le16(fname_len(nm));
604 memcpy(dent->name, fname_name(nm), fname_len(nm));
605 dent->name[fname_len(nm)] = '\0';
606 set_dent_cookie(c, dent);
607
608 zero_dent_node_unused(dent);
609 ubifs_prep_grp_node(c, dent, dlen, 0);
610 err = ubifs_node_calc_hash(c, dent, hash_dent);
611 if (err)
612 goto out_release;
613
614 ino = (void *)dent + aligned_dlen;
615 pack_inode(c, ino, inode, 0);
616 err = ubifs_node_calc_hash(c, ino, hash_ino);
617 if (err)
618 goto out_release;
619
620 ino = (void *)ino + aligned_ilen;
621 pack_inode(c, ino, dir, 1);
622 err = ubifs_node_calc_hash(c, ino, hash_ino_host);
623 if (err)
624 goto out_release;
625
626 if (last_reference) {
627 err = ubifs_add_orphan(c, inode->i_ino);
628 if (err) {
629 release_head(c, BASEHD);
630 goto out_finish;
631 }
632 ui->del_cmtno = c->cmt_no;
633 orphan_added = 1;
634 }
635
636 err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync);
637 if (err)
638 goto out_release;
639 if (!sync) {
640 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
641
642 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino);
643 ubifs_wbuf_add_ino_nolock(wbuf, dir->i_ino);
644 }
645 release_head(c, BASEHD);
646 kfree(dent);
647 ubifs_add_auth_dirt(c, lnum);
648
649 if (deletion) {
650 if (fname_name(nm) == NULL)
651 err = ubifs_tnc_remove_dh(c, &dent_key, nm->minor_hash);
652 else
653 err = ubifs_tnc_remove_nm(c, &dent_key, nm);
654 if (err)
655 goto out_ro;
656 err = ubifs_add_dirt(c, lnum, dlen);
657 } else
658 err = ubifs_tnc_add_nm(c, &dent_key, lnum, dent_offs, dlen,
659 hash_dent, nm);
660 if (err)
661 goto out_ro;
662
663
664
665
666
667
668
669 ino_key_init(c, &ino_key, inode->i_ino);
670 ino_offs = dent_offs + aligned_dlen;
671 err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, ilen, hash_ino);
672 if (err)
673 goto out_ro;
674
675 ino_key_init(c, &ino_key, dir->i_ino);
676 ino_offs += aligned_ilen;
677 err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs,
678 UBIFS_INO_NODE_SZ + host_ui->data_len, hash_ino_host);
679 if (err)
680 goto out_ro;
681
682 finish_reservation(c);
683 spin_lock(&ui->ui_lock);
684 ui->synced_i_size = ui->ui_size;
685 spin_unlock(&ui->ui_lock);
686 if (xent) {
687 spin_lock(&host_ui->ui_lock);
688 host_ui->synced_i_size = host_ui->ui_size;
689 spin_unlock(&host_ui->ui_lock);
690 }
691 mark_inode_clean(c, ui);
692 mark_inode_clean(c, host_ui);
693 return 0;
694
695out_finish:
696 finish_reservation(c);
697out_free:
698 kfree(dent);
699 return err;
700
701out_release:
702 release_head(c, BASEHD);
703 kfree(dent);
704out_ro:
705 ubifs_ro_mode(c, err);
706 if (orphan_added)
707 ubifs_delete_orphan(c, inode->i_ino);
708 finish_reservation(c);
709 return err;
710}
711
712
713
714
715
716
717
718
719
720
721
722
723int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
724 const union ubifs_key *key, const void *buf, int len)
725{
726 struct ubifs_data_node *data;
727 int err, lnum, offs, compr_type, out_len, compr_len, auth_len;
728 int dlen = COMPRESSED_DATA_NODE_BUF_SZ, allocated = 1;
729 int write_len;
730 struct ubifs_inode *ui = ubifs_inode(inode);
731 bool encrypted = IS_ENCRYPTED(inode);
732 u8 hash[UBIFS_HASH_ARR_SZ];
733
734 dbg_jnlk(key, "ino %lu, blk %u, len %d, key ",
735 (unsigned long)key_inum(c, key), key_block(c, key), len);
736 ubifs_assert(c, len <= UBIFS_BLOCK_SIZE);
737
738 if (encrypted)
739 dlen += UBIFS_CIPHER_BLOCK_SIZE;
740
741 auth_len = ubifs_auth_node_sz(c);
742
743 data = kmalloc(dlen + auth_len, GFP_NOFS | __GFP_NOWARN);
744 if (!data) {
745
746
747
748
749
750
751
752 allocated = 0;
753 mutex_lock(&c->write_reserve_mutex);
754 data = c->write_reserve_buf;
755 }
756
757 data->ch.node_type = UBIFS_DATA_NODE;
758 key_write(c, key, &data->key);
759 data->size = cpu_to_le32(len);
760
761 if (!(ui->flags & UBIFS_COMPR_FL))
762
763 compr_type = UBIFS_COMPR_NONE;
764 else
765 compr_type = ui->compr_type;
766
767 out_len = compr_len = dlen - UBIFS_DATA_NODE_SZ;
768 ubifs_compress(c, buf, len, &data->data, &compr_len, &compr_type);
769 ubifs_assert(c, compr_len <= UBIFS_BLOCK_SIZE);
770
771 if (encrypted) {
772 err = ubifs_encrypt(inode, data, compr_len, &out_len, key_block(c, key));
773 if (err)
774 goto out_free;
775
776 } else {
777 data->compr_size = 0;
778 out_len = compr_len;
779 }
780
781 dlen = UBIFS_DATA_NODE_SZ + out_len;
782 if (ubifs_authenticated(c))
783 write_len = ALIGN(dlen, 8) + auth_len;
784 else
785 write_len = dlen;
786
787 data->compr_type = cpu_to_le16(compr_type);
788
789
790 err = make_reservation(c, DATAHD, write_len);
791 if (err)
792 goto out_free;
793
794 ubifs_prepare_node(c, data, dlen, 0);
795 err = write_head(c, DATAHD, data, write_len, &lnum, &offs, 0);
796 if (err)
797 goto out_release;
798
799 err = ubifs_node_calc_hash(c, data, hash);
800 if (err)
801 goto out_release;
802
803 ubifs_wbuf_add_ino_nolock(&c->jheads[DATAHD].wbuf, key_inum(c, key));
804 release_head(c, DATAHD);
805
806 ubifs_add_auth_dirt(c, lnum);
807
808 err = ubifs_tnc_add(c, key, lnum, offs, dlen, hash);
809 if (err)
810 goto out_ro;
811
812 finish_reservation(c);
813 if (!allocated)
814 mutex_unlock(&c->write_reserve_mutex);
815 else
816 kfree(data);
817 return 0;
818
819out_release:
820 release_head(c, DATAHD);
821out_ro:
822 ubifs_ro_mode(c, err);
823 finish_reservation(c);
824out_free:
825 if (!allocated)
826 mutex_unlock(&c->write_reserve_mutex);
827 else
828 kfree(data);
829 return err;
830}
831
832
833
834
835
836
837
838
839
840
841int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
842{
843 int err, lnum, offs;
844 struct ubifs_ino_node *ino, *ino_start;
845 struct ubifs_inode *ui = ubifs_inode(inode);
846 int sync = 0, write_len = 0, ilen = UBIFS_INO_NODE_SZ;
847 int last_reference = !inode->i_nlink;
848 int kill_xattrs = ui->xattr_cnt && last_reference;
849 u8 hash[UBIFS_HASH_ARR_SZ];
850
851 dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink);
852
853
854
855
856
857 if (!last_reference) {
858 ilen += ui->data_len;
859 sync = IS_SYNC(inode);
860 } else if (kill_xattrs) {
861 write_len += UBIFS_INO_NODE_SZ * ui->xattr_cnt;
862 }
863
864 if (ubifs_authenticated(c))
865 write_len += ALIGN(ilen, 8) + ubifs_auth_node_sz(c);
866 else
867 write_len += ilen;
868
869 ino_start = ino = kmalloc(write_len, GFP_NOFS);
870 if (!ino)
871 return -ENOMEM;
872
873
874 err = make_reservation(c, BASEHD, write_len);
875 if (err)
876 goto out_free;
877
878 if (kill_xattrs) {
879 union ubifs_key key;
880 struct fscrypt_name nm = {0};
881 struct inode *xino;
882 struct ubifs_dent_node *xent, *pxent = NULL;
883
884 if (ui->xattr_cnt > ubifs_xattr_max_cnt(c)) {
885 err = -EPERM;
886 ubifs_err(c, "Cannot delete inode, it has too much xattrs!");
887 goto out_release;
888 }
889
890 lowest_xent_key(c, &key, inode->i_ino);
891 while (1) {
892 xent = ubifs_tnc_next_ent(c, &key, &nm);
893 if (IS_ERR(xent)) {
894 err = PTR_ERR(xent);
895 if (err == -ENOENT)
896 break;
897
898 kfree(pxent);
899 goto out_release;
900 }
901
902 fname_name(&nm) = xent->name;
903 fname_len(&nm) = le16_to_cpu(xent->nlen);
904
905 xino = ubifs_iget(c->vfs_sb, le64_to_cpu(xent->inum));
906 if (IS_ERR(xino)) {
907 err = PTR_ERR(xino);
908 ubifs_err(c, "dead directory entry '%s', error %d",
909 xent->name, err);
910 ubifs_ro_mode(c, err);
911 kfree(pxent);
912 kfree(xent);
913 goto out_release;
914 }
915 ubifs_assert(c, ubifs_inode(xino)->xattr);
916
917 clear_nlink(xino);
918 pack_inode(c, ino, xino, 0);
919 ino = (void *)ino + UBIFS_INO_NODE_SZ;
920 iput(xino);
921
922 kfree(pxent);
923 pxent = xent;
924 key_read(c, &xent->key, &key);
925 }
926 kfree(pxent);
927 }
928
929 pack_inode(c, ino, inode, 1);
930 err = ubifs_node_calc_hash(c, ino, hash);
931 if (err)
932 goto out_release;
933
934 err = write_head(c, BASEHD, ino_start, write_len, &lnum, &offs, sync);
935 if (err)
936 goto out_release;
937 if (!sync)
938 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
939 inode->i_ino);
940 release_head(c, BASEHD);
941
942 if (last_reference) {
943 err = ubifs_tnc_remove_ino(c, inode->i_ino);
944 if (err)
945 goto out_ro;
946 ubifs_delete_orphan(c, inode->i_ino);
947 err = ubifs_add_dirt(c, lnum, write_len);
948 } else {
949 union ubifs_key key;
950
951 ubifs_add_auth_dirt(c, lnum);
952
953 ino_key_init(c, &key, inode->i_ino);
954 err = ubifs_tnc_add(c, &key, lnum, offs, ilen, hash);
955 }
956 if (err)
957 goto out_ro;
958
959 finish_reservation(c);
960 spin_lock(&ui->ui_lock);
961 ui->synced_i_size = ui->ui_size;
962 spin_unlock(&ui->ui_lock);
963 kfree(ino_start);
964 return 0;
965
966out_release:
967 release_head(c, BASEHD);
968out_ro:
969 ubifs_ro_mode(c, err);
970 finish_reservation(c);
971out_free:
972 kfree(ino_start);
973 return err;
974}
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode)
1006{
1007 int err;
1008 struct ubifs_inode *ui = ubifs_inode(inode);
1009
1010 ubifs_assert(c, inode->i_nlink == 0);
1011
1012 if (ui->xattr_cnt || ui->del_cmtno != c->cmt_no)
1013
1014 return ubifs_jnl_write_inode(c, inode);
1015
1016 down_read(&c->commit_sem);
1017
1018
1019
1020
1021 if (ui->del_cmtno != c->cmt_no) {
1022 up_read(&c->commit_sem);
1023 return ubifs_jnl_write_inode(c, inode);
1024 }
1025
1026 err = ubifs_tnc_remove_ino(c, inode->i_ino);
1027 if (err)
1028 ubifs_ro_mode(c, err);
1029 else
1030 ubifs_delete_orphan(c, inode->i_ino);
1031 up_read(&c->commit_sem);
1032 return err;
1033}
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
1052 const struct inode *fst_inode,
1053 const struct fscrypt_name *fst_nm,
1054 const struct inode *snd_dir,
1055 const struct inode *snd_inode,
1056 const struct fscrypt_name *snd_nm, int sync)
1057{
1058 union ubifs_key key;
1059 struct ubifs_dent_node *dent1, *dent2;
1060 int err, dlen1, dlen2, lnum, offs, len, plen = UBIFS_INO_NODE_SZ;
1061 int aligned_dlen1, aligned_dlen2;
1062 int twoparents = (fst_dir != snd_dir);
1063 void *p;
1064 u8 hash_dent1[UBIFS_HASH_ARR_SZ];
1065 u8 hash_dent2[UBIFS_HASH_ARR_SZ];
1066 u8 hash_p1[UBIFS_HASH_ARR_SZ];
1067 u8 hash_p2[UBIFS_HASH_ARR_SZ];
1068
1069 ubifs_assert(c, ubifs_inode(fst_dir)->data_len == 0);
1070 ubifs_assert(c, ubifs_inode(snd_dir)->data_len == 0);
1071 ubifs_assert(c, mutex_is_locked(&ubifs_inode(fst_dir)->ui_mutex));
1072 ubifs_assert(c, mutex_is_locked(&ubifs_inode(snd_dir)->ui_mutex));
1073
1074 dlen1 = UBIFS_DENT_NODE_SZ + fname_len(snd_nm) + 1;
1075 dlen2 = UBIFS_DENT_NODE_SZ + fname_len(fst_nm) + 1;
1076 aligned_dlen1 = ALIGN(dlen1, 8);
1077 aligned_dlen2 = ALIGN(dlen2, 8);
1078
1079 len = aligned_dlen1 + aligned_dlen2 + ALIGN(plen, 8);
1080 if (twoparents)
1081 len += plen;
1082
1083 len += ubifs_auth_node_sz(c);
1084
1085 dent1 = kzalloc(len, GFP_NOFS);
1086 if (!dent1)
1087 return -ENOMEM;
1088
1089
1090 err = make_reservation(c, BASEHD, len);
1091 if (err)
1092 goto out_free;
1093
1094
1095 dent1->ch.node_type = UBIFS_DENT_NODE;
1096 dent_key_init_flash(c, &dent1->key, snd_dir->i_ino, snd_nm);
1097 dent1->inum = cpu_to_le64(fst_inode->i_ino);
1098 dent1->type = get_dent_type(fst_inode->i_mode);
1099 dent1->nlen = cpu_to_le16(fname_len(snd_nm));
1100 memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm));
1101 dent1->name[fname_len(snd_nm)] = '\0';
1102 set_dent_cookie(c, dent1);
1103 zero_dent_node_unused(dent1);
1104 ubifs_prep_grp_node(c, dent1, dlen1, 0);
1105 err = ubifs_node_calc_hash(c, dent1, hash_dent1);
1106 if (err)
1107 goto out_release;
1108
1109
1110 dent2 = (void *)dent1 + aligned_dlen1;
1111 dent2->ch.node_type = UBIFS_DENT_NODE;
1112 dent_key_init_flash(c, &dent2->key, fst_dir->i_ino, fst_nm);
1113 dent2->inum = cpu_to_le64(snd_inode->i_ino);
1114 dent2->type = get_dent_type(snd_inode->i_mode);
1115 dent2->nlen = cpu_to_le16(fname_len(fst_nm));
1116 memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm));
1117 dent2->name[fname_len(fst_nm)] = '\0';
1118 set_dent_cookie(c, dent2);
1119 zero_dent_node_unused(dent2);
1120 ubifs_prep_grp_node(c, dent2, dlen2, 0);
1121 err = ubifs_node_calc_hash(c, dent2, hash_dent2);
1122 if (err)
1123 goto out_release;
1124
1125 p = (void *)dent2 + aligned_dlen2;
1126 if (!twoparents) {
1127 pack_inode(c, p, fst_dir, 1);
1128 err = ubifs_node_calc_hash(c, p, hash_p1);
1129 if (err)
1130 goto out_release;
1131 } else {
1132 pack_inode(c, p, fst_dir, 0);
1133 err = ubifs_node_calc_hash(c, p, hash_p1);
1134 if (err)
1135 goto out_release;
1136 p += ALIGN(plen, 8);
1137 pack_inode(c, p, snd_dir, 1);
1138 err = ubifs_node_calc_hash(c, p, hash_p2);
1139 if (err)
1140 goto out_release;
1141 }
1142
1143 err = write_head(c, BASEHD, dent1, len, &lnum, &offs, sync);
1144 if (err)
1145 goto out_release;
1146 if (!sync) {
1147 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1148
1149 ubifs_wbuf_add_ino_nolock(wbuf, fst_dir->i_ino);
1150 ubifs_wbuf_add_ino_nolock(wbuf, snd_dir->i_ino);
1151 }
1152 release_head(c, BASEHD);
1153
1154 ubifs_add_auth_dirt(c, lnum);
1155
1156 dent_key_init(c, &key, snd_dir->i_ino, snd_nm);
1157 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, hash_dent1, snd_nm);
1158 if (err)
1159 goto out_ro;
1160
1161 offs += aligned_dlen1;
1162 dent_key_init(c, &key, fst_dir->i_ino, fst_nm);
1163 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, hash_dent2, fst_nm);
1164 if (err)
1165 goto out_ro;
1166
1167 offs += aligned_dlen2;
1168
1169 ino_key_init(c, &key, fst_dir->i_ino);
1170 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_p1);
1171 if (err)
1172 goto out_ro;
1173
1174 if (twoparents) {
1175 offs += ALIGN(plen, 8);
1176 ino_key_init(c, &key, snd_dir->i_ino);
1177 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_p2);
1178 if (err)
1179 goto out_ro;
1180 }
1181
1182 finish_reservation(c);
1183
1184 mark_inode_clean(c, ubifs_inode(fst_dir));
1185 if (twoparents)
1186 mark_inode_clean(c, ubifs_inode(snd_dir));
1187 kfree(dent1);
1188 return 0;
1189
1190out_release:
1191 release_head(c, BASEHD);
1192out_ro:
1193 ubifs_ro_mode(c, err);
1194 finish_reservation(c);
1195out_free:
1196 kfree(dent1);
1197 return err;
1198}
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
1215 const struct inode *old_inode,
1216 const struct fscrypt_name *old_nm,
1217 const struct inode *new_dir,
1218 const struct inode *new_inode,
1219 const struct fscrypt_name *new_nm,
1220 const struct inode *whiteout, int sync)
1221{
1222 void *p;
1223 union ubifs_key key;
1224 struct ubifs_dent_node *dent, *dent2;
1225 int err, dlen1, dlen2, ilen, wlen, lnum, offs, len, orphan_added = 0;
1226 int aligned_dlen1, aligned_dlen2, plen = UBIFS_INO_NODE_SZ;
1227 int last_reference = !!(new_inode && new_inode->i_nlink == 0);
1228 int move = (old_dir != new_dir);
1229 struct ubifs_inode *new_ui, *whiteout_ui;
1230 u8 hash_old_dir[UBIFS_HASH_ARR_SZ];
1231 u8 hash_new_dir[UBIFS_HASH_ARR_SZ];
1232 u8 hash_new_inode[UBIFS_HASH_ARR_SZ];
1233 u8 hash_whiteout_inode[UBIFS_HASH_ARR_SZ];
1234 u8 hash_dent1[UBIFS_HASH_ARR_SZ];
1235 u8 hash_dent2[UBIFS_HASH_ARR_SZ];
1236
1237 ubifs_assert(c, ubifs_inode(old_dir)->data_len == 0);
1238 ubifs_assert(c, ubifs_inode(new_dir)->data_len == 0);
1239 ubifs_assert(c, mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex));
1240 ubifs_assert(c, mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex));
1241
1242 dlen1 = UBIFS_DENT_NODE_SZ + fname_len(new_nm) + 1;
1243 dlen2 = UBIFS_DENT_NODE_SZ + fname_len(old_nm) + 1;
1244 if (new_inode) {
1245 new_ui = ubifs_inode(new_inode);
1246 ubifs_assert(c, mutex_is_locked(&new_ui->ui_mutex));
1247 ilen = UBIFS_INO_NODE_SZ;
1248 if (!last_reference)
1249 ilen += new_ui->data_len;
1250 } else
1251 ilen = 0;
1252
1253 if (whiteout) {
1254 whiteout_ui = ubifs_inode(whiteout);
1255 ubifs_assert(c, mutex_is_locked(&whiteout_ui->ui_mutex));
1256 ubifs_assert(c, whiteout->i_nlink == 1);
1257 ubifs_assert(c, !whiteout_ui->dirty);
1258 wlen = UBIFS_INO_NODE_SZ;
1259 wlen += whiteout_ui->data_len;
1260 } else
1261 wlen = 0;
1262
1263 aligned_dlen1 = ALIGN(dlen1, 8);
1264 aligned_dlen2 = ALIGN(dlen2, 8);
1265 len = aligned_dlen1 + aligned_dlen2 + ALIGN(ilen, 8) +
1266 ALIGN(wlen, 8) + ALIGN(plen, 8);
1267 if (move)
1268 len += plen;
1269
1270 len += ubifs_auth_node_sz(c);
1271
1272 dent = kzalloc(len, GFP_NOFS);
1273 if (!dent)
1274 return -ENOMEM;
1275
1276
1277 err = make_reservation(c, BASEHD, len);
1278 if (err)
1279 goto out_free;
1280
1281
1282 dent->ch.node_type = UBIFS_DENT_NODE;
1283 dent_key_init_flash(c, &dent->key, new_dir->i_ino, new_nm);
1284 dent->inum = cpu_to_le64(old_inode->i_ino);
1285 dent->type = get_dent_type(old_inode->i_mode);
1286 dent->nlen = cpu_to_le16(fname_len(new_nm));
1287 memcpy(dent->name, fname_name(new_nm), fname_len(new_nm));
1288 dent->name[fname_len(new_nm)] = '\0';
1289 set_dent_cookie(c, dent);
1290 zero_dent_node_unused(dent);
1291 ubifs_prep_grp_node(c, dent, dlen1, 0);
1292 err = ubifs_node_calc_hash(c, dent, hash_dent1);
1293 if (err)
1294 goto out_release;
1295
1296 dent2 = (void *)dent + aligned_dlen1;
1297 dent2->ch.node_type = UBIFS_DENT_NODE;
1298 dent_key_init_flash(c, &dent2->key, old_dir->i_ino, old_nm);
1299
1300 if (whiteout) {
1301 dent2->inum = cpu_to_le64(whiteout->i_ino);
1302 dent2->type = get_dent_type(whiteout->i_mode);
1303 } else {
1304
1305 dent2->inum = 0;
1306 dent2->type = DT_UNKNOWN;
1307 }
1308 dent2->nlen = cpu_to_le16(fname_len(old_nm));
1309 memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm));
1310 dent2->name[fname_len(old_nm)] = '\0';
1311 set_dent_cookie(c, dent2);
1312 zero_dent_node_unused(dent2);
1313 ubifs_prep_grp_node(c, dent2, dlen2, 0);
1314 err = ubifs_node_calc_hash(c, dent2, hash_dent2);
1315 if (err)
1316 goto out_release;
1317
1318 p = (void *)dent2 + aligned_dlen2;
1319 if (new_inode) {
1320 pack_inode(c, p, new_inode, 0);
1321 err = ubifs_node_calc_hash(c, p, hash_new_inode);
1322 if (err)
1323 goto out_release;
1324
1325 p += ALIGN(ilen, 8);
1326 }
1327
1328 if (whiteout) {
1329 pack_inode(c, p, whiteout, 0);
1330 err = ubifs_node_calc_hash(c, p, hash_whiteout_inode);
1331 if (err)
1332 goto out_release;
1333
1334 p += ALIGN(wlen, 8);
1335 }
1336
1337 if (!move) {
1338 pack_inode(c, p, old_dir, 1);
1339 err = ubifs_node_calc_hash(c, p, hash_old_dir);
1340 if (err)
1341 goto out_release;
1342 } else {
1343 pack_inode(c, p, old_dir, 0);
1344 err = ubifs_node_calc_hash(c, p, hash_old_dir);
1345 if (err)
1346 goto out_release;
1347
1348 p += ALIGN(plen, 8);
1349 pack_inode(c, p, new_dir, 1);
1350 err = ubifs_node_calc_hash(c, p, hash_new_dir);
1351 if (err)
1352 goto out_release;
1353 }
1354
1355 if (last_reference) {
1356 err = ubifs_add_orphan(c, new_inode->i_ino);
1357 if (err) {
1358 release_head(c, BASEHD);
1359 goto out_finish;
1360 }
1361 new_ui->del_cmtno = c->cmt_no;
1362 orphan_added = 1;
1363 }
1364
1365 err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync);
1366 if (err)
1367 goto out_release;
1368 if (!sync) {
1369 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1370
1371 ubifs_wbuf_add_ino_nolock(wbuf, new_dir->i_ino);
1372 ubifs_wbuf_add_ino_nolock(wbuf, old_dir->i_ino);
1373 if (new_inode)
1374 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
1375 new_inode->i_ino);
1376 if (whiteout)
1377 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
1378 whiteout->i_ino);
1379 }
1380 release_head(c, BASEHD);
1381
1382 ubifs_add_auth_dirt(c, lnum);
1383
1384 dent_key_init(c, &key, new_dir->i_ino, new_nm);
1385 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, hash_dent1, new_nm);
1386 if (err)
1387 goto out_ro;
1388
1389 offs += aligned_dlen1;
1390 if (whiteout) {
1391 dent_key_init(c, &key, old_dir->i_ino, old_nm);
1392 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, hash_dent2, old_nm);
1393 if (err)
1394 goto out_ro;
1395 } else {
1396 err = ubifs_add_dirt(c, lnum, dlen2);
1397 if (err)
1398 goto out_ro;
1399
1400 dent_key_init(c, &key, old_dir->i_ino, old_nm);
1401 err = ubifs_tnc_remove_nm(c, &key, old_nm);
1402 if (err)
1403 goto out_ro;
1404 }
1405
1406 offs += aligned_dlen2;
1407 if (new_inode) {
1408 ino_key_init(c, &key, new_inode->i_ino);
1409 err = ubifs_tnc_add(c, &key, lnum, offs, ilen, hash_new_inode);
1410 if (err)
1411 goto out_ro;
1412 offs += ALIGN(ilen, 8);
1413 }
1414
1415 if (whiteout) {
1416 ino_key_init(c, &key, whiteout->i_ino);
1417 err = ubifs_tnc_add(c, &key, lnum, offs, wlen,
1418 hash_whiteout_inode);
1419 if (err)
1420 goto out_ro;
1421 offs += ALIGN(wlen, 8);
1422 }
1423
1424 ino_key_init(c, &key, old_dir->i_ino);
1425 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_old_dir);
1426 if (err)
1427 goto out_ro;
1428
1429 if (move) {
1430 offs += ALIGN(plen, 8);
1431 ino_key_init(c, &key, new_dir->i_ino);
1432 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_new_dir);
1433 if (err)
1434 goto out_ro;
1435 }
1436
1437 finish_reservation(c);
1438 if (new_inode) {
1439 mark_inode_clean(c, new_ui);
1440 spin_lock(&new_ui->ui_lock);
1441 new_ui->synced_i_size = new_ui->ui_size;
1442 spin_unlock(&new_ui->ui_lock);
1443 }
1444
1445
1446
1447
1448
1449 mark_inode_clean(c, ubifs_inode(old_dir));
1450 if (move)
1451 mark_inode_clean(c, ubifs_inode(new_dir));
1452 kfree(dent);
1453 return 0;
1454
1455out_release:
1456 release_head(c, BASEHD);
1457out_ro:
1458 ubifs_ro_mode(c, err);
1459 if (orphan_added)
1460 ubifs_delete_orphan(c, new_inode->i_ino);
1461out_finish:
1462 finish_reservation(c);
1463out_free:
1464 kfree(dent);
1465 return err;
1466}
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479static int truncate_data_node(const struct ubifs_info *c, const struct inode *inode,
1480 unsigned int block, struct ubifs_data_node *dn,
1481 int *new_len)
1482{
1483 void *buf;
1484 int err, dlen, compr_type, out_len, old_dlen;
1485
1486 out_len = le32_to_cpu(dn->size);
1487 buf = kmalloc_array(out_len, WORST_COMPR_FACTOR, GFP_NOFS);
1488 if (!buf)
1489 return -ENOMEM;
1490
1491 dlen = old_dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
1492 compr_type = le16_to_cpu(dn->compr_type);
1493
1494 if (IS_ENCRYPTED(inode)) {
1495 err = ubifs_decrypt(inode, dn, &dlen, block);
1496 if (err)
1497 goto out;
1498 }
1499
1500 if (compr_type == UBIFS_COMPR_NONE) {
1501 out_len = *new_len;
1502 } else {
1503 err = ubifs_decompress(c, &dn->data, dlen, buf, &out_len, compr_type);
1504 if (err)
1505 goto out;
1506
1507 ubifs_compress(c, buf, *new_len, &dn->data, &out_len, &compr_type);
1508 }
1509
1510 if (IS_ENCRYPTED(inode)) {
1511 err = ubifs_encrypt(inode, dn, out_len, &old_dlen, block);
1512 if (err)
1513 goto out;
1514
1515 out_len = old_dlen;
1516 } else {
1517 dn->compr_size = 0;
1518 }
1519
1520 ubifs_assert(c, out_len <= UBIFS_BLOCK_SIZE);
1521 dn->compr_type = cpu_to_le16(compr_type);
1522 dn->size = cpu_to_le32(*new_len);
1523 *new_len = UBIFS_DATA_NODE_SZ + out_len;
1524 err = 0;
1525out:
1526 kfree(buf);
1527 return err;
1528}
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
1546 loff_t old_size, loff_t new_size)
1547{
1548 union ubifs_key key, to_key;
1549 struct ubifs_ino_node *ino;
1550 struct ubifs_trun_node *trun;
1551 struct ubifs_data_node *dn;
1552 int err, dlen, len, lnum, offs, bit, sz, sync = IS_SYNC(inode);
1553 struct ubifs_inode *ui = ubifs_inode(inode);
1554 ino_t inum = inode->i_ino;
1555 unsigned int blk;
1556 u8 hash_ino[UBIFS_HASH_ARR_SZ];
1557 u8 hash_dn[UBIFS_HASH_ARR_SZ];
1558
1559 dbg_jnl("ino %lu, size %lld -> %lld",
1560 (unsigned long)inum, old_size, new_size);
1561 ubifs_assert(c, !ui->data_len);
1562 ubifs_assert(c, S_ISREG(inode->i_mode));
1563 ubifs_assert(c, mutex_is_locked(&ui->ui_mutex));
1564
1565 sz = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ +
1566 UBIFS_MAX_DATA_NODE_SZ * WORST_COMPR_FACTOR;
1567
1568 sz += ubifs_auth_node_sz(c);
1569
1570 ino = kmalloc(sz, GFP_NOFS);
1571 if (!ino)
1572 return -ENOMEM;
1573
1574 trun = (void *)ino + UBIFS_INO_NODE_SZ;
1575 trun->ch.node_type = UBIFS_TRUN_NODE;
1576 trun->inum = cpu_to_le32(inum);
1577 trun->old_size = cpu_to_le64(old_size);
1578 trun->new_size = cpu_to_le64(new_size);
1579 zero_trun_node_unused(trun);
1580
1581 dlen = new_size & (UBIFS_BLOCK_SIZE - 1);
1582 if (dlen) {
1583
1584 dn = (void *)trun + UBIFS_TRUN_NODE_SZ;
1585 blk = new_size >> UBIFS_BLOCK_SHIFT;
1586 data_key_init(c, &key, inum, blk);
1587 dbg_jnlk(&key, "last block key ");
1588 err = ubifs_tnc_lookup(c, &key, dn);
1589 if (err == -ENOENT)
1590 dlen = 0;
1591 else if (err)
1592 goto out_free;
1593 else {
1594 int dn_len = le32_to_cpu(dn->size);
1595
1596 if (dn_len <= 0 || dn_len > UBIFS_BLOCK_SIZE) {
1597 ubifs_err(c, "bad data node (block %u, inode %lu)",
1598 blk, inode->i_ino);
1599 ubifs_dump_node(c, dn, sz - UBIFS_INO_NODE_SZ -
1600 UBIFS_TRUN_NODE_SZ);
1601 goto out_free;
1602 }
1603
1604 if (dn_len <= dlen)
1605 dlen = 0;
1606 else {
1607 err = truncate_data_node(c, inode, blk, dn, &dlen);
1608 if (err)
1609 goto out_free;
1610 }
1611 }
1612 }
1613
1614
1615 len = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ;
1616
1617 if (ubifs_authenticated(c))
1618 len += ALIGN(dlen, 8) + ubifs_auth_node_sz(c);
1619 else
1620 len += dlen;
1621
1622 err = make_reservation(c, BASEHD, len);
1623 if (err)
1624 goto out_free;
1625
1626 pack_inode(c, ino, inode, 0);
1627 err = ubifs_node_calc_hash(c, ino, hash_ino);
1628 if (err)
1629 goto out_release;
1630
1631 ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1);
1632 if (dlen) {
1633 ubifs_prep_grp_node(c, dn, dlen, 1);
1634 err = ubifs_node_calc_hash(c, dn, hash_dn);
1635 if (err)
1636 goto out_release;
1637 }
1638
1639 err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync);
1640 if (err)
1641 goto out_release;
1642 if (!sync)
1643 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, inum);
1644 release_head(c, BASEHD);
1645
1646 ubifs_add_auth_dirt(c, lnum);
1647
1648 if (dlen) {
1649 sz = offs + UBIFS_INO_NODE_SZ + UBIFS_TRUN_NODE_SZ;
1650 err = ubifs_tnc_add(c, &key, lnum, sz, dlen, hash_dn);
1651 if (err)
1652 goto out_ro;
1653 }
1654
1655 ino_key_init(c, &key, inum);
1656 err = ubifs_tnc_add(c, &key, lnum, offs, UBIFS_INO_NODE_SZ, hash_ino);
1657 if (err)
1658 goto out_ro;
1659
1660 err = ubifs_add_dirt(c, lnum, UBIFS_TRUN_NODE_SZ);
1661 if (err)
1662 goto out_ro;
1663
1664 bit = new_size & (UBIFS_BLOCK_SIZE - 1);
1665 blk = (new_size >> UBIFS_BLOCK_SHIFT) + (bit ? 1 : 0);
1666 data_key_init(c, &key, inum, blk);
1667
1668 bit = old_size & (UBIFS_BLOCK_SIZE - 1);
1669 blk = (old_size >> UBIFS_BLOCK_SHIFT) - (bit ? 0 : 1);
1670 data_key_init(c, &to_key, inum, blk);
1671
1672 err = ubifs_tnc_remove_range(c, &key, &to_key);
1673 if (err)
1674 goto out_ro;
1675
1676 finish_reservation(c);
1677 spin_lock(&ui->ui_lock);
1678 ui->synced_i_size = ui->ui_size;
1679 spin_unlock(&ui->ui_lock);
1680 mark_inode_clean(c, ui);
1681 kfree(ino);
1682 return 0;
1683
1684out_release:
1685 release_head(c, BASEHD);
1686out_ro:
1687 ubifs_ro_mode(c, err);
1688 finish_reservation(c);
1689out_free:
1690 kfree(ino);
1691 return err;
1692}
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
1708 const struct inode *inode,
1709 const struct fscrypt_name *nm)
1710{
1711 int err, xlen, hlen, len, lnum, xent_offs, aligned_xlen, write_len;
1712 struct ubifs_dent_node *xent;
1713 struct ubifs_ino_node *ino;
1714 union ubifs_key xent_key, key1, key2;
1715 int sync = IS_DIRSYNC(host);
1716 struct ubifs_inode *host_ui = ubifs_inode(host);
1717 u8 hash[UBIFS_HASH_ARR_SZ];
1718
1719 ubifs_assert(c, inode->i_nlink == 0);
1720 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex));
1721
1722
1723
1724
1725
1726 xlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
1727 aligned_xlen = ALIGN(xlen, 8);
1728 hlen = host_ui->data_len + UBIFS_INO_NODE_SZ;
1729 len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
1730
1731 write_len = len + ubifs_auth_node_sz(c);
1732
1733 xent = kzalloc(write_len, GFP_NOFS);
1734 if (!xent)
1735 return -ENOMEM;
1736
1737
1738 err = make_reservation(c, BASEHD, write_len);
1739 if (err) {
1740 kfree(xent);
1741 return err;
1742 }
1743
1744 xent->ch.node_type = UBIFS_XENT_NODE;
1745 xent_key_init(c, &xent_key, host->i_ino, nm);
1746 key_write(c, &xent_key, xent->key);
1747 xent->inum = 0;
1748 xent->type = get_dent_type(inode->i_mode);
1749 xent->nlen = cpu_to_le16(fname_len(nm));
1750 memcpy(xent->name, fname_name(nm), fname_len(nm));
1751 xent->name[fname_len(nm)] = '\0';
1752 zero_dent_node_unused(xent);
1753 ubifs_prep_grp_node(c, xent, xlen, 0);
1754
1755 ino = (void *)xent + aligned_xlen;
1756 pack_inode(c, ino, inode, 0);
1757 ino = (void *)ino + UBIFS_INO_NODE_SZ;
1758 pack_inode(c, ino, host, 1);
1759 err = ubifs_node_calc_hash(c, ino, hash);
1760 if (err)
1761 goto out_release;
1762
1763 err = write_head(c, BASEHD, xent, write_len, &lnum, &xent_offs, sync);
1764 if (!sync && !err)
1765 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, host->i_ino);
1766 release_head(c, BASEHD);
1767
1768 ubifs_add_auth_dirt(c, lnum);
1769 kfree(xent);
1770 if (err)
1771 goto out_ro;
1772
1773
1774 err = ubifs_tnc_remove_nm(c, &xent_key, nm);
1775 if (err)
1776 goto out_ro;
1777 err = ubifs_add_dirt(c, lnum, xlen);
1778 if (err)
1779 goto out_ro;
1780
1781
1782
1783
1784
1785 lowest_ino_key(c, &key1, inode->i_ino);
1786 highest_ino_key(c, &key2, inode->i_ino);
1787 err = ubifs_tnc_remove_range(c, &key1, &key2);
1788 if (err)
1789 goto out_ro;
1790 err = ubifs_add_dirt(c, lnum, UBIFS_INO_NODE_SZ);
1791 if (err)
1792 goto out_ro;
1793
1794
1795 ino_key_init(c, &key1, host->i_ino);
1796 err = ubifs_tnc_add(c, &key1, lnum, xent_offs + len - hlen, hlen, hash);
1797 if (err)
1798 goto out_ro;
1799
1800 finish_reservation(c);
1801 spin_lock(&host_ui->ui_lock);
1802 host_ui->synced_i_size = host_ui->ui_size;
1803 spin_unlock(&host_ui->ui_lock);
1804 mark_inode_clean(c, host_ui);
1805 return 0;
1806
1807out_release:
1808 kfree(xent);
1809 release_head(c, BASEHD);
1810out_ro:
1811 ubifs_ro_mode(c, err);
1812 finish_reservation(c);
1813 return err;
1814}
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
1830 const struct inode *host)
1831{
1832 int err, len1, len2, aligned_len, aligned_len1, lnum, offs;
1833 struct ubifs_inode *host_ui = ubifs_inode(host);
1834 struct ubifs_ino_node *ino;
1835 union ubifs_key key;
1836 int sync = IS_DIRSYNC(host);
1837 u8 hash_host[UBIFS_HASH_ARR_SZ];
1838 u8 hash[UBIFS_HASH_ARR_SZ];
1839
1840 dbg_jnl("ino %lu, ino %lu", host->i_ino, inode->i_ino);
1841 ubifs_assert(c, inode->i_nlink > 0);
1842 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex));
1843
1844 len1 = UBIFS_INO_NODE_SZ + host_ui->data_len;
1845 len2 = UBIFS_INO_NODE_SZ + ubifs_inode(inode)->data_len;
1846 aligned_len1 = ALIGN(len1, 8);
1847 aligned_len = aligned_len1 + ALIGN(len2, 8);
1848
1849 aligned_len += ubifs_auth_node_sz(c);
1850
1851 ino = kzalloc(aligned_len, GFP_NOFS);
1852 if (!ino)
1853 return -ENOMEM;
1854
1855
1856 err = make_reservation(c, BASEHD, aligned_len);
1857 if (err)
1858 goto out_free;
1859
1860 pack_inode(c, ino, host, 0);
1861 err = ubifs_node_calc_hash(c, ino, hash_host);
1862 if (err)
1863 goto out_release;
1864 pack_inode(c, (void *)ino + aligned_len1, inode, 1);
1865 err = ubifs_node_calc_hash(c, (void *)ino + aligned_len1, hash);
1866 if (err)
1867 goto out_release;
1868
1869 err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0);
1870 if (!sync && !err) {
1871 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1872
1873 ubifs_wbuf_add_ino_nolock(wbuf, host->i_ino);
1874 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino);
1875 }
1876 release_head(c, BASEHD);
1877 if (err)
1878 goto out_ro;
1879
1880 ubifs_add_auth_dirt(c, lnum);
1881
1882 ino_key_init(c, &key, host->i_ino);
1883 err = ubifs_tnc_add(c, &key, lnum, offs, len1, hash_host);
1884 if (err)
1885 goto out_ro;
1886
1887 ino_key_init(c, &key, inode->i_ino);
1888 err = ubifs_tnc_add(c, &key, lnum, offs + aligned_len1, len2, hash);
1889 if (err)
1890 goto out_ro;
1891
1892 finish_reservation(c);
1893 spin_lock(&host_ui->ui_lock);
1894 host_ui->synced_i_size = host_ui->ui_size;
1895 spin_unlock(&host_ui->ui_lock);
1896 mark_inode_clean(c, host_ui);
1897 kfree(ino);
1898 return 0;
1899
1900out_release:
1901 release_head(c, BASEHD);
1902out_ro:
1903 ubifs_ro_mode(c, err);
1904 finish_reservation(c);
1905out_free:
1906 kfree(ino);
1907 return err;
1908}
1909
1910