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