]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/ubifs/journal.c
UBUNTU: Ubuntu-4.13.0-45.50
[mirror_ubuntu-artful-kernel.git] / fs / ubifs / journal.c
index 294519b98874058ef7ac7e089361733adb9f26de..04c4ec6483e5208b043724a6f8d5fefb85976977 100644 (file)
@@ -549,8 +549,6 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
        struct ubifs_ino_node *ino;
        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));
 
        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 */
        len += host_ui->data_len;
 
-       dent = kmalloc(len, GFP_NOFS);
+       dent = kzalloc(len, GFP_NOFS);
        if (!dent)
                return -ENOMEM;
 
@@ -585,7 +583,10 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
 
        if (!xent) {
                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 {
                dent->ch.node_type = UBIFS_XENT_NODE;
                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);
 
        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)
                        goto out_ro;
                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);
        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(snd_dir)->data_len == 0);
        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)
                len += plen;
 
-       dent1 = kmalloc(len, GFP_NOFS);
+       dent1 = kzalloc(len, GFP_NOFS);
        if (!dent1)
                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));
        memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm));
        dent1->name[fname_len(snd_nm)] = '\0';
+       set_dent_cookie(c, dent1);
        zero_dent_node_unused(dent1);
        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));
        memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm));
        dent2->name[fname_len(fst_nm)] = '\0';
+       set_dent_cookie(c, dent2);
        zero_dent_node_unused(dent2);
        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);
        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(new_dir)->data_len == 0);
        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);
        if (move)
                len += plen;
-       dent = kmalloc(len, GFP_NOFS);
+       dent = kzalloc(len, GFP_NOFS);
        if (!dent)
                return -ENOMEM;
 
@@ -1298,7 +1299,9 @@ static int truncate_data_node(const struct ubifs_info *c, const struct inode *in
                        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);
                if (err)
                        goto out;
@@ -1485,9 +1488,6 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
        int sync = IS_DIRSYNC(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(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;
        len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
 
-       xent = kmalloc(len, GFP_NOFS);
+       xent = kzalloc(len, GFP_NOFS);
        if (!xent)
                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_len = aligned_len1 + ALIGN(len2, 8);
 
-       ino = kmalloc(aligned_len, GFP_NOFS);
+       ino = kzalloc(aligned_len, GFP_NOFS);
        if (!ino)
                return -ENOMEM;