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;
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 }
634
635 err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync);
636 if (err)
637 goto out_release;
638 if (!sync) {
639 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
640
641 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino);
642 ubifs_wbuf_add_ino_nolock(wbuf, dir->i_ino);
643 }
644 release_head(c, BASEHD);
645 kfree(dent);
646 ubifs_add_auth_dirt(c, lnum);
647
648 if (deletion) {
649 if (fname_name(nm) == NULL)
650 err = ubifs_tnc_remove_dh(c, &dent_key, nm->minor_hash);
651 else
652 err = ubifs_tnc_remove_nm(c, &dent_key, nm);
653 if (err)
654 goto out_ro;
655 err = ubifs_add_dirt(c, lnum, dlen);
656 } else
657 err = ubifs_tnc_add_nm(c, &dent_key, lnum, dent_offs, dlen,
658 hash_dent, nm);
659 if (err)
660 goto out_ro;
661
662
663
664
665
666
667
668 ino_key_init(c, &ino_key, inode->i_ino);
669 ino_offs = dent_offs + aligned_dlen;
670 err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, ilen, hash_ino);
671 if (err)
672 goto out_ro;
673
674 ino_key_init(c, &ino_key, dir->i_ino);
675 ino_offs += aligned_ilen;
676 err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs,
677 UBIFS_INO_NODE_SZ + host_ui->data_len, hash_ino_host);
678 if (err)
679 goto out_ro;
680
681 finish_reservation(c);
682 spin_lock(&ui->ui_lock);
683 ui->synced_i_size = ui->ui_size;
684 spin_unlock(&ui->ui_lock);
685 if (xent) {
686 spin_lock(&host_ui->ui_lock);
687 host_ui->synced_i_size = host_ui->ui_size;
688 spin_unlock(&host_ui->ui_lock);
689 }
690 mark_inode_clean(c, ui);
691 mark_inode_clean(c, host_ui);
692 return 0;
693
694out_finish:
695 finish_reservation(c);
696out_free:
697 kfree(dent);
698 return err;
699
700out_release:
701 release_head(c, BASEHD);
702 kfree(dent);
703out_ro:
704 ubifs_ro_mode(c, err);
705 if (last_reference)
706 ubifs_delete_orphan(c, inode->i_ino);
707 finish_reservation(c);
708 return err;
709}
710
711
712
713
714
715
716
717
718
719
720
721
722int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
723 const union ubifs_key *key, const void *buf, int len)
724{
725 struct ubifs_data_node *data;
726 int err, lnum, offs, compr_type, out_len, compr_len, auth_len;
727 int dlen = COMPRESSED_DATA_NODE_BUF_SZ, allocated = 1;
728 int write_len;
729 struct ubifs_inode *ui = ubifs_inode(inode);
730 bool encrypted = IS_ENCRYPTED(inode);
731 u8 hash[UBIFS_HASH_ARR_SZ];
732
733 dbg_jnlk(key, "ino %lu, blk %u, len %d, key ",
734 (unsigned long)key_inum(c, key), key_block(c, key), len);
735 ubifs_assert(c, len <= UBIFS_BLOCK_SIZE);
736
737 if (encrypted)
738 dlen += UBIFS_CIPHER_BLOCK_SIZE;
739
740 auth_len = ubifs_auth_node_sz(c);
741
742 data = kmalloc(dlen + auth_len, GFP_NOFS | __GFP_NOWARN);
743 if (!data) {
744
745
746
747
748
749
750
751 allocated = 0;
752 mutex_lock(&c->write_reserve_mutex);
753 data = c->write_reserve_buf;
754 }
755
756 data->ch.node_type = UBIFS_DATA_NODE;
757 key_write(c, key, &data->key);
758 data->size = cpu_to_le32(len);
759
760 if (!(ui->flags & UBIFS_COMPR_FL))
761
762 compr_type = UBIFS_COMPR_NONE;
763 else
764 compr_type = ui->compr_type;
765
766 out_len = compr_len = dlen - UBIFS_DATA_NODE_SZ;
767 ubifs_compress(c, buf, len, &data->data, &compr_len, &compr_type);
768 ubifs_assert(c, compr_len <= UBIFS_BLOCK_SIZE);
769
770 if (encrypted) {
771 err = ubifs_encrypt(inode, data, compr_len, &out_len, key_block(c, key));
772 if (err)
773 goto out_free;
774
775 } else {
776 data->compr_size = 0;
777 out_len = compr_len;
778 }
779
780 dlen = UBIFS_DATA_NODE_SZ + out_len;
781 if (ubifs_authenticated(c))
782 write_len = ALIGN(dlen, 8) + auth_len;
783 else
784 write_len = dlen;
785
786 data->compr_type = cpu_to_le16(compr_type);
787
788
789 err = make_reservation(c, DATAHD, write_len);
790 if (err)
791 goto out_free;
792
793 ubifs_prepare_node(c, data, dlen, 0);
794 err = write_head(c, DATAHD, data, write_len, &lnum, &offs, 0);
795 if (err)
796 goto out_release;
797
798 err = ubifs_node_calc_hash(c, data, hash);
799 if (err)
800 goto out_release;
801
802 ubifs_wbuf_add_ino_nolock(&c->jheads[DATAHD].wbuf, key_inum(c, key));
803 release_head(c, DATAHD);
804
805 ubifs_add_auth_dirt(c, lnum);
806
807 err = ubifs_tnc_add(c, key, lnum, offs, dlen, hash);
808 if (err)
809 goto out_ro;
810
811 finish_reservation(c);
812 if (!allocated)
813 mutex_unlock(&c->write_reserve_mutex);
814 else
815 kfree(data);
816 return 0;
817
818out_release:
819 release_head(c, DATAHD);
820out_ro:
821 ubifs_ro_mode(c, err);
822 finish_reservation(c);
823out_free:
824 if (!allocated)
825 mutex_unlock(&c->write_reserve_mutex);
826 else
827 kfree(data);
828 return err;
829}
830
831
832
833
834
835
836
837
838
839
840int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
841{
842 int err, lnum, offs;
843 struct ubifs_ino_node *ino, *ino_start;
844 struct ubifs_inode *ui = ubifs_inode(inode);
845 int sync = 0, write_len = 0, ilen = UBIFS_INO_NODE_SZ;
846 int last_reference = !inode->i_nlink;
847 int kill_xattrs = ui->xattr_cnt && last_reference;
848 u8 hash[UBIFS_HASH_ARR_SZ];
849
850 dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink);
851
852
853
854
855
856 if (!last_reference) {
857 ilen += ui->data_len;
858 sync = IS_SYNC(inode);
859 } else if (kill_xattrs) {
860 write_len += UBIFS_INO_NODE_SZ * ui->xattr_cnt;
861 }
862
863 if (ubifs_authenticated(c))
864 write_len += ALIGN(ilen, 8) + ubifs_auth_node_sz(c);
865 else
866 write_len += ilen;
867
868 ino_start = ino = kmalloc(write_len, GFP_NOFS);
869 if (!ino)
870 return -ENOMEM;
871
872
873 err = make_reservation(c, BASEHD, write_len);
874 if (err)
875 goto out_free;
876
877 if (kill_xattrs) {
878 union ubifs_key key;
879 struct fscrypt_name nm = {0};
880 struct inode *xino;
881 struct ubifs_dent_node *xent, *pxent = NULL;
882
883 if (ui->xattr_cnt >= ubifs_xattr_max_cnt(c)) {
884 ubifs_err(c, "Cannot delete inode, it has too much xattrs!");
885 goto out_release;
886 }
887
888 lowest_xent_key(c, &key, inode->i_ino);
889 while (1) {
890 xent = ubifs_tnc_next_ent(c, &key, &nm);
891 if (IS_ERR(xent)) {
892 err = PTR_ERR(xent);
893 if (err == -ENOENT)
894 break;
895
896 goto out_release;
897 }
898
899 fname_name(&nm) = xent->name;
900 fname_len(&nm) = le16_to_cpu(xent->nlen);
901
902 xino = ubifs_iget(c->vfs_sb, le64_to_cpu(xent->inum));
903 if (IS_ERR(xino)) {
904 err = PTR_ERR(xino);
905 ubifs_err(c, "dead directory entry '%s', error %d",
906 xent->name, err);
907 ubifs_ro_mode(c, err);
908 kfree(xent);
909 goto out_release;
910 }
911 ubifs_assert(c, ubifs_inode(xino)->xattr);
912
913 clear_nlink(xino);
914 pack_inode(c, ino, xino, 0);
915 ino = (void *)ino + UBIFS_INO_NODE_SZ;
916 iput(xino);
917
918 kfree(pxent);
919 pxent = xent;
920 key_read(c, &xent->key, &key);
921 }
922 kfree(pxent);
923 }
924
925 pack_inode(c, ino, inode, 1);
926 err = ubifs_node_calc_hash(c, ino, hash);
927 if (err)
928 goto out_release;
929
930 err = write_head(c, BASEHD, ino_start, write_len, &lnum, &offs, sync);
931 if (err)
932 goto out_release;
933 if (!sync)
934 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
935 inode->i_ino);
936 release_head(c, BASEHD);
937
938 ubifs_add_auth_dirt(c, lnum);
939
940 if (last_reference) {
941 err = ubifs_tnc_remove_ino(c, inode->i_ino);
942 if (err)
943 goto out_ro;
944 ubifs_delete_orphan(c, inode->i_ino);
945 err = ubifs_add_dirt(c, lnum, write_len);
946 } else {
947 union ubifs_key key;
948
949 ino_key_init(c, &key, inode->i_ino);
950 err = ubifs_tnc_add(c, &key, lnum, offs, ilen, hash);
951 }
952 if (err)
953 goto out_ro;
954
955 finish_reservation(c);
956 spin_lock(&ui->ui_lock);
957 ui->synced_i_size = ui->ui_size;
958 spin_unlock(&ui->ui_lock);
959 kfree(ino_start);
960 return 0;
961
962out_release:
963 release_head(c, BASEHD);
964out_ro:
965 ubifs_ro_mode(c, err);
966 finish_reservation(c);
967out_free:
968 kfree(ino_start);
969 return err;
970}
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode)
1002{
1003 int err;
1004 struct ubifs_inode *ui = ubifs_inode(inode);
1005
1006 ubifs_assert(c, inode->i_nlink == 0);
1007
1008 if (ui->xattr_cnt || ui->del_cmtno != c->cmt_no)
1009
1010 return ubifs_jnl_write_inode(c, inode);
1011
1012 down_read(&c->commit_sem);
1013
1014
1015
1016
1017 if (ui->del_cmtno != c->cmt_no) {
1018 up_read(&c->commit_sem);
1019 return ubifs_jnl_write_inode(c, inode);
1020 }
1021
1022 err = ubifs_tnc_remove_ino(c, inode->i_ino);
1023 if (err)
1024 ubifs_ro_mode(c, err);
1025 else
1026 ubifs_delete_orphan(c, inode->i_ino);
1027 up_read(&c->commit_sem);
1028 return err;
1029}
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
1048 const struct inode *fst_inode,
1049 const struct fscrypt_name *fst_nm,
1050 const struct inode *snd_dir,
1051 const struct inode *snd_inode,
1052 const struct fscrypt_name *snd_nm, int sync)
1053{
1054 union ubifs_key key;
1055 struct ubifs_dent_node *dent1, *dent2;
1056 int err, dlen1, dlen2, lnum, offs, len, plen = UBIFS_INO_NODE_SZ;
1057 int aligned_dlen1, aligned_dlen2;
1058 int twoparents = (fst_dir != snd_dir);
1059 void *p;
1060 u8 hash_dent1[UBIFS_HASH_ARR_SZ];
1061 u8 hash_dent2[UBIFS_HASH_ARR_SZ];
1062 u8 hash_p1[UBIFS_HASH_ARR_SZ];
1063 u8 hash_p2[UBIFS_HASH_ARR_SZ];
1064
1065 ubifs_assert(c, ubifs_inode(fst_dir)->data_len == 0);
1066 ubifs_assert(c, ubifs_inode(snd_dir)->data_len == 0);
1067 ubifs_assert(c, mutex_is_locked(&ubifs_inode(fst_dir)->ui_mutex));
1068 ubifs_assert(c, mutex_is_locked(&ubifs_inode(snd_dir)->ui_mutex));
1069
1070 dlen1 = UBIFS_DENT_NODE_SZ + fname_len(snd_nm) + 1;
1071 dlen2 = UBIFS_DENT_NODE_SZ + fname_len(fst_nm) + 1;
1072 aligned_dlen1 = ALIGN(dlen1, 8);
1073 aligned_dlen2 = ALIGN(dlen2, 8);
1074
1075 len = aligned_dlen1 + aligned_dlen2 + ALIGN(plen, 8);
1076 if (twoparents)
1077 len += plen;
1078
1079 len += ubifs_auth_node_sz(c);
1080
1081 dent1 = kzalloc(len, GFP_NOFS);
1082 if (!dent1)
1083 return -ENOMEM;
1084
1085
1086 err = make_reservation(c, BASEHD, len);
1087 if (err)
1088 goto out_free;
1089
1090
1091 dent1->ch.node_type = UBIFS_DENT_NODE;
1092 dent_key_init_flash(c, &dent1->key, snd_dir->i_ino, snd_nm);
1093 dent1->inum = cpu_to_le64(fst_inode->i_ino);
1094 dent1->type = get_dent_type(fst_inode->i_mode);
1095 dent1->nlen = cpu_to_le16(fname_len(snd_nm));
1096 memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm));
1097 dent1->name[fname_len(snd_nm)] = '\0';
1098 set_dent_cookie(c, dent1);
1099 zero_dent_node_unused(dent1);
1100 ubifs_prep_grp_node(c, dent1, dlen1, 0);
1101 err = ubifs_node_calc_hash(c, dent1, hash_dent1);
1102 if (err)
1103 goto out_release;
1104
1105
1106 dent2 = (void *)dent1 + aligned_dlen1;
1107 dent2->ch.node_type = UBIFS_DENT_NODE;
1108 dent_key_init_flash(c, &dent2->key, fst_dir->i_ino, fst_nm);
1109 dent2->inum = cpu_to_le64(snd_inode->i_ino);
1110 dent2->type = get_dent_type(snd_inode->i_mode);
1111 dent2->nlen = cpu_to_le16(fname_len(fst_nm));
1112 memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm));
1113 dent2->name[fname_len(fst_nm)] = '\0';
1114 set_dent_cookie(c, dent2);
1115 zero_dent_node_unused(dent2);
1116 ubifs_prep_grp_node(c, dent2, dlen2, 0);
1117 err = ubifs_node_calc_hash(c, dent2, hash_dent2);
1118 if (err)
1119 goto out_release;
1120
1121 p = (void *)dent2 + aligned_dlen2;
1122 if (!twoparents) {
1123 pack_inode(c, p, fst_dir, 1);
1124 err = ubifs_node_calc_hash(c, p, hash_p1);
1125 if (err)
1126 goto out_release;
1127 } else {
1128 pack_inode(c, p, fst_dir, 0);
1129 err = ubifs_node_calc_hash(c, p, hash_p1);
1130 if (err)
1131 goto out_release;
1132 p += ALIGN(plen, 8);
1133 pack_inode(c, p, snd_dir, 1);
1134 err = ubifs_node_calc_hash(c, p, hash_p2);
1135 if (err)
1136 goto out_release;
1137 }
1138
1139 err = write_head(c, BASEHD, dent1, len, &lnum, &offs, sync);
1140 if (err)
1141 goto out_release;
1142 if (!sync) {
1143 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1144
1145 ubifs_wbuf_add_ino_nolock(wbuf, fst_dir->i_ino);
1146 ubifs_wbuf_add_ino_nolock(wbuf, snd_dir->i_ino);
1147 }
1148 release_head(c, BASEHD);
1149
1150 ubifs_add_auth_dirt(c, lnum);
1151
1152 dent_key_init(c, &key, snd_dir->i_ino, snd_nm);
1153 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, hash_dent1, snd_nm);
1154 if (err)
1155 goto out_ro;
1156
1157 offs += aligned_dlen1;
1158 dent_key_init(c, &key, fst_dir->i_ino, fst_nm);
1159 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, hash_dent2, fst_nm);
1160 if (err)
1161 goto out_ro;
1162
1163 offs += aligned_dlen2;
1164
1165 ino_key_init(c, &key, fst_dir->i_ino);
1166 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_p1);
1167 if (err)
1168 goto out_ro;
1169
1170 if (twoparents) {
1171 offs += ALIGN(plen, 8);
1172 ino_key_init(c, &key, snd_dir->i_ino);
1173 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_p2);
1174 if (err)
1175 goto out_ro;
1176 }
1177
1178 finish_reservation(c);
1179
1180 mark_inode_clean(c, ubifs_inode(fst_dir));
1181 if (twoparents)
1182 mark_inode_clean(c, ubifs_inode(snd_dir));
1183 kfree(dent1);
1184 return 0;
1185
1186out_release:
1187 release_head(c, BASEHD);
1188out_ro:
1189 ubifs_ro_mode(c, err);
1190 finish_reservation(c);
1191out_free:
1192 kfree(dent1);
1193 return err;
1194}
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
1211 const struct inode *old_inode,
1212 const struct fscrypt_name *old_nm,
1213 const struct inode *new_dir,
1214 const struct inode *new_inode,
1215 const struct fscrypt_name *new_nm,
1216 const struct inode *whiteout, int sync)
1217{
1218 void *p;
1219 union ubifs_key key;
1220 struct ubifs_dent_node *dent, *dent2;
1221 int err, dlen1, dlen2, ilen, lnum, offs, len;
1222 int aligned_dlen1, aligned_dlen2, plen = UBIFS_INO_NODE_SZ;
1223 int last_reference = !!(new_inode && new_inode->i_nlink == 0);
1224 int move = (old_dir != new_dir);
1225 struct ubifs_inode *uninitialized_var(new_ui);
1226 u8 hash_old_dir[UBIFS_HASH_ARR_SZ];
1227 u8 hash_new_dir[UBIFS_HASH_ARR_SZ];
1228 u8 hash_new_inode[UBIFS_HASH_ARR_SZ];
1229 u8 hash_dent1[UBIFS_HASH_ARR_SZ];
1230 u8 hash_dent2[UBIFS_HASH_ARR_SZ];
1231
1232 ubifs_assert(c, ubifs_inode(old_dir)->data_len == 0);
1233 ubifs_assert(c, ubifs_inode(new_dir)->data_len == 0);
1234 ubifs_assert(c, mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex));
1235 ubifs_assert(c, mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex));
1236
1237 dlen1 = UBIFS_DENT_NODE_SZ + fname_len(new_nm) + 1;
1238 dlen2 = UBIFS_DENT_NODE_SZ + fname_len(old_nm) + 1;
1239 if (new_inode) {
1240 new_ui = ubifs_inode(new_inode);
1241 ubifs_assert(c, mutex_is_locked(&new_ui->ui_mutex));
1242 ilen = UBIFS_INO_NODE_SZ;
1243 if (!last_reference)
1244 ilen += new_ui->data_len;
1245 } else
1246 ilen = 0;
1247
1248 aligned_dlen1 = ALIGN(dlen1, 8);
1249 aligned_dlen2 = ALIGN(dlen2, 8);
1250 len = aligned_dlen1 + aligned_dlen2 + ALIGN(ilen, 8) + ALIGN(plen, 8);
1251 if (move)
1252 len += plen;
1253
1254 len += ubifs_auth_node_sz(c);
1255
1256 dent = kzalloc(len, GFP_NOFS);
1257 if (!dent)
1258 return -ENOMEM;
1259
1260
1261 err = make_reservation(c, BASEHD, len);
1262 if (err)
1263 goto out_free;
1264
1265
1266 dent->ch.node_type = UBIFS_DENT_NODE;
1267 dent_key_init_flash(c, &dent->key, new_dir->i_ino, new_nm);
1268 dent->inum = cpu_to_le64(old_inode->i_ino);
1269 dent->type = get_dent_type(old_inode->i_mode);
1270 dent->nlen = cpu_to_le16(fname_len(new_nm));
1271 memcpy(dent->name, fname_name(new_nm), fname_len(new_nm));
1272 dent->name[fname_len(new_nm)] = '\0';
1273 set_dent_cookie(c, dent);
1274 zero_dent_node_unused(dent);
1275 ubifs_prep_grp_node(c, dent, dlen1, 0);
1276 err = ubifs_node_calc_hash(c, dent, hash_dent1);
1277 if (err)
1278 goto out_release;
1279
1280 dent2 = (void *)dent + aligned_dlen1;
1281 dent2->ch.node_type = UBIFS_DENT_NODE;
1282 dent_key_init_flash(c, &dent2->key, old_dir->i_ino, old_nm);
1283
1284 if (whiteout) {
1285 dent2->inum = cpu_to_le64(whiteout->i_ino);
1286 dent2->type = get_dent_type(whiteout->i_mode);
1287 } else {
1288
1289 dent2->inum = 0;
1290 dent2->type = DT_UNKNOWN;
1291 }
1292 dent2->nlen = cpu_to_le16(fname_len(old_nm));
1293 memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm));
1294 dent2->name[fname_len(old_nm)] = '\0';
1295 set_dent_cookie(c, dent2);
1296 zero_dent_node_unused(dent2);
1297 ubifs_prep_grp_node(c, dent2, dlen2, 0);
1298 err = ubifs_node_calc_hash(c, dent2, hash_dent2);
1299 if (err)
1300 goto out_release;
1301
1302 p = (void *)dent2 + aligned_dlen2;
1303 if (new_inode) {
1304 pack_inode(c, p, new_inode, 0);
1305 err = ubifs_node_calc_hash(c, p, hash_new_inode);
1306 if (err)
1307 goto out_release;
1308
1309 p += ALIGN(ilen, 8);
1310 }
1311
1312 if (!move) {
1313 pack_inode(c, p, old_dir, 1);
1314 err = ubifs_node_calc_hash(c, p, hash_old_dir);
1315 if (err)
1316 goto out_release;
1317 } else {
1318 pack_inode(c, p, old_dir, 0);
1319 err = ubifs_node_calc_hash(c, p, hash_old_dir);
1320 if (err)
1321 goto out_release;
1322
1323 p += ALIGN(plen, 8);
1324 pack_inode(c, p, new_dir, 1);
1325 err = ubifs_node_calc_hash(c, p, hash_new_dir);
1326 if (err)
1327 goto out_release;
1328 }
1329
1330 if (last_reference) {
1331 err = ubifs_add_orphan(c, new_inode->i_ino);
1332 if (err) {
1333 release_head(c, BASEHD);
1334 goto out_finish;
1335 }
1336 new_ui->del_cmtno = c->cmt_no;
1337 }
1338
1339 err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync);
1340 if (err)
1341 goto out_release;
1342 if (!sync) {
1343 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1344
1345 ubifs_wbuf_add_ino_nolock(wbuf, new_dir->i_ino);
1346 ubifs_wbuf_add_ino_nolock(wbuf, old_dir->i_ino);
1347 if (new_inode)
1348 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf,
1349 new_inode->i_ino);
1350 }
1351 release_head(c, BASEHD);
1352
1353 ubifs_add_auth_dirt(c, lnum);
1354
1355 dent_key_init(c, &key, new_dir->i_ino, new_nm);
1356 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, hash_dent1, new_nm);
1357 if (err)
1358 goto out_ro;
1359
1360 offs += aligned_dlen1;
1361 if (whiteout) {
1362 dent_key_init(c, &key, old_dir->i_ino, old_nm);
1363 err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, hash_dent2, old_nm);
1364 if (err)
1365 goto out_ro;
1366
1367 ubifs_delete_orphan(c, whiteout->i_ino);
1368 } else {
1369 err = ubifs_add_dirt(c, lnum, dlen2);
1370 if (err)
1371 goto out_ro;
1372
1373 dent_key_init(c, &key, old_dir->i_ino, old_nm);
1374 err = ubifs_tnc_remove_nm(c, &key, old_nm);
1375 if (err)
1376 goto out_ro;
1377 }
1378
1379 offs += aligned_dlen2;
1380 if (new_inode) {
1381 ino_key_init(c, &key, new_inode->i_ino);
1382 err = ubifs_tnc_add(c, &key, lnum, offs, ilen, hash_new_inode);
1383 if (err)
1384 goto out_ro;
1385 offs += ALIGN(ilen, 8);
1386 }
1387
1388 ino_key_init(c, &key, old_dir->i_ino);
1389 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_old_dir);
1390 if (err)
1391 goto out_ro;
1392
1393 if (move) {
1394 offs += ALIGN(plen, 8);
1395 ino_key_init(c, &key, new_dir->i_ino);
1396 err = ubifs_tnc_add(c, &key, lnum, offs, plen, hash_new_dir);
1397 if (err)
1398 goto out_ro;
1399 }
1400
1401 finish_reservation(c);
1402 if (new_inode) {
1403 mark_inode_clean(c, new_ui);
1404 spin_lock(&new_ui->ui_lock);
1405 new_ui->synced_i_size = new_ui->ui_size;
1406 spin_unlock(&new_ui->ui_lock);
1407 }
1408 mark_inode_clean(c, ubifs_inode(old_dir));
1409 if (move)
1410 mark_inode_clean(c, ubifs_inode(new_dir));
1411 kfree(dent);
1412 return 0;
1413
1414out_release:
1415 release_head(c, BASEHD);
1416out_ro:
1417 ubifs_ro_mode(c, err);
1418 if (last_reference)
1419 ubifs_delete_orphan(c, new_inode->i_ino);
1420out_finish:
1421 finish_reservation(c);
1422out_free:
1423 kfree(dent);
1424 return err;
1425}
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438static int truncate_data_node(const struct ubifs_info *c, const struct inode *inode,
1439 unsigned int block, struct ubifs_data_node *dn,
1440 int *new_len)
1441{
1442 void *buf;
1443 int err, dlen, compr_type, out_len, old_dlen;
1444
1445 out_len = le32_to_cpu(dn->size);
1446 buf = kmalloc_array(out_len, WORST_COMPR_FACTOR, GFP_NOFS);
1447 if (!buf)
1448 return -ENOMEM;
1449
1450 dlen = old_dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
1451 compr_type = le16_to_cpu(dn->compr_type);
1452
1453 if (IS_ENCRYPTED(inode)) {
1454 err = ubifs_decrypt(inode, dn, &dlen, block);
1455 if (err)
1456 goto out;
1457 }
1458
1459 if (compr_type == UBIFS_COMPR_NONE) {
1460 out_len = *new_len;
1461 } else {
1462 err = ubifs_decompress(c, &dn->data, dlen, buf, &out_len, compr_type);
1463 if (err)
1464 goto out;
1465
1466 ubifs_compress(c, buf, *new_len, &dn->data, &out_len, &compr_type);
1467 }
1468
1469 if (IS_ENCRYPTED(inode)) {
1470 err = ubifs_encrypt(inode, dn, out_len, &old_dlen, block);
1471 if (err)
1472 goto out;
1473
1474 out_len = old_dlen;
1475 } else {
1476 dn->compr_size = 0;
1477 }
1478
1479 ubifs_assert(c, out_len <= UBIFS_BLOCK_SIZE);
1480 dn->compr_type = cpu_to_le16(compr_type);
1481 dn->size = cpu_to_le32(*new_len);
1482 *new_len = UBIFS_DATA_NODE_SZ + out_len;
1483 err = 0;
1484out:
1485 kfree(buf);
1486 return err;
1487}
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
1505 loff_t old_size, loff_t new_size)
1506{
1507 union ubifs_key key, to_key;
1508 struct ubifs_ino_node *ino;
1509 struct ubifs_trun_node *trun;
1510 struct ubifs_data_node *uninitialized_var(dn);
1511 int err, dlen, len, lnum, offs, bit, sz, sync = IS_SYNC(inode);
1512 struct ubifs_inode *ui = ubifs_inode(inode);
1513 ino_t inum = inode->i_ino;
1514 unsigned int blk;
1515 u8 hash_ino[UBIFS_HASH_ARR_SZ];
1516 u8 hash_dn[UBIFS_HASH_ARR_SZ];
1517
1518 dbg_jnl("ino %lu, size %lld -> %lld",
1519 (unsigned long)inum, old_size, new_size);
1520 ubifs_assert(c, !ui->data_len);
1521 ubifs_assert(c, S_ISREG(inode->i_mode));
1522 ubifs_assert(c, mutex_is_locked(&ui->ui_mutex));
1523
1524 sz = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ +
1525 UBIFS_MAX_DATA_NODE_SZ * WORST_COMPR_FACTOR;
1526
1527 sz += ubifs_auth_node_sz(c);
1528
1529 ino = kmalloc(sz, GFP_NOFS);
1530 if (!ino)
1531 return -ENOMEM;
1532
1533 trun = (void *)ino + UBIFS_INO_NODE_SZ;
1534 trun->ch.node_type = UBIFS_TRUN_NODE;
1535 trun->inum = cpu_to_le32(inum);
1536 trun->old_size = cpu_to_le64(old_size);
1537 trun->new_size = cpu_to_le64(new_size);
1538 zero_trun_node_unused(trun);
1539
1540 dlen = new_size & (UBIFS_BLOCK_SIZE - 1);
1541 if (dlen) {
1542
1543 dn = (void *)trun + UBIFS_TRUN_NODE_SZ;
1544 blk = new_size >> UBIFS_BLOCK_SHIFT;
1545 data_key_init(c, &key, inum, blk);
1546 dbg_jnlk(&key, "last block key ");
1547 err = ubifs_tnc_lookup(c, &key, dn);
1548 if (err == -ENOENT)
1549 dlen = 0;
1550 else if (err)
1551 goto out_free;
1552 else {
1553 int dn_len = le32_to_cpu(dn->size);
1554
1555 if (dn_len <= 0 || dn_len > UBIFS_BLOCK_SIZE) {
1556 ubifs_err(c, "bad data node (block %u, inode %lu)",
1557 blk, inode->i_ino);
1558 ubifs_dump_node(c, dn);
1559 goto out_free;
1560 }
1561
1562 if (dn_len <= dlen)
1563 dlen = 0;
1564 else {
1565 err = truncate_data_node(c, inode, blk, dn, &dlen);
1566 if (err)
1567 goto out_free;
1568 }
1569 }
1570 }
1571
1572
1573 len = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ;
1574
1575 if (ubifs_authenticated(c))
1576 len += ALIGN(dlen, 8) + ubifs_auth_node_sz(c);
1577 else
1578 len += dlen;
1579
1580 err = make_reservation(c, BASEHD, len);
1581 if (err)
1582 goto out_free;
1583
1584 pack_inode(c, ino, inode, 0);
1585 err = ubifs_node_calc_hash(c, ino, hash_ino);
1586 if (err)
1587 goto out_release;
1588
1589 ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1);
1590 if (dlen) {
1591 ubifs_prep_grp_node(c, dn, dlen, 1);
1592 err = ubifs_node_calc_hash(c, dn, hash_dn);
1593 if (err)
1594 goto out_release;
1595 }
1596
1597 err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync);
1598 if (err)
1599 goto out_release;
1600 if (!sync)
1601 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, inum);
1602 release_head(c, BASEHD);
1603
1604 ubifs_add_auth_dirt(c, lnum);
1605
1606 if (dlen) {
1607 sz = offs + UBIFS_INO_NODE_SZ + UBIFS_TRUN_NODE_SZ;
1608 err = ubifs_tnc_add(c, &key, lnum, sz, dlen, hash_dn);
1609 if (err)
1610 goto out_ro;
1611 }
1612
1613 ino_key_init(c, &key, inum);
1614 err = ubifs_tnc_add(c, &key, lnum, offs, UBIFS_INO_NODE_SZ, hash_ino);
1615 if (err)
1616 goto out_ro;
1617
1618 err = ubifs_add_dirt(c, lnum, UBIFS_TRUN_NODE_SZ);
1619 if (err)
1620 goto out_ro;
1621
1622 bit = new_size & (UBIFS_BLOCK_SIZE - 1);
1623 blk = (new_size >> UBIFS_BLOCK_SHIFT) + (bit ? 1 : 0);
1624 data_key_init(c, &key, inum, blk);
1625
1626 bit = old_size & (UBIFS_BLOCK_SIZE - 1);
1627 blk = (old_size >> UBIFS_BLOCK_SHIFT) - (bit ? 0 : 1);
1628 data_key_init(c, &to_key, inum, blk);
1629
1630 err = ubifs_tnc_remove_range(c, &key, &to_key);
1631 if (err)
1632 goto out_ro;
1633
1634 finish_reservation(c);
1635 spin_lock(&ui->ui_lock);
1636 ui->synced_i_size = ui->ui_size;
1637 spin_unlock(&ui->ui_lock);
1638 mark_inode_clean(c, ui);
1639 kfree(ino);
1640 return 0;
1641
1642out_release:
1643 release_head(c, BASEHD);
1644out_ro:
1645 ubifs_ro_mode(c, err);
1646 finish_reservation(c);
1647out_free:
1648 kfree(ino);
1649 return err;
1650}
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
1666 const struct inode *inode,
1667 const struct fscrypt_name *nm)
1668{
1669 int err, xlen, hlen, len, lnum, xent_offs, aligned_xlen, write_len;
1670 struct ubifs_dent_node *xent;
1671 struct ubifs_ino_node *ino;
1672 union ubifs_key xent_key, key1, key2;
1673 int sync = IS_DIRSYNC(host);
1674 struct ubifs_inode *host_ui = ubifs_inode(host);
1675 u8 hash[UBIFS_HASH_ARR_SZ];
1676
1677 ubifs_assert(c, inode->i_nlink == 0);
1678 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex));
1679
1680
1681
1682
1683
1684 xlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
1685 aligned_xlen = ALIGN(xlen, 8);
1686 hlen = host_ui->data_len + UBIFS_INO_NODE_SZ;
1687 len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
1688
1689 write_len = len + ubifs_auth_node_sz(c);
1690
1691 xent = kzalloc(write_len, GFP_NOFS);
1692 if (!xent)
1693 return -ENOMEM;
1694
1695
1696 err = make_reservation(c, BASEHD, write_len);
1697 if (err) {
1698 kfree(xent);
1699 return err;
1700 }
1701
1702 xent->ch.node_type = UBIFS_XENT_NODE;
1703 xent_key_init(c, &xent_key, host->i_ino, nm);
1704 key_write(c, &xent_key, xent->key);
1705 xent->inum = 0;
1706 xent->type = get_dent_type(inode->i_mode);
1707 xent->nlen = cpu_to_le16(fname_len(nm));
1708 memcpy(xent->name, fname_name(nm), fname_len(nm));
1709 xent->name[fname_len(nm)] = '\0';
1710 zero_dent_node_unused(xent);
1711 ubifs_prep_grp_node(c, xent, xlen, 0);
1712
1713 ino = (void *)xent + aligned_xlen;
1714 pack_inode(c, ino, inode, 0);
1715 ino = (void *)ino + UBIFS_INO_NODE_SZ;
1716 pack_inode(c, ino, host, 1);
1717 err = ubifs_node_calc_hash(c, ino, hash);
1718 if (err)
1719 goto out_release;
1720
1721 err = write_head(c, BASEHD, xent, write_len, &lnum, &xent_offs, sync);
1722 if (!sync && !err)
1723 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, host->i_ino);
1724 release_head(c, BASEHD);
1725
1726 ubifs_add_auth_dirt(c, lnum);
1727 kfree(xent);
1728 if (err)
1729 goto out_ro;
1730
1731
1732 err = ubifs_tnc_remove_nm(c, &xent_key, nm);
1733 if (err)
1734 goto out_ro;
1735 err = ubifs_add_dirt(c, lnum, xlen);
1736 if (err)
1737 goto out_ro;
1738
1739
1740
1741
1742
1743 lowest_ino_key(c, &key1, inode->i_ino);
1744 highest_ino_key(c, &key2, inode->i_ino);
1745 err = ubifs_tnc_remove_range(c, &key1, &key2);
1746 if (err)
1747 goto out_ro;
1748 err = ubifs_add_dirt(c, lnum, UBIFS_INO_NODE_SZ);
1749 if (err)
1750 goto out_ro;
1751
1752
1753 ino_key_init(c, &key1, host->i_ino);
1754 err = ubifs_tnc_add(c, &key1, lnum, xent_offs + len - hlen, hlen, hash);
1755 if (err)
1756 goto out_ro;
1757
1758 finish_reservation(c);
1759 spin_lock(&host_ui->ui_lock);
1760 host_ui->synced_i_size = host_ui->ui_size;
1761 spin_unlock(&host_ui->ui_lock);
1762 mark_inode_clean(c, host_ui);
1763 return 0;
1764
1765out_release:
1766 kfree(xent);
1767 release_head(c, BASEHD);
1768out_ro:
1769 ubifs_ro_mode(c, err);
1770 finish_reservation(c);
1771 return err;
1772}
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
1788 const struct inode *host)
1789{
1790 int err, len1, len2, aligned_len, aligned_len1, lnum, offs;
1791 struct ubifs_inode *host_ui = ubifs_inode(host);
1792 struct ubifs_ino_node *ino;
1793 union ubifs_key key;
1794 int sync = IS_DIRSYNC(host);
1795 u8 hash_host[UBIFS_HASH_ARR_SZ];
1796 u8 hash[UBIFS_HASH_ARR_SZ];
1797
1798 dbg_jnl("ino %lu, ino %lu", host->i_ino, inode->i_ino);
1799 ubifs_assert(c, host->i_nlink > 0);
1800 ubifs_assert(c, inode->i_nlink > 0);
1801 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex));
1802
1803 len1 = UBIFS_INO_NODE_SZ + host_ui->data_len;
1804 len2 = UBIFS_INO_NODE_SZ + ubifs_inode(inode)->data_len;
1805 aligned_len1 = ALIGN(len1, 8);
1806 aligned_len = aligned_len1 + ALIGN(len2, 8);
1807
1808 aligned_len += ubifs_auth_node_sz(c);
1809
1810 ino = kzalloc(aligned_len, GFP_NOFS);
1811 if (!ino)
1812 return -ENOMEM;
1813
1814
1815 err = make_reservation(c, BASEHD, aligned_len);
1816 if (err)
1817 goto out_free;
1818
1819 pack_inode(c, ino, host, 0);
1820 err = ubifs_node_calc_hash(c, ino, hash_host);
1821 if (err)
1822 goto out_release;
1823 pack_inode(c, (void *)ino + aligned_len1, inode, 1);
1824 err = ubifs_node_calc_hash(c, (void *)ino + aligned_len1, hash);
1825 if (err)
1826 goto out_release;
1827
1828 err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0);
1829 if (!sync && !err) {
1830 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf;
1831
1832 ubifs_wbuf_add_ino_nolock(wbuf, host->i_ino);
1833 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino);
1834 }
1835 release_head(c, BASEHD);
1836 if (err)
1837 goto out_ro;
1838
1839 ubifs_add_auth_dirt(c, lnum);
1840
1841 ino_key_init(c, &key, host->i_ino);
1842 err = ubifs_tnc_add(c, &key, lnum, offs, len1, hash_host);
1843 if (err)
1844 goto out_ro;
1845
1846 ino_key_init(c, &key, inode->i_ino);
1847 err = ubifs_tnc_add(c, &key, lnum, offs + aligned_len1, len2, hash);
1848 if (err)
1849 goto out_ro;
1850
1851 finish_reservation(c);
1852 spin_lock(&host_ui->ui_lock);
1853 host_ui->synced_i_size = host_ui->ui_size;
1854 spin_unlock(&host_ui->ui_lock);
1855 mark_inode_clean(c, host_ui);
1856 kfree(ino);
1857 return 0;
1858
1859out_release:
1860 release_head(c, BASEHD);
1861out_ro:
1862 ubifs_ro_mode(c, err);
1863 finish_reservation(c);
1864out_free:
1865 kfree(ino);
1866 return err;
1867}
1868
1869