Lines Matching +full:extended +full:- +full:wait

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2006-2008 Nokia Corporation.
14 * The journal consists of 2 parts - the log and bud LEBs. The log has fixed
16 * area. Buds contain file system data - data nodes, inode nodes, etc. The log
24 * The journal is multi-headed because we want to write data to the journal as
33 * Bud LEBs may be half-indexed. For example, if the bud was not full at the
52 * zero_ino_node_unused - zero out unused fields of an on-flash inode node.
57 memset(ino->padding1, 0, 4); in zero_ino_node_unused()
58 memset(ino->padding2, 0, 26); in zero_ino_node_unused()
62 * zero_dent_node_unused - zero out unused fields of an on-flash directory
68 dent->padding1 = 0; in zero_dent_node_unused()
72 * zero_trun_node_unused - zero out unused fields of an on-flash truncation
78 memset(trun->padding, 0, 12); in zero_trun_node_unused()
88 * reserve_space - reserve space in the journal.
89 * @c: UBIFS file-system description object
95 * 'release_head()'. Returns zero in case of success, %-EAGAIN if commit has to
101 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf; in reserve_space()
108 ubifs_assert(c, !c->ro_media && !c->ro_mount); in reserve_space()
111 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead); in reserve_space()
113 if (c->ro_error) { in reserve_space()
114 err = -EROFS; in reserve_space()
118 avail = c->leb_size - wbuf->offs - wbuf->used; in reserve_space()
119 if (wbuf->lnum != -1 && avail >= len) in reserve_space()
123 * Write buffer wasn't seek'ed or there is no enough space - look for an in reserve_space()
131 if (err != -ENOSPC) in reserve_space()
136 * some. But the write-buffer mutex has to be unlocked because in reserve_space()
140 mutex_unlock(&wbuf->io_mutex); in reserve_space()
145 if (err != -ENOSPC) in reserve_space()
151 * because we dropped @wbuf->io_mutex, so try once in reserve_space()
161 dbg_jnl("return -ENOSPC"); in reserve_space()
165 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead); in reserve_space()
167 avail = c->leb_size - wbuf->offs - wbuf->used; in reserve_space()
169 if (wbuf->lnum != -1 && avail >= len) { in reserve_space()
176 lnum, wbuf->lnum, wbuf->offs + wbuf->used); in reserve_space()
187 * Make sure we synchronize the write-buffer before we add the new bud in reserve_space()
190 * write-buffer data are written to the next-to-last bud in reserve_space()
191 * (@wbuf->lnum). And the effect would be that the recovery would see in reserve_space()
192 * that there is corruption in the next-to-last bud. in reserve_space()
207 mutex_unlock(&wbuf->io_mutex); in reserve_space()
214 if (err1 && err == -EAGAIN) in reserve_space()
216 * Return original error code only if it is not %-EAGAIN, in reserve_space()
221 mutex_unlock(&wbuf->io_mutex); in reserve_space()
233 int nodelen = le32_to_cpu(ch->len); in ubifs_hash_nodes()
241 ubifs_assert(c, ch->magic == cpu_to_le32(UBIFS_NODE_MAGIC)); in ubifs_hash_nodes()
248 len -= ALIGN(nodelen, 8); in ubifs_hash_nodes()
255 * write_head - write data to a journal head.
256 * @c: UBIFS file-system description object
262 * @sync: non-zero if the write-buffer has to by synchronized
272 struct ubifs_wbuf *wbuf = &c->jheads[jhead].wbuf; in write_head()
276 *lnum = c->jheads[jhead].wbuf.lnum; in write_head()
277 *offs = c->jheads[jhead].wbuf.offs + c->jheads[jhead].wbuf.used; in write_head()
282 err = ubifs_hash_nodes(c, buf, len, c->jheads[jhead].log_hash); in write_head()
296 * __queue_and_wait - queue a task and wait until the task is waked up.
297 * @c: UBIFS file-system description object
300 * up. This function should be called with @c->reserve_space_wq locked.
304 DEFINE_WAIT(wait); in __queue_and_wait()
306 __add_wait_queue_entry_tail_exclusive(&c->reserve_space_wq, &wait); in __queue_and_wait()
308 spin_unlock(&c->reserve_space_wq.lock); in __queue_and_wait()
311 finish_wait(&c->reserve_space_wq, &wait); in __queue_and_wait()
315 * wait_for_reservation - try queuing current task to wait until waked up.
316 * @c: UBIFS file-system description object
318 * This function queues current task to wait until waked up, if queuing is
319 * started(@c->need_wait_space is not %0). Returns %true if current task is
324 if (likely(atomic_read(&c->need_wait_space) == 0)) in wait_for_reservation()
328 spin_lock(&c->reserve_space_wq.lock); in wait_for_reservation()
329 if (atomic_read(&c->need_wait_space) == 0) { in wait_for_reservation()
331 spin_unlock(&c->reserve_space_wq.lock); in wait_for_reservation()
340 * wake_up_reservation - wake up first task in queue or stop queuing.
341 * @c: UBIFS file-system description object
348 spin_lock(&c->reserve_space_wq.lock); in wake_up_reservation()
349 if (waitqueue_active(&c->reserve_space_wq)) in wake_up_reservation()
350 wake_up_locked(&c->reserve_space_wq); in wake_up_reservation()
353 * Compared with wait_for_reservation(), set @c->need_wait_space in wake_up_reservation()
354 * under the protection of wait queue lock, which can avoid that in wake_up_reservation()
355 * @c->need_wait_space is set to 0 after new task queued. in wake_up_reservation()
357 atomic_set(&c->need_wait_space, 0); in wake_up_reservation()
358 spin_unlock(&c->reserve_space_wq.lock); in wake_up_reservation()
362 * add_or_start_queue - add current task in queue or start queuing.
363 * @c: UBIFS file-system description object
370 spin_lock(&c->reserve_space_wq.lock); in add_or_start_queue()
371 if (atomic_cmpxchg(&c->need_wait_space, 0, 1) == 0) { in add_or_start_queue()
373 spin_unlock(&c->reserve_space_wq.lock); in add_or_start_queue()
386 * make_reservation - reserve journal space.
387 * @c: UBIFS file-system description object
407 down_read(&c->commit_sem); in make_reservation()
410 /* c->commit_sem will get released via finish_reservation(). */ in make_reservation()
413 up_read(&c->commit_sem); in make_reservation()
415 if (err == -ENOSPC) { in make_reservation()
419 * progress, so make the error -EAGAIN so that the below in make_reservation()
420 * will commit and re-try. in make_reservation()
424 err = -EAGAIN; in make_reservation()
427 if (err != -EAGAIN) in make_reservation()
431 * -EAGAIN means that the journal is full or too large, or the above in make_reservation()
432 * code wants to do one commit. Do this and re-try. in make_reservation()
445 err = -ENOSPC; in make_reservation()
468 dbg_jnl("-EAGAIN, commit and retry (retried %d times)", in make_reservation()
480 if (err == -ENOSPC) { in make_reservation()
482 down_write(&c->commit_sem); in make_reservation()
484 ubifs_dump_budg(c, &c->bi); in make_reservation()
487 up_write(&c->commit_sem); in make_reservation()
514 * release_head - release a journal head.
515 * @c: UBIFS file-system description object
524 mutex_unlock(&c->jheads[jhead].wbuf.io_mutex); in release_head()
528 * finish_reservation - finish a reservation.
529 * @c: UBIFS file-system description object
536 up_read(&c->commit_sem); in finish_reservation()
540 * get_dent_type - translate VFS inode mode to UBIFS directory entry type.
567 * pack_inode - pack an inode node.
568 * @c: UBIFS file-system description object
576 int data_len = 0, last_reference = !inode->i_nlink; in pack_inode()
579 ino->ch.node_type = UBIFS_INO_NODE; in pack_inode()
580 ino_key_init_flash(c, &ino->key, inode->i_ino); in pack_inode()
581 ino->creat_sqnum = cpu_to_le64(ui->creat_sqnum); in pack_inode()
582 ino->atime_sec = cpu_to_le64(inode_get_atime_sec(inode)); in pack_inode()
583 ino->atime_nsec = cpu_to_le32(inode_get_atime_nsec(inode)); in pack_inode()
584 ino->ctime_sec = cpu_to_le64(inode_get_ctime_sec(inode)); in pack_inode()
585 ino->ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); in pack_inode()
586 ino->mtime_sec = cpu_to_le64(inode_get_mtime_sec(inode)); in pack_inode()
587 ino->mtime_nsec = cpu_to_le32(inode_get_mtime_nsec(inode)); in pack_inode()
588 ino->uid = cpu_to_le32(i_uid_read(inode)); in pack_inode()
589 ino->gid = cpu_to_le32(i_gid_read(inode)); in pack_inode()
590 ino->mode = cpu_to_le32(inode->i_mode); in pack_inode()
591 ino->flags = cpu_to_le32(ui->flags); in pack_inode()
592 ino->size = cpu_to_le64(ui->ui_size); in pack_inode()
593 ino->nlink = cpu_to_le32(inode->i_nlink); in pack_inode()
594 ino->compr_type = cpu_to_le16(ui->compr_type); in pack_inode()
595 ino->data_len = cpu_to_le32(ui->data_len); in pack_inode()
596 ino->xattr_cnt = cpu_to_le32(ui->xattr_cnt); in pack_inode()
597 ino->xattr_size = cpu_to_le32(ui->xattr_size); in pack_inode()
598 ino->xattr_names = cpu_to_le32(ui->xattr_names); in pack_inode()
606 memcpy(ino->data, ui->data, ui->data_len); in pack_inode()
607 data_len = ui->data_len; in pack_inode()
614 * mark_inode_clean - mark UBIFS inode as clean.
615 * @c: UBIFS file-system description object
619 * @ui->dirty flag and releasing its budget. Note, VFS may still treat the
625 if (ui->dirty) in mark_inode_clean()
627 ui->dirty = 0; in mark_inode_clean()
632 if (c->double_hash) in set_dent_cookie()
633 dent->cookie = (__force __le32) get_random_u32(); in set_dent_cookie()
635 dent->cookie = 0; in set_dent_cookie()
639 * ubifs_jnl_update - update inode.
640 * @c: UBIFS file-system description object
641 * @dir: parent inode or host inode in case of extended attributes
645 * @xent: non-zero if the directory entry is an extended attribute entry
648 * This function updates an inode by writing a directory entry (or extended
653 * extended attributes. Indeed, then we guarantee that if the host inode gets
654 * synchronized (with 'fsync()'), and the write-buffer it sits in gets flushed,
655 * the extended attribute inode gets flushed too. And this is exactly what the
656 * user expects - synchronizing the host inode synchronizes its extended
661 * function synchronizes the write-buffer.
672 int last_reference = !!(deletion && inode->i_nlink == 0); in ubifs_jnl_update()
682 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex)); in ubifs_jnl_update()
691 * write-buffer even if the inode is synchronous. in ubifs_jnl_update()
694 ilen += ui->data_len; in ubifs_jnl_update()
702 /* Make sure to also account for extended attributes */ in ubifs_jnl_update()
704 len += ALIGN(host_ui->data_len, 8) + ubifs_auth_node_sz(c); in ubifs_jnl_update()
706 len += host_ui->data_len; in ubifs_jnl_update()
710 return -ENOMEM; in ubifs_jnl_update()
718 dent->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_update()
720 dent_key_init_hash(c, &dent_key, dir->i_ino, nm->hash); in ubifs_jnl_update()
722 dent_key_init(c, &dent_key, dir->i_ino, nm); in ubifs_jnl_update()
724 dent->ch.node_type = UBIFS_XENT_NODE; in ubifs_jnl_update()
725 xent_key_init(c, &dent_key, dir->i_ino, nm); in ubifs_jnl_update()
728 key_write(c, &dent_key, dent->key); in ubifs_jnl_update()
729 dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); in ubifs_jnl_update()
730 dent->type = get_dent_type(inode->i_mode); in ubifs_jnl_update()
731 dent->nlen = cpu_to_le16(fname_len(nm)); in ubifs_jnl_update()
732 memcpy(dent->name, fname_name(nm), fname_len(nm)); in ubifs_jnl_update()
733 dent->name[fname_len(nm)] = '\0'; in ubifs_jnl_update()
755 err = ubifs_add_orphan(c, inode->i_ino); in ubifs_jnl_update()
760 ui->del_cmtno = c->cmt_no; in ubifs_jnl_update()
768 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_update()
770 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino); in ubifs_jnl_update()
771 ubifs_wbuf_add_ino_nolock(wbuf, dir->i_ino); in ubifs_jnl_update()
779 err = ubifs_tnc_remove_dh(c, &dent_key, nm->minor_hash); in ubifs_jnl_update()
797 ino_key_init(c, &ino_key, inode->i_ino); in ubifs_jnl_update()
803 ino_key_init(c, &ino_key, dir->i_ino); in ubifs_jnl_update()
806 UBIFS_INO_NODE_SZ + host_ui->data_len, hash_ino_host); in ubifs_jnl_update()
810 if (in_orphan && inode->i_nlink) in ubifs_jnl_update()
811 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_update()
814 spin_lock(&ui->ui_lock); in ubifs_jnl_update()
815 ui->synced_i_size = ui->ui_size; in ubifs_jnl_update()
816 spin_unlock(&ui->ui_lock); in ubifs_jnl_update()
818 spin_lock(&host_ui->ui_lock); in ubifs_jnl_update()
819 host_ui->synced_i_size = host_ui->ui_size; in ubifs_jnl_update()
820 spin_unlock(&host_ui->ui_lock); in ubifs_jnl_update()
838 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_update()
844 * ubifs_jnl_write_data - write a data node to the journal.
845 * @c: UBIFS file-system description object
879 * Fall-back to the write reserve buffer. Note, we might be in ubifs_jnl_write_data()
886 mutex_lock(&c->write_reserve_mutex); in ubifs_jnl_write_data()
887 data = c->write_reserve_buf; in ubifs_jnl_write_data()
890 data->ch.node_type = UBIFS_DATA_NODE; in ubifs_jnl_write_data()
891 key_write(c, key, &data->key); in ubifs_jnl_write_data()
892 data->size = cpu_to_le32(len); in ubifs_jnl_write_data()
894 if (!(ui->flags & UBIFS_COMPR_FL)) in ubifs_jnl_write_data()
898 compr_type = ui->compr_type; in ubifs_jnl_write_data()
900 out_len = compr_len = dlen - UBIFS_DATA_NODE_SZ; in ubifs_jnl_write_data()
901 ubifs_compress_folio(c, folio, offset, len, &data->data, &compr_len, in ubifs_jnl_write_data()
911 data->compr_size = 0; in ubifs_jnl_write_data()
921 data->compr_type = cpu_to_le16(compr_type); in ubifs_jnl_write_data()
937 ubifs_wbuf_add_ino_nolock(&c->jheads[DATAHD].wbuf, key_inum(c, key)); in ubifs_jnl_write_data()
948 mutex_unlock(&c->write_reserve_mutex); in ubifs_jnl_write_data()
960 mutex_unlock(&c->write_reserve_mutex); in ubifs_jnl_write_data()
967 * ubifs_jnl_write_inode - flush inode to the journal.
968 * @c: UBIFS file-system description object
972 * synchronous, it also synchronizes the write-buffer. Returns zero in case of
981 int last_reference = !inode->i_nlink; in ubifs_jnl_write_inode()
982 int kill_xattrs = ui->xattr_cnt && last_reference; in ubifs_jnl_write_inode()
985 dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink); in ubifs_jnl_write_inode()
987 if (kill_xattrs && ui->xattr_cnt > ubifs_xattr_max_cnt(c)) { in ubifs_jnl_write_inode()
989 err = -EPERM; in ubifs_jnl_write_inode()
996 * need to synchronize the write-buffer either. in ubifs_jnl_write_inode()
999 ilen += ui->data_len; in ubifs_jnl_write_inode()
1002 write_len += UBIFS_INO_NODE_SZ * ui->xattr_cnt; in ubifs_jnl_write_inode()
1012 return -ENOMEM; in ubifs_jnl_write_inode()
1025 lowest_xent_key(c, &key, inode->i_ino); in ubifs_jnl_write_inode()
1030 if (err == -ENOENT) in ubifs_jnl_write_inode()
1037 fname_name(&nm) = xent->name; in ubifs_jnl_write_inode()
1038 fname_len(&nm) = le16_to_cpu(xent->nlen); in ubifs_jnl_write_inode()
1040 xino = ubifs_iget(c->vfs_sb, le64_to_cpu(xent->inum)); in ubifs_jnl_write_inode()
1044 xent->name, err); in ubifs_jnl_write_inode()
1050 ubifs_assert(c, ubifs_inode(xino)->xattr); in ubifs_jnl_write_inode()
1059 key_read(c, &xent->key, &key); in ubifs_jnl_write_inode()
1073 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, in ubifs_jnl_write_inode()
1074 inode->i_ino); in ubifs_jnl_write_inode()
1078 err = ubifs_tnc_remove_ino(c, inode->i_ino); in ubifs_jnl_write_inode()
1081 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_write_inode()
1088 ino_key_init(c, &key, inode->i_ino); in ubifs_jnl_write_inode()
1095 spin_lock(&ui->ui_lock); in ubifs_jnl_write_inode()
1096 ui->synced_i_size = ui->ui_size; in ubifs_jnl_write_inode()
1097 spin_unlock(&ui->ui_lock); in ubifs_jnl_write_inode()
1112 * ubifs_jnl_delete_inode - delete an inode.
1113 * @c: UBIFS file-system description object
1128 * have been garbage-collected already. And for optimization reasons UBIFS does
1145 ubifs_assert(c, inode->i_nlink == 0); in ubifs_jnl_delete_inode()
1147 if (ui->xattr_cnt || ui->del_cmtno != c->cmt_no) in ubifs_jnl_delete_inode()
1151 down_read(&c->commit_sem); in ubifs_jnl_delete_inode()
1154 * without @c->commit_sem, so a commit might have happened. in ubifs_jnl_delete_inode()
1156 if (ui->del_cmtno != c->cmt_no) { in ubifs_jnl_delete_inode()
1157 up_read(&c->commit_sem); in ubifs_jnl_delete_inode()
1161 err = ubifs_tnc_remove_ino(c, inode->i_ino); in ubifs_jnl_delete_inode()
1165 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_delete_inode()
1166 up_read(&c->commit_sem); in ubifs_jnl_delete_inode()
1171 * ubifs_jnl_xrename - cross rename two directory entries.
1172 * @c: UBIFS file-system description object
1179 * @sync: non-zero if the write-buffer has to be synchronized
1204 ubifs_assert(c, ubifs_inode(fst_dir)->data_len == 0); in ubifs_jnl_xrename()
1205 ubifs_assert(c, ubifs_inode(snd_dir)->data_len == 0); in ubifs_jnl_xrename()
1206 ubifs_assert(c, mutex_is_locked(&ubifs_inode(fst_dir)->ui_mutex)); in ubifs_jnl_xrename()
1207 ubifs_assert(c, mutex_is_locked(&ubifs_inode(snd_dir)->ui_mutex)); in ubifs_jnl_xrename()
1222 return -ENOMEM; in ubifs_jnl_xrename()
1230 dent1->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_xrename()
1231 dent_key_init_flash(c, &dent1->key, snd_dir->i_ino, snd_nm); in ubifs_jnl_xrename()
1232 dent1->inum = cpu_to_le64(fst_inode->i_ino); in ubifs_jnl_xrename()
1233 dent1->type = get_dent_type(fst_inode->i_mode); in ubifs_jnl_xrename()
1234 dent1->nlen = cpu_to_le16(fname_len(snd_nm)); in ubifs_jnl_xrename()
1235 memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); in ubifs_jnl_xrename()
1236 dent1->name[fname_len(snd_nm)] = '\0'; in ubifs_jnl_xrename()
1246 dent2->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_xrename()
1247 dent_key_init_flash(c, &dent2->key, fst_dir->i_ino, fst_nm); in ubifs_jnl_xrename()
1248 dent2->inum = cpu_to_le64(snd_inode->i_ino); in ubifs_jnl_xrename()
1249 dent2->type = get_dent_type(snd_inode->i_mode); in ubifs_jnl_xrename()
1250 dent2->nlen = cpu_to_le16(fname_len(fst_nm)); in ubifs_jnl_xrename()
1251 memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); in ubifs_jnl_xrename()
1252 dent2->name[fname_len(fst_nm)] = '\0'; in ubifs_jnl_xrename()
1282 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_xrename()
1284 ubifs_wbuf_add_ino_nolock(wbuf, fst_dir->i_ino); in ubifs_jnl_xrename()
1285 ubifs_wbuf_add_ino_nolock(wbuf, snd_dir->i_ino); in ubifs_jnl_xrename()
1291 dent_key_init(c, &key, snd_dir->i_ino, snd_nm); in ubifs_jnl_xrename()
1297 dent_key_init(c, &key, fst_dir->i_ino, fst_nm); in ubifs_jnl_xrename()
1304 ino_key_init(c, &key, fst_dir->i_ino); in ubifs_jnl_xrename()
1311 ino_key_init(c, &key, snd_dir->i_ino); in ubifs_jnl_xrename()
1336 * ubifs_jnl_rename - rename a directory entry.
1337 * @c: UBIFS file-system description object
1346 * @sync: non-zero if the write-buffer has to be synchronized
1349 * This function implements the re-name operation which may involve writing up
1367 int last_reference = !!(new_inode && new_inode->i_nlink == 0); in ubifs_jnl_rename()
1377 ubifs_assert(c, ubifs_inode(old_dir)->data_len == 0); in ubifs_jnl_rename()
1378 ubifs_assert(c, ubifs_inode(new_dir)->data_len == 0); in ubifs_jnl_rename()
1379 ubifs_assert(c, mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex)); in ubifs_jnl_rename()
1380 ubifs_assert(c, mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex)); in ubifs_jnl_rename()
1386 ubifs_assert(c, mutex_is_locked(&new_ui->ui_mutex)); in ubifs_jnl_rename()
1389 ilen += new_ui->data_len; in ubifs_jnl_rename()
1395 ubifs_assert(c, mutex_is_locked(&whiteout_ui->ui_mutex)); in ubifs_jnl_rename()
1396 ubifs_assert(c, whiteout->i_nlink == 1); in ubifs_jnl_rename()
1397 ubifs_assert(c, !whiteout_ui->dirty); in ubifs_jnl_rename()
1399 wlen += whiteout_ui->data_len; in ubifs_jnl_rename()
1414 return -ENOMEM; in ubifs_jnl_rename()
1422 dent->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_rename()
1423 dent_key_init_flash(c, &dent->key, new_dir->i_ino, new_nm); in ubifs_jnl_rename()
1424 dent->inum = cpu_to_le64(old_inode->i_ino); in ubifs_jnl_rename()
1425 dent->type = get_dent_type(old_inode->i_mode); in ubifs_jnl_rename()
1426 dent->nlen = cpu_to_le16(fname_len(new_nm)); in ubifs_jnl_rename()
1427 memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); in ubifs_jnl_rename()
1428 dent->name[fname_len(new_nm)] = '\0'; in ubifs_jnl_rename()
1437 dent2->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_rename()
1438 dent_key_init_flash(c, &dent2->key, old_dir->i_ino, old_nm); in ubifs_jnl_rename()
1441 dent2->inum = cpu_to_le64(whiteout->i_ino); in ubifs_jnl_rename()
1442 dent2->type = get_dent_type(whiteout->i_mode); in ubifs_jnl_rename()
1445 dent2->inum = 0; in ubifs_jnl_rename()
1446 dent2->type = DT_UNKNOWN; in ubifs_jnl_rename()
1448 dent2->nlen = cpu_to_le16(fname_len(old_nm)); in ubifs_jnl_rename()
1449 memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); in ubifs_jnl_rename()
1450 dent2->name[fname_len(old_nm)] = '\0'; in ubifs_jnl_rename()
1496 err = ubifs_add_orphan(c, new_inode->i_ino); in ubifs_jnl_rename()
1501 new_ui->del_cmtno = c->cmt_no; in ubifs_jnl_rename()
1509 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_rename()
1511 ubifs_wbuf_add_ino_nolock(wbuf, new_dir->i_ino); in ubifs_jnl_rename()
1512 ubifs_wbuf_add_ino_nolock(wbuf, old_dir->i_ino); in ubifs_jnl_rename()
1514 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, in ubifs_jnl_rename()
1515 new_inode->i_ino); in ubifs_jnl_rename()
1517 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, in ubifs_jnl_rename()
1518 whiteout->i_ino); in ubifs_jnl_rename()
1524 dent_key_init(c, &key, new_dir->i_ino, new_nm); in ubifs_jnl_rename()
1531 dent_key_init(c, &key, old_dir->i_ino, old_nm); in ubifs_jnl_rename()
1540 dent_key_init(c, &key, old_dir->i_ino, old_nm); in ubifs_jnl_rename()
1548 ino_key_init(c, &key, new_inode->i_ino); in ubifs_jnl_rename()
1556 ino_key_init(c, &key, whiteout->i_ino); in ubifs_jnl_rename()
1564 ino_key_init(c, &key, old_dir->i_ino); in ubifs_jnl_rename()
1571 ino_key_init(c, &key, new_dir->i_ino); in ubifs_jnl_rename()
1578 ubifs_delete_orphan(c, whiteout->i_ino); in ubifs_jnl_rename()
1583 spin_lock(&new_ui->ui_lock); in ubifs_jnl_rename()
1584 new_ui->synced_i_size = new_ui->ui_size; in ubifs_jnl_rename()
1585 spin_unlock(&new_ui->ui_lock); in ubifs_jnl_rename()
1589 * Whiteout doesn't have non-zero size, no need to update in ubifs_jnl_rename()
1603 ubifs_delete_orphan(c, new_inode->i_ino); in ubifs_jnl_rename()
1612 * truncate_data_node - re-compress/encrypt a truncated data node.
1613 * @c: UBIFS file-system description object
1616 * @dn: data node to re-compress
1621 * the inode has to be re-compressed/encrypted and re-written.
1630 out_len = le32_to_cpu(dn->size); in truncate_data_node()
1633 return -ENOMEM; in truncate_data_node()
1635 dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ; in truncate_data_node()
1636 data_size = dn_size - UBIFS_DATA_NODE_SZ; in truncate_data_node()
1637 compr_type = le16_to_cpu(dn->compr_type); in truncate_data_node()
1648 err = ubifs_decompress(c, &dn->data, dlen, buf, &out_len, compr_type); in truncate_data_node()
1652 ubifs_compress(c, buf, *new_len, &dn->data, &out_len, &compr_type); in truncate_data_node()
1662 dn->compr_size = 0; in truncate_data_node()
1666 dn->compr_type = cpu_to_le16(compr_type); in truncate_data_node()
1667 dn->size = cpu_to_le32(*new_len); in truncate_data_node()
1676 * ubifs_jnl_truncate - update the journal for a truncation.
1677 * @c: UBIFS file-system description object
1683 * written, the journal tree is updated, and the last data block is re-written
1700 ino_t inum = inode->i_ino; in ubifs_jnl_truncate()
1705 dbg_jnl("ino %lu, size %lld -> %lld", in ubifs_jnl_truncate()
1707 ubifs_assert(c, !ui->data_len); in ubifs_jnl_truncate()
1708 ubifs_assert(c, S_ISREG(inode->i_mode)); in ubifs_jnl_truncate()
1709 ubifs_assert(c, mutex_is_locked(&ui->ui_mutex)); in ubifs_jnl_truncate()
1721 return -ENOMEM; in ubifs_jnl_truncate()
1724 trun->ch.node_type = UBIFS_TRUN_NODE; in ubifs_jnl_truncate()
1725 trun->inum = cpu_to_le32(inum); in ubifs_jnl_truncate()
1726 trun->old_size = cpu_to_le64(old_size); in ubifs_jnl_truncate()
1727 trun->new_size = cpu_to_le64(new_size); in ubifs_jnl_truncate()
1730 dlen = new_size & (UBIFS_BLOCK_SIZE - 1); in ubifs_jnl_truncate()
1738 if (err == -ENOENT) in ubifs_jnl_truncate()
1743 int dn_len = le32_to_cpu(dn->size); in ubifs_jnl_truncate()
1747 blk, inode->i_ino); in ubifs_jnl_truncate()
1749 err = -EUCLEAN; in ubifs_jnl_truncate()
1793 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, inum); in ubifs_jnl_truncate()
1814 bit = new_size & (UBIFS_BLOCK_SIZE - 1); in ubifs_jnl_truncate()
1818 bit = old_size & (UBIFS_BLOCK_SIZE - 1); in ubifs_jnl_truncate()
1819 blk = (old_size >> UBIFS_BLOCK_SHIFT) - (bit ? 0 : 1); in ubifs_jnl_truncate()
1827 spin_lock(&ui->ui_lock); in ubifs_jnl_truncate()
1828 ui->synced_i_size = ui->ui_size; in ubifs_jnl_truncate()
1829 spin_unlock(&ui->ui_lock); in ubifs_jnl_truncate()
1846 * ubifs_jnl_delete_xattr - delete an extended attribute.
1847 * @c: UBIFS file-system description object
1849 * @inode: extended attribute inode
1850 * @nm: extended attribute entry name
1852 * This function delete an extended attribute which is very similar to
1853 * un-linking regular files - it writes a deletion xentry, a deletion inode and
1869 ubifs_assert(c, inode->i_nlink == 0); in ubifs_jnl_delete_xattr()
1870 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex)); in ubifs_jnl_delete_xattr()
1878 hlen = host_ui->data_len + UBIFS_INO_NODE_SZ; in ubifs_jnl_delete_xattr()
1885 return -ENOMEM; in ubifs_jnl_delete_xattr()
1894 xent->ch.node_type = UBIFS_XENT_NODE; in ubifs_jnl_delete_xattr()
1895 xent_key_init(c, &xent_key, host->i_ino, nm); in ubifs_jnl_delete_xattr()
1896 key_write(c, &xent_key, xent->key); in ubifs_jnl_delete_xattr()
1897 xent->inum = 0; in ubifs_jnl_delete_xattr()
1898 xent->type = get_dent_type(inode->i_mode); in ubifs_jnl_delete_xattr()
1899 xent->nlen = cpu_to_le16(fname_len(nm)); in ubifs_jnl_delete_xattr()
1900 memcpy(xent->name, fname_name(nm), fname_len(nm)); in ubifs_jnl_delete_xattr()
1901 xent->name[fname_len(nm)] = '\0'; in ubifs_jnl_delete_xattr()
1915 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, host->i_ino); in ubifs_jnl_delete_xattr()
1923 /* Remove the extended attribute entry from TNC */ in ubifs_jnl_delete_xattr()
1932 * Remove all nodes belonging to the extended attribute inode from TNC. in ubifs_jnl_delete_xattr()
1933 * Well, there actually must be only one node - the inode itself. in ubifs_jnl_delete_xattr()
1935 lowest_ino_key(c, &key1, inode->i_ino); in ubifs_jnl_delete_xattr()
1936 highest_ino_key(c, &key2, inode->i_ino); in ubifs_jnl_delete_xattr()
1945 ino_key_init(c, &key1, host->i_ino); in ubifs_jnl_delete_xattr()
1946 err = ubifs_tnc_add(c, &key1, lnum, xent_offs + len - hlen, hlen, hash); in ubifs_jnl_delete_xattr()
1951 spin_lock(&host_ui->ui_lock); in ubifs_jnl_delete_xattr()
1952 host_ui->synced_i_size = host_ui->ui_size; in ubifs_jnl_delete_xattr()
1953 spin_unlock(&host_ui->ui_lock); in ubifs_jnl_delete_xattr()
1967 * ubifs_jnl_change_xattr - change an extended attribute.
1968 * @c: UBIFS file-system description object
1969 * @inode: extended attribute inode
1972 * This function writes the updated version of an extended attribute inode and
1974 * after the extended attribute inode in order to guarantee that the extended
1976 * consequently, the write-buffer is synchronized. This function returns zero
1990 dbg_jnl("ino %lu, ino %lu", host->i_ino, inode->i_ino); in ubifs_jnl_change_xattr()
1991 ubifs_assert(c, inode->i_nlink > 0); in ubifs_jnl_change_xattr()
1992 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex)); in ubifs_jnl_change_xattr()
1994 len1 = UBIFS_INO_NODE_SZ + host_ui->data_len; in ubifs_jnl_change_xattr()
1995 len2 = UBIFS_INO_NODE_SZ + ubifs_inode(inode)->data_len; in ubifs_jnl_change_xattr()
2003 return -ENOMEM; in ubifs_jnl_change_xattr()
2021 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_change_xattr()
2023 ubifs_wbuf_add_ino_nolock(wbuf, host->i_ino); in ubifs_jnl_change_xattr()
2024 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino); in ubifs_jnl_change_xattr()
2032 ino_key_init(c, &key, host->i_ino); in ubifs_jnl_change_xattr()
2037 ino_key_init(c, &key, inode->i_ino); in ubifs_jnl_change_xattr()
2043 spin_lock(&host_ui->ui_lock); in ubifs_jnl_change_xattr()
2044 host_ui->synced_i_size = host_ui->ui_size; in ubifs_jnl_change_xattr()
2045 spin_unlock(&host_ui->ui_lock); in ubifs_jnl_change_xattr()