Lines Matching +full:sync +full:- +full:write
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
26 * in one LEB, so we may write data owned by different inodes to different
33 * Bud LEBs may be half-indexed. For example, if the bud was not full at the
43 * All the journal write operations like 'ubifs_jnl_update()' here, which write
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()
173 * trying to write to the same journal head at the same time. 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
258 * @buf: buffer to write
259 * @len: length to write
262 * @sync: non-zero if the write-buffer has to by synchronized
269 int *lnum, int *offs, int sync) in write_head() argument
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()
290 if (sync) in write_head()
296 * make_reservation - reserve journal space.
297 * @c: UBIFS file-system description object
316 down_read(&c->commit_sem); in make_reservation()
319 /* c->commit_sem will get released via finish_reservation(). */ in make_reservation()
321 up_read(&c->commit_sem); in make_reservation()
323 if (err == -ENOSPC) { in make_reservation()
327 * make progress, so make the error -EAGAIN so that the below in make_reservation()
328 * will commit and re-try. in make_reservation()
332 err = -EAGAIN; in make_reservation()
337 * to be able to write to the media, because all operations are in make_reservation()
343 if (err != -EAGAIN) in make_reservation()
347 * -EAGAIN means that the journal is full or too large, or the above in make_reservation()
348 * code wants to do one commit. Do this and re-try. in make_reservation()
356 err = -ENOSPC; in make_reservation()
359 ubifs_warn(c, "too many space allocation re-tries (%d)", in make_reservation()
362 dbg_jnl("-EAGAIN, commit and retry (retried %d times)", in make_reservation()
374 if (err == -ENOSPC) { in make_reservation()
376 down_write(&c->commit_sem); in make_reservation()
378 ubifs_dump_budg(c, &c->bi); in make_reservation()
381 up_write(&c->commit_sem); in make_reservation()
387 * release_head - release a journal head.
388 * @c: UBIFS file-system description object
397 mutex_unlock(&c->jheads[jhead].wbuf.io_mutex); in release_head()
401 * finish_reservation - finish a reservation.
402 * @c: UBIFS file-system description object
409 up_read(&c->commit_sem); in finish_reservation()
413 * get_dent_type - translate VFS inode mode to UBIFS directory entry type.
440 * pack_inode - pack an inode node.
441 * @c: UBIFS file-system description object
449 int data_len = 0, last_reference = !inode->i_nlink; in pack_inode()
452 ino->ch.node_type = UBIFS_INO_NODE; in pack_inode()
453 ino_key_init_flash(c, &ino->key, inode->i_ino); in pack_inode()
454 ino->creat_sqnum = cpu_to_le64(ui->creat_sqnum); in pack_inode()
455 ino->atime_sec = cpu_to_le64(inode_get_atime_sec(inode)); in pack_inode()
456 ino->atime_nsec = cpu_to_le32(inode_get_atime_nsec(inode)); in pack_inode()
457 ino->ctime_sec = cpu_to_le64(inode_get_ctime_sec(inode)); in pack_inode()
458 ino->ctime_nsec = cpu_to_le32(inode_get_ctime_nsec(inode)); in pack_inode()
459 ino->mtime_sec = cpu_to_le64(inode_get_mtime_sec(inode)); in pack_inode()
460 ino->mtime_nsec = cpu_to_le32(inode_get_mtime_nsec(inode)); in pack_inode()
461 ino->uid = cpu_to_le32(i_uid_read(inode)); in pack_inode()
462 ino->gid = cpu_to_le32(i_gid_read(inode)); in pack_inode()
463 ino->mode = cpu_to_le32(inode->i_mode); in pack_inode()
464 ino->flags = cpu_to_le32(ui->flags); in pack_inode()
465 ino->size = cpu_to_le64(ui->ui_size); in pack_inode()
466 ino->nlink = cpu_to_le32(inode->i_nlink); in pack_inode()
467 ino->compr_type = cpu_to_le16(ui->compr_type); in pack_inode()
468 ino->data_len = cpu_to_le32(ui->data_len); in pack_inode()
469 ino->xattr_cnt = cpu_to_le32(ui->xattr_cnt); in pack_inode()
470 ino->xattr_size = cpu_to_le32(ui->xattr_size); in pack_inode()
471 ino->xattr_names = cpu_to_le32(ui->xattr_names); in pack_inode()
479 memcpy(ino->data, ui->data, ui->data_len); in pack_inode()
480 data_len = ui->data_len; in pack_inode()
487 * mark_inode_clean - mark UBIFS inode as clean.
488 * @c: UBIFS file-system description object
492 * @ui->dirty flag and releasing its budget. Note, VFS may still treat the
493 * inode as dirty and try to write it back, but 'ubifs_write_inode()' would
498 if (ui->dirty) in mark_inode_clean()
500 ui->dirty = 0; in mark_inode_clean()
505 if (c->double_hash) in set_dent_cookie()
506 dent->cookie = (__force __le32) get_random_u32(); in set_dent_cookie()
508 dent->cookie = 0; in set_dent_cookie()
512 * ubifs_jnl_update - update inode.
513 * @c: UBIFS file-system description object
518 * @xent: non-zero if the directory entry is an extended attribute entry
526 * synchronized (with 'fsync()'), and the write-buffer it sits in gets flushed,
528 * user expects - synchronizing the host inode synchronizes its extended
533 * function synchronizes the write-buffer.
543 int aligned_dlen, aligned_ilen, sync = IS_DIRSYNC(dir); in ubifs_jnl_update() local
544 int last_reference = !!(deletion && inode->i_nlink == 0); in ubifs_jnl_update()
554 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex)); in ubifs_jnl_update()
561 * no need to attach and write inode data, it is being deleted anyway. in ubifs_jnl_update()
563 * write-buffer even if the inode is synchronous. in ubifs_jnl_update()
566 ilen += ui->data_len; in ubifs_jnl_update()
567 sync |= IS_SYNC(inode); in ubifs_jnl_update()
576 len += ALIGN(host_ui->data_len, 8) + ubifs_auth_node_sz(c); in ubifs_jnl_update()
578 len += host_ui->data_len; in ubifs_jnl_update()
582 return -ENOMEM; in ubifs_jnl_update()
590 dent->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_update()
592 dent_key_init_hash(c, &dent_key, dir->i_ino, nm->hash); in ubifs_jnl_update()
594 dent_key_init(c, &dent_key, dir->i_ino, nm); in ubifs_jnl_update()
596 dent->ch.node_type = UBIFS_XENT_NODE; in ubifs_jnl_update()
597 xent_key_init(c, &dent_key, dir->i_ino, nm); in ubifs_jnl_update()
600 key_write(c, &dent_key, dent->key); in ubifs_jnl_update()
601 dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); in ubifs_jnl_update()
602 dent->type = get_dent_type(inode->i_mode); in ubifs_jnl_update()
603 dent->nlen = cpu_to_le16(fname_len(nm)); in ubifs_jnl_update()
604 memcpy(dent->name, fname_name(nm), fname_len(nm)); in ubifs_jnl_update()
605 dent->name[fname_len(nm)] = '\0'; in ubifs_jnl_update()
627 err = ubifs_add_orphan(c, inode->i_ino); in ubifs_jnl_update()
632 ui->del_cmtno = c->cmt_no; in ubifs_jnl_update()
636 err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync); in ubifs_jnl_update()
639 if (!sync) { in ubifs_jnl_update()
640 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_update()
642 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino); in ubifs_jnl_update()
643 ubifs_wbuf_add_ino_nolock(wbuf, dir->i_ino); in ubifs_jnl_update()
651 err = ubifs_tnc_remove_dh(c, &dent_key, nm->minor_hash); in ubifs_jnl_update()
669 ino_key_init(c, &ino_key, inode->i_ino); in ubifs_jnl_update()
675 ino_key_init(c, &ino_key, dir->i_ino); in ubifs_jnl_update()
678 UBIFS_INO_NODE_SZ + host_ui->data_len, hash_ino_host); in ubifs_jnl_update()
683 spin_lock(&ui->ui_lock); in ubifs_jnl_update()
684 ui->synced_i_size = ui->ui_size; in ubifs_jnl_update()
685 spin_unlock(&ui->ui_lock); in ubifs_jnl_update()
687 spin_lock(&host_ui->ui_lock); in ubifs_jnl_update()
688 host_ui->synced_i_size = host_ui->ui_size; in ubifs_jnl_update()
689 spin_unlock(&host_ui->ui_lock); in ubifs_jnl_update()
707 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_update()
713 * ubifs_jnl_write_data - write a data node to the journal.
714 * @c: UBIFS file-system description object
717 * @buf: buffer to write
746 * Fall-back to the write reserve buffer. Note, we might be in ubifs_jnl_write_data()
749 * write reserve buffer helps us to guarantee that we are in ubifs_jnl_write_data()
750 * always able to write the data. in ubifs_jnl_write_data()
753 mutex_lock(&c->write_reserve_mutex); in ubifs_jnl_write_data()
754 data = c->write_reserve_buf; in ubifs_jnl_write_data()
757 data->ch.node_type = UBIFS_DATA_NODE; in ubifs_jnl_write_data()
758 key_write(c, key, &data->key); in ubifs_jnl_write_data()
759 data->size = cpu_to_le32(len); in ubifs_jnl_write_data()
761 if (!(ui->flags & UBIFS_COMPR_FL)) in ubifs_jnl_write_data()
765 compr_type = ui->compr_type; in ubifs_jnl_write_data()
767 out_len = compr_len = dlen - UBIFS_DATA_NODE_SZ; in ubifs_jnl_write_data()
768 ubifs_compress(c, buf, len, &data->data, &compr_len, &compr_type); in ubifs_jnl_write_data()
777 data->compr_size = 0; in ubifs_jnl_write_data()
787 data->compr_type = cpu_to_le16(compr_type); in ubifs_jnl_write_data()
803 ubifs_wbuf_add_ino_nolock(&c->jheads[DATAHD].wbuf, key_inum(c, key)); in ubifs_jnl_write_data()
814 mutex_unlock(&c->write_reserve_mutex); in ubifs_jnl_write_data()
826 mutex_unlock(&c->write_reserve_mutex); in ubifs_jnl_write_data()
833 * ubifs_jnl_write_inode - flush inode to the journal.
834 * @c: UBIFS file-system description object
838 * synchronous, it also synchronizes the write-buffer. Returns zero in case of
846 int sync = 0, write_len = 0, ilen = UBIFS_INO_NODE_SZ; in ubifs_jnl_write_inode() local
847 int last_reference = !inode->i_nlink; in ubifs_jnl_write_inode()
848 int kill_xattrs = ui->xattr_cnt && last_reference; in ubifs_jnl_write_inode()
851 dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink); in ubifs_jnl_write_inode()
854 * If the inode is being deleted, do not write the attached data. No in ubifs_jnl_write_inode()
855 * need to synchronize the write-buffer either. in ubifs_jnl_write_inode()
858 ilen += ui->data_len; in ubifs_jnl_write_inode()
859 sync = IS_SYNC(inode); in ubifs_jnl_write_inode()
861 write_len += UBIFS_INO_NODE_SZ * ui->xattr_cnt; in ubifs_jnl_write_inode()
871 return -ENOMEM; in ubifs_jnl_write_inode()
884 if (ui->xattr_cnt > ubifs_xattr_max_cnt(c)) { in ubifs_jnl_write_inode()
885 err = -EPERM; in ubifs_jnl_write_inode()
890 lowest_xent_key(c, &key, inode->i_ino); in ubifs_jnl_write_inode()
895 if (err == -ENOENT) in ubifs_jnl_write_inode()
902 fname_name(&nm) = xent->name; in ubifs_jnl_write_inode()
903 fname_len(&nm) = le16_to_cpu(xent->nlen); in ubifs_jnl_write_inode()
905 xino = ubifs_iget(c->vfs_sb, le64_to_cpu(xent->inum)); in ubifs_jnl_write_inode()
909 xent->name, err); in ubifs_jnl_write_inode()
915 ubifs_assert(c, ubifs_inode(xino)->xattr); in ubifs_jnl_write_inode()
924 key_read(c, &xent->key, &key); in ubifs_jnl_write_inode()
934 err = write_head(c, BASEHD, ino_start, write_len, &lnum, &offs, sync); in ubifs_jnl_write_inode()
937 if (!sync) in ubifs_jnl_write_inode()
938 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, in ubifs_jnl_write_inode()
939 inode->i_ino); in ubifs_jnl_write_inode()
943 err = ubifs_tnc_remove_ino(c, inode->i_ino); in ubifs_jnl_write_inode()
946 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_write_inode()
953 ino_key_init(c, &key, inode->i_ino); in ubifs_jnl_write_inode()
960 spin_lock(&ui->ui_lock); in ubifs_jnl_write_inode()
961 ui->synced_i_size = ui->ui_size; in ubifs_jnl_write_inode()
962 spin_unlock(&ui->ui_lock); in ubifs_jnl_write_inode()
977 * ubifs_jnl_delete_inode - delete an inode.
978 * @c: UBIFS file-system description object
989 * general, it has to write one more deletion inode to the media, because if
993 * have been garbage-collected already. And for optimization reasons UBIFS does
999 * 'ubifs_jnl_delete_inode()', then there is no need to write the deletion
1010 ubifs_assert(c, inode->i_nlink == 0); in ubifs_jnl_delete_inode()
1012 if (ui->xattr_cnt || ui->del_cmtno != c->cmt_no) in ubifs_jnl_delete_inode()
1016 down_read(&c->commit_sem); in ubifs_jnl_delete_inode()
1019 * without @c->commit_sem, so a commit might have happened. in ubifs_jnl_delete_inode()
1021 if (ui->del_cmtno != c->cmt_no) { in ubifs_jnl_delete_inode()
1022 up_read(&c->commit_sem); in ubifs_jnl_delete_inode()
1026 err = ubifs_tnc_remove_ino(c, inode->i_ino); in ubifs_jnl_delete_inode()
1030 ubifs_delete_orphan(c, inode->i_ino); in ubifs_jnl_delete_inode()
1031 up_read(&c->commit_sem); in ubifs_jnl_delete_inode()
1036 * ubifs_jnl_xrename - cross rename two directory entries.
1037 * @c: UBIFS file-system description object
1044 * @sync: non-zero if the write-buffer has to be synchronized
1056 const struct fscrypt_name *snd_nm, int sync) in ubifs_jnl_xrename() argument
1069 ubifs_assert(c, ubifs_inode(fst_dir)->data_len == 0); in ubifs_jnl_xrename()
1070 ubifs_assert(c, ubifs_inode(snd_dir)->data_len == 0); in ubifs_jnl_xrename()
1071 ubifs_assert(c, mutex_is_locked(&ubifs_inode(fst_dir)->ui_mutex)); in ubifs_jnl_xrename()
1072 ubifs_assert(c, mutex_is_locked(&ubifs_inode(snd_dir)->ui_mutex)); in ubifs_jnl_xrename()
1087 return -ENOMEM; in ubifs_jnl_xrename()
1095 dent1->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_xrename()
1096 dent_key_init_flash(c, &dent1->key, snd_dir->i_ino, snd_nm); in ubifs_jnl_xrename()
1097 dent1->inum = cpu_to_le64(fst_inode->i_ino); in ubifs_jnl_xrename()
1098 dent1->type = get_dent_type(fst_inode->i_mode); in ubifs_jnl_xrename()
1099 dent1->nlen = cpu_to_le16(fname_len(snd_nm)); in ubifs_jnl_xrename()
1100 memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); in ubifs_jnl_xrename()
1101 dent1->name[fname_len(snd_nm)] = '\0'; in ubifs_jnl_xrename()
1111 dent2->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_xrename()
1112 dent_key_init_flash(c, &dent2->key, fst_dir->i_ino, fst_nm); in ubifs_jnl_xrename()
1113 dent2->inum = cpu_to_le64(snd_inode->i_ino); in ubifs_jnl_xrename()
1114 dent2->type = get_dent_type(snd_inode->i_mode); in ubifs_jnl_xrename()
1115 dent2->nlen = cpu_to_le16(fname_len(fst_nm)); in ubifs_jnl_xrename()
1116 memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); in ubifs_jnl_xrename()
1117 dent2->name[fname_len(fst_nm)] = '\0'; in ubifs_jnl_xrename()
1143 err = write_head(c, BASEHD, dent1, len, &lnum, &offs, sync); in ubifs_jnl_xrename()
1146 if (!sync) { in ubifs_jnl_xrename()
1147 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_xrename()
1149 ubifs_wbuf_add_ino_nolock(wbuf, fst_dir->i_ino); in ubifs_jnl_xrename()
1150 ubifs_wbuf_add_ino_nolock(wbuf, snd_dir->i_ino); in ubifs_jnl_xrename()
1156 dent_key_init(c, &key, snd_dir->i_ino, snd_nm); in ubifs_jnl_xrename()
1162 dent_key_init(c, &key, fst_dir->i_ino, fst_nm); in ubifs_jnl_xrename()
1169 ino_key_init(c, &key, fst_dir->i_ino); in ubifs_jnl_xrename()
1176 ino_key_init(c, &key, snd_dir->i_ino); in ubifs_jnl_xrename()
1201 * ubifs_jnl_rename - rename a directory entry.
1202 * @c: UBIFS file-system description object
1211 * @sync: non-zero if the write-buffer has to be synchronized
1213 * This function implements the re-name operation which may involve writing up
1224 const struct inode *whiteout, int sync) in ubifs_jnl_rename() argument
1231 int last_reference = !!(new_inode && new_inode->i_nlink == 0); in ubifs_jnl_rename()
1241 ubifs_assert(c, ubifs_inode(old_dir)->data_len == 0); in ubifs_jnl_rename()
1242 ubifs_assert(c, ubifs_inode(new_dir)->data_len == 0); in ubifs_jnl_rename()
1243 ubifs_assert(c, mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex)); in ubifs_jnl_rename()
1244 ubifs_assert(c, mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex)); in ubifs_jnl_rename()
1250 ubifs_assert(c, mutex_is_locked(&new_ui->ui_mutex)); in ubifs_jnl_rename()
1253 ilen += new_ui->data_len; in ubifs_jnl_rename()
1259 ubifs_assert(c, mutex_is_locked(&whiteout_ui->ui_mutex)); in ubifs_jnl_rename()
1260 ubifs_assert(c, whiteout->i_nlink == 1); in ubifs_jnl_rename()
1261 ubifs_assert(c, !whiteout_ui->dirty); in ubifs_jnl_rename()
1263 wlen += whiteout_ui->data_len; in ubifs_jnl_rename()
1278 return -ENOMEM; in ubifs_jnl_rename()
1286 dent->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_rename()
1287 dent_key_init_flash(c, &dent->key, new_dir->i_ino, new_nm); in ubifs_jnl_rename()
1288 dent->inum = cpu_to_le64(old_inode->i_ino); in ubifs_jnl_rename()
1289 dent->type = get_dent_type(old_inode->i_mode); in ubifs_jnl_rename()
1290 dent->nlen = cpu_to_le16(fname_len(new_nm)); in ubifs_jnl_rename()
1291 memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); in ubifs_jnl_rename()
1292 dent->name[fname_len(new_nm)] = '\0'; in ubifs_jnl_rename()
1301 dent2->ch.node_type = UBIFS_DENT_NODE; in ubifs_jnl_rename()
1302 dent_key_init_flash(c, &dent2->key, old_dir->i_ino, old_nm); in ubifs_jnl_rename()
1305 dent2->inum = cpu_to_le64(whiteout->i_ino); in ubifs_jnl_rename()
1306 dent2->type = get_dent_type(whiteout->i_mode); in ubifs_jnl_rename()
1309 dent2->inum = 0; in ubifs_jnl_rename()
1310 dent2->type = DT_UNKNOWN; in ubifs_jnl_rename()
1312 dent2->nlen = cpu_to_le16(fname_len(old_nm)); in ubifs_jnl_rename()
1313 memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); in ubifs_jnl_rename()
1314 dent2->name[fname_len(old_nm)] = '\0'; in ubifs_jnl_rename()
1360 err = ubifs_add_orphan(c, new_inode->i_ino); in ubifs_jnl_rename()
1365 new_ui->del_cmtno = c->cmt_no; in ubifs_jnl_rename()
1369 err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync); in ubifs_jnl_rename()
1372 if (!sync) { in ubifs_jnl_rename()
1373 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_rename()
1375 ubifs_wbuf_add_ino_nolock(wbuf, new_dir->i_ino); in ubifs_jnl_rename()
1376 ubifs_wbuf_add_ino_nolock(wbuf, old_dir->i_ino); in ubifs_jnl_rename()
1378 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, in ubifs_jnl_rename()
1379 new_inode->i_ino); in ubifs_jnl_rename()
1381 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, in ubifs_jnl_rename()
1382 whiteout->i_ino); in ubifs_jnl_rename()
1388 dent_key_init(c, &key, new_dir->i_ino, new_nm); in ubifs_jnl_rename()
1395 dent_key_init(c, &key, old_dir->i_ino, old_nm); in ubifs_jnl_rename()
1404 dent_key_init(c, &key, old_dir->i_ino, old_nm); in ubifs_jnl_rename()
1412 ino_key_init(c, &key, new_inode->i_ino); in ubifs_jnl_rename()
1420 ino_key_init(c, &key, whiteout->i_ino); in ubifs_jnl_rename()
1428 ino_key_init(c, &key, old_dir->i_ino); in ubifs_jnl_rename()
1435 ino_key_init(c, &key, new_dir->i_ino); in ubifs_jnl_rename()
1444 spin_lock(&new_ui->ui_lock); in ubifs_jnl_rename()
1445 new_ui->synced_i_size = new_ui->ui_size; in ubifs_jnl_rename()
1446 spin_unlock(&new_ui->ui_lock); in ubifs_jnl_rename()
1450 * Whiteout doesn't have non-zero size, no need to update in ubifs_jnl_rename()
1464 ubifs_delete_orphan(c, new_inode->i_ino); in ubifs_jnl_rename()
1473 * truncate_data_node - re-compress/encrypt a truncated data node.
1474 * @c: UBIFS file-system description object
1477 * @dn: data node to re-compress
1482 * the inode has to be re-compressed/encrypted and re-written.
1491 out_len = le32_to_cpu(dn->size); in truncate_data_node()
1494 return -ENOMEM; in truncate_data_node()
1496 dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ; in truncate_data_node()
1497 data_size = dn_size - UBIFS_DATA_NODE_SZ; in truncate_data_node()
1498 compr_type = le16_to_cpu(dn->compr_type); in truncate_data_node()
1509 err = ubifs_decompress(c, &dn->data, dlen, buf, &out_len, compr_type); in truncate_data_node()
1513 ubifs_compress(c, buf, *new_len, &dn->data, &out_len, &compr_type); in truncate_data_node()
1523 dn->compr_size = 0; in truncate_data_node()
1527 dn->compr_type = cpu_to_le16(compr_type); in truncate_data_node()
1528 dn->size = cpu_to_le32(*new_len); in truncate_data_node()
1537 * ubifs_jnl_truncate - update the journal for a truncation.
1538 * @c: UBIFS file-system description object
1544 * written, the journal tree is updated, and the last data block is re-written
1558 int err, dlen, len, lnum, offs, bit, sz, sync = IS_SYNC(inode); in ubifs_jnl_truncate() local
1561 ino_t inum = inode->i_ino; in ubifs_jnl_truncate()
1566 dbg_jnl("ino %lu, size %lld -> %lld", in ubifs_jnl_truncate()
1568 ubifs_assert(c, !ui->data_len); in ubifs_jnl_truncate()
1569 ubifs_assert(c, S_ISREG(inode->i_mode)); in ubifs_jnl_truncate()
1570 ubifs_assert(c, mutex_is_locked(&ui->ui_mutex)); in ubifs_jnl_truncate()
1582 return -ENOMEM; in ubifs_jnl_truncate()
1585 trun->ch.node_type = UBIFS_TRUN_NODE; in ubifs_jnl_truncate()
1586 trun->inum = cpu_to_le32(inum); in ubifs_jnl_truncate()
1587 trun->old_size = cpu_to_le64(old_size); in ubifs_jnl_truncate()
1588 trun->new_size = cpu_to_le64(new_size); in ubifs_jnl_truncate()
1591 dlen = new_size & (UBIFS_BLOCK_SIZE - 1); in ubifs_jnl_truncate()
1599 if (err == -ENOENT) in ubifs_jnl_truncate()
1604 int dn_len = le32_to_cpu(dn->size); in ubifs_jnl_truncate()
1608 blk, inode->i_ino); in ubifs_jnl_truncate()
1610 err = -EUCLEAN; in ubifs_jnl_truncate()
1650 err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync); in ubifs_jnl_truncate()
1653 if (!sync) in ubifs_jnl_truncate()
1654 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, inum); in ubifs_jnl_truncate()
1675 bit = new_size & (UBIFS_BLOCK_SIZE - 1); in ubifs_jnl_truncate()
1679 bit = old_size & (UBIFS_BLOCK_SIZE - 1); in ubifs_jnl_truncate()
1680 blk = (old_size >> UBIFS_BLOCK_SHIFT) - (bit ? 0 : 1); in ubifs_jnl_truncate()
1688 spin_lock(&ui->ui_lock); in ubifs_jnl_truncate()
1689 ui->synced_i_size = ui->ui_size; in ubifs_jnl_truncate()
1690 spin_unlock(&ui->ui_lock); in ubifs_jnl_truncate()
1707 * ubifs_jnl_delete_xattr - delete an extended attribute.
1708 * @c: UBIFS file-system description object
1714 * un-linking regular files - it writes a deletion xentry, a deletion inode and
1726 int sync = IS_DIRSYNC(host); in ubifs_jnl_delete_xattr() local
1730 ubifs_assert(c, inode->i_nlink == 0); in ubifs_jnl_delete_xattr()
1731 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex)); in ubifs_jnl_delete_xattr()
1739 hlen = host_ui->data_len + UBIFS_INO_NODE_SZ; in ubifs_jnl_delete_xattr()
1746 return -ENOMEM; in ubifs_jnl_delete_xattr()
1755 xent->ch.node_type = UBIFS_XENT_NODE; in ubifs_jnl_delete_xattr()
1756 xent_key_init(c, &xent_key, host->i_ino, nm); in ubifs_jnl_delete_xattr()
1757 key_write(c, &xent_key, xent->key); in ubifs_jnl_delete_xattr()
1758 xent->inum = 0; in ubifs_jnl_delete_xattr()
1759 xent->type = get_dent_type(inode->i_mode); in ubifs_jnl_delete_xattr()
1760 xent->nlen = cpu_to_le16(fname_len(nm)); in ubifs_jnl_delete_xattr()
1761 memcpy(xent->name, fname_name(nm), fname_len(nm)); in ubifs_jnl_delete_xattr()
1762 xent->name[fname_len(nm)] = '\0'; in ubifs_jnl_delete_xattr()
1774 err = write_head(c, BASEHD, xent, write_len, &lnum, &xent_offs, sync); in ubifs_jnl_delete_xattr()
1775 if (!sync && !err) in ubifs_jnl_delete_xattr()
1776 ubifs_wbuf_add_ino_nolock(&c->jheads[BASEHD].wbuf, host->i_ino); in ubifs_jnl_delete_xattr()
1794 * Well, there actually must be only one node - the inode itself. in ubifs_jnl_delete_xattr()
1796 lowest_ino_key(c, &key1, inode->i_ino); in ubifs_jnl_delete_xattr()
1797 highest_ino_key(c, &key2, inode->i_ino); in ubifs_jnl_delete_xattr()
1806 ino_key_init(c, &key1, host->i_ino); in ubifs_jnl_delete_xattr()
1807 err = ubifs_tnc_add(c, &key1, lnum, xent_offs + len - hlen, hlen, hash); in ubifs_jnl_delete_xattr()
1812 spin_lock(&host_ui->ui_lock); in ubifs_jnl_delete_xattr()
1813 host_ui->synced_i_size = host_ui->ui_size; in ubifs_jnl_delete_xattr()
1814 spin_unlock(&host_ui->ui_lock); in ubifs_jnl_delete_xattr()
1828 * ubifs_jnl_change_xattr - change an extended attribute.
1829 * @c: UBIFS file-system description object
1837 * consequently, the write-buffer is synchronized. This function returns zero
1847 int sync = IS_DIRSYNC(host); in ubifs_jnl_change_xattr() local
1851 dbg_jnl("ino %lu, ino %lu", host->i_ino, inode->i_ino); in ubifs_jnl_change_xattr()
1852 ubifs_assert(c, inode->i_nlink > 0); in ubifs_jnl_change_xattr()
1853 ubifs_assert(c, mutex_is_locked(&host_ui->ui_mutex)); in ubifs_jnl_change_xattr()
1855 len1 = UBIFS_INO_NODE_SZ + host_ui->data_len; in ubifs_jnl_change_xattr()
1856 len2 = UBIFS_INO_NODE_SZ + ubifs_inode(inode)->data_len; in ubifs_jnl_change_xattr()
1864 return -ENOMEM; in ubifs_jnl_change_xattr()
1881 if (!sync && !err) { in ubifs_jnl_change_xattr()
1882 struct ubifs_wbuf *wbuf = &c->jheads[BASEHD].wbuf; in ubifs_jnl_change_xattr()
1884 ubifs_wbuf_add_ino_nolock(wbuf, host->i_ino); in ubifs_jnl_change_xattr()
1885 ubifs_wbuf_add_ino_nolock(wbuf, inode->i_ino); in ubifs_jnl_change_xattr()
1893 ino_key_init(c, &key, host->i_ino); in ubifs_jnl_change_xattr()
1898 ino_key_init(c, &key, inode->i_ino); in ubifs_jnl_change_xattr()
1904 spin_lock(&host_ui->ui_lock); in ubifs_jnl_change_xattr()
1905 host_ui->synced_i_size = host_ui->ui_size; in ubifs_jnl_change_xattr()
1906 spin_unlock(&host_ui->ui_lock); in ubifs_jnl_change_xattr()