|
@@ -549,8 +549,6 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
|
struct ubifs_ino_node *ino;
|
|
struct ubifs_ino_node *ino;
|
|
union ubifs_key dent_key, ino_key;
|
|
union ubifs_key dent_key, ino_key;
|
|
|
|
|
|
- //dbg_jnl("ino %lu, dent '%.*s', data len %d in dir ino %lu",
|
|
|
|
- // inode->i_ino, nm->len, nm->name, ui->data_len, dir->i_ino);
|
|
|
|
ubifs_assert(mutex_is_locked(&host_ui->ui_mutex));
|
|
ubifs_assert(mutex_is_locked(&host_ui->ui_mutex));
|
|
|
|
|
|
dlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
|
|
dlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
|
|
@@ -574,7 +572,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
|
/* Make sure to also account for extended attributes */
|
|
/* Make sure to also account for extended attributes */
|
|
len += host_ui->data_len;
|
|
len += host_ui->data_len;
|
|
|
|
|
|
- dent = kmalloc(len, GFP_NOFS);
|
|
|
|
|
|
+ dent = kzalloc(len, GFP_NOFS);
|
|
if (!dent)
|
|
if (!dent)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -585,7 +583,10 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
|
|
|
|
|
if (!xent) {
|
|
if (!xent) {
|
|
dent->ch.node_type = UBIFS_DENT_NODE;
|
|
dent->ch.node_type = UBIFS_DENT_NODE;
|
|
- dent_key_init(c, &dent_key, dir->i_ino, nm);
|
|
|
|
|
|
+ if (nm->hash)
|
|
|
|
+ dent_key_init_hash(c, &dent_key, dir->i_ino, nm->hash);
|
|
|
|
+ else
|
|
|
|
+ dent_key_init(c, &dent_key, dir->i_ino, nm);
|
|
} else {
|
|
} else {
|
|
dent->ch.node_type = UBIFS_XENT_NODE;
|
|
dent->ch.node_type = UBIFS_XENT_NODE;
|
|
xent_key_init(c, &dent_key, dir->i_ino, nm);
|
|
xent_key_init(c, &dent_key, dir->i_ino, nm);
|
|
@@ -629,7 +630,10 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
|
kfree(dent);
|
|
kfree(dent);
|
|
|
|
|
|
if (deletion) {
|
|
if (deletion) {
|
|
- err = ubifs_tnc_remove_nm(c, &dent_key, nm);
|
|
|
|
|
|
+ if (nm->hash)
|
|
|
|
+ err = ubifs_tnc_remove_dh(c, &dent_key, nm->minor_hash);
|
|
|
|
+ else
|
|
|
|
+ err = ubifs_tnc_remove_nm(c, &dent_key, nm);
|
|
if (err)
|
|
if (err)
|
|
goto out_ro;
|
|
goto out_ro;
|
|
err = ubifs_add_dirt(c, lnum, dlen);
|
|
err = ubifs_add_dirt(c, lnum, dlen);
|
|
@@ -950,9 +954,6 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
|
int twoparents = (fst_dir != snd_dir);
|
|
int twoparents = (fst_dir != snd_dir);
|
|
void *p;
|
|
void *p;
|
|
|
|
|
|
- //dbg_jnl("dent '%pd' in dir ino %lu between dent '%pd' in dir ino %lu",
|
|
|
|
- // fst_dentry, fst_dir->i_ino, snd_dentry, snd_dir->i_ino);
|
|
|
|
-
|
|
|
|
ubifs_assert(ubifs_inode(fst_dir)->data_len == 0);
|
|
ubifs_assert(ubifs_inode(fst_dir)->data_len == 0);
|
|
ubifs_assert(ubifs_inode(snd_dir)->data_len == 0);
|
|
ubifs_assert(ubifs_inode(snd_dir)->data_len == 0);
|
|
ubifs_assert(mutex_is_locked(&ubifs_inode(fst_dir)->ui_mutex));
|
|
ubifs_assert(mutex_is_locked(&ubifs_inode(fst_dir)->ui_mutex));
|
|
@@ -967,7 +968,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
|
if (twoparents)
|
|
if (twoparents)
|
|
len += plen;
|
|
len += plen;
|
|
|
|
|
|
- dent1 = kmalloc(len, GFP_NOFS);
|
|
|
|
|
|
+ dent1 = kzalloc(len, GFP_NOFS);
|
|
if (!dent1)
|
|
if (!dent1)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -984,6 +985,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
|
dent1->nlen = cpu_to_le16(fname_len(snd_nm));
|
|
dent1->nlen = cpu_to_le16(fname_len(snd_nm));
|
|
memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm));
|
|
memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm));
|
|
dent1->name[fname_len(snd_nm)] = '\0';
|
|
dent1->name[fname_len(snd_nm)] = '\0';
|
|
|
|
+ set_dent_cookie(c, dent1);
|
|
zero_dent_node_unused(dent1);
|
|
zero_dent_node_unused(dent1);
|
|
ubifs_prep_grp_node(c, dent1, dlen1, 0);
|
|
ubifs_prep_grp_node(c, dent1, dlen1, 0);
|
|
|
|
|
|
@@ -996,6 +998,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
|
dent2->nlen = cpu_to_le16(fname_len(fst_nm));
|
|
dent2->nlen = cpu_to_le16(fname_len(fst_nm));
|
|
memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm));
|
|
memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm));
|
|
dent2->name[fname_len(fst_nm)] = '\0';
|
|
dent2->name[fname_len(fst_nm)] = '\0';
|
|
|
|
+ set_dent_cookie(c, dent2);
|
|
zero_dent_node_unused(dent2);
|
|
zero_dent_node_unused(dent2);
|
|
ubifs_prep_grp_node(c, dent2, dlen2, 0);
|
|
ubifs_prep_grp_node(c, dent2, dlen2, 0);
|
|
|
|
|
|
@@ -1094,8 +1097,6 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
|
int move = (old_dir != new_dir);
|
|
int move = (old_dir != new_dir);
|
|
struct ubifs_inode *uninitialized_var(new_ui);
|
|
struct ubifs_inode *uninitialized_var(new_ui);
|
|
|
|
|
|
- //dbg_jnl("dent '%pd' in dir ino %lu to dent '%pd' in dir ino %lu",
|
|
|
|
- // old_dentry, old_dir->i_ino, new_dentry, new_dir->i_ino);
|
|
|
|
ubifs_assert(ubifs_inode(old_dir)->data_len == 0);
|
|
ubifs_assert(ubifs_inode(old_dir)->data_len == 0);
|
|
ubifs_assert(ubifs_inode(new_dir)->data_len == 0);
|
|
ubifs_assert(ubifs_inode(new_dir)->data_len == 0);
|
|
ubifs_assert(mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex));
|
|
ubifs_assert(mutex_is_locked(&ubifs_inode(old_dir)->ui_mutex));
|
|
@@ -1117,7 +1118,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
|
len = aligned_dlen1 + aligned_dlen2 + ALIGN(ilen, 8) + ALIGN(plen, 8);
|
|
len = aligned_dlen1 + aligned_dlen2 + ALIGN(ilen, 8) + ALIGN(plen, 8);
|
|
if (move)
|
|
if (move)
|
|
len += plen;
|
|
len += plen;
|
|
- dent = kmalloc(len, GFP_NOFS);
|
|
|
|
|
|
+ dent = kzalloc(len, GFP_NOFS);
|
|
if (!dent)
|
|
if (!dent)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -1298,7 +1299,9 @@ static int truncate_data_node(const struct ubifs_info *c, const struct inode *in
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
- if (compr_type != UBIFS_COMPR_NONE) {
|
|
|
|
|
|
+ if (compr_type == UBIFS_COMPR_NONE) {
|
|
|
|
+ out_len = *new_len;
|
|
|
|
+ } else {
|
|
err = ubifs_decompress(c, &dn->data, dlen, buf, &out_len, compr_type);
|
|
err = ubifs_decompress(c, &dn->data, dlen, buf, &out_len, compr_type);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
@@ -1485,9 +1488,6 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
|
int sync = IS_DIRSYNC(host);
|
|
int sync = IS_DIRSYNC(host);
|
|
struct ubifs_inode *host_ui = ubifs_inode(host);
|
|
struct ubifs_inode *host_ui = ubifs_inode(host);
|
|
|
|
|
|
- //dbg_jnl("host %lu, xattr ino %lu, name '%s', data len %d",
|
|
|
|
- // host->i_ino, inode->i_ino, nm->name,
|
|
|
|
- // ubifs_inode(inode)->data_len);
|
|
|
|
ubifs_assert(inode->i_nlink == 0);
|
|
ubifs_assert(inode->i_nlink == 0);
|
|
ubifs_assert(mutex_is_locked(&host_ui->ui_mutex));
|
|
ubifs_assert(mutex_is_locked(&host_ui->ui_mutex));
|
|
|
|
|
|
@@ -1500,7 +1500,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
|
hlen = host_ui->data_len + UBIFS_INO_NODE_SZ;
|
|
hlen = host_ui->data_len + UBIFS_INO_NODE_SZ;
|
|
len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
|
|
len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
|
|
|
|
|
|
- xent = kmalloc(len, GFP_NOFS);
|
|
|
|
|
|
+ xent = kzalloc(len, GFP_NOFS);
|
|
if (!xent)
|
|
if (!xent)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -1607,7 +1607,7 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode,
|
|
aligned_len1 = ALIGN(len1, 8);
|
|
aligned_len1 = ALIGN(len1, 8);
|
|
aligned_len = aligned_len1 + ALIGN(len2, 8);
|
|
aligned_len = aligned_len1 + ALIGN(len2, 8);
|
|
|
|
|
|
- ino = kmalloc(aligned_len, GFP_NOFS);
|
|
|
|
|
|
+ ino = kzalloc(aligned_len, GFP_NOFS);
|
|
if (!ino)
|
|
if (!ino)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|