Loading fs/ubifs/dir.c +15 −28 Original line number Original line Diff line number Diff line Loading @@ -214,7 +214,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, int err; int err; union ubifs_key key; union ubifs_key key; struct inode *inode = NULL; struct inode *inode = NULL; struct ubifs_dent_node *dent; struct ubifs_dent_node *dent = NULL; struct ubifs_info *c = dir->i_sb->s_fs_info; struct ubifs_info *c = dir->i_sb->s_fs_info; struct fscrypt_name nm; struct fscrypt_name nm; Loading @@ -229,14 +229,14 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, return ERR_PTR(err); return ERR_PTR(err); if (fname_len(&nm) > UBIFS_MAX_NLEN) { if (fname_len(&nm) > UBIFS_MAX_NLEN) { err = -ENAMETOOLONG; inode = ERR_PTR(-ENAMETOOLONG); goto out_fname; goto done; } } dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS); dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS); if (!dent) { if (!dent) { err = -ENOMEM; inode = ERR_PTR(-ENOMEM); goto out_fname; goto done; } } if (nm.hash) { if (nm.hash) { Loading @@ -250,16 +250,16 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, } } if (err) { if (err) { if (err == -ENOENT) { if (err == -ENOENT) dbg_gen("not found"); dbg_gen("not found"); else inode = ERR_PTR(err); goto done; goto done; } } goto out_dent; } if (dbg_check_name(c, dent, &nm)) { if (dbg_check_name(c, dent, &nm)) { err = -EINVAL; inode = ERR_PTR(-EINVAL); goto out_dent; goto done; } } inode = ubifs_iget(dir->i_sb, le64_to_cpu(dent->inum)); inode = ubifs_iget(dir->i_sb, le64_to_cpu(dent->inum)); Loading @@ -272,7 +272,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, ubifs_err(c, "dead directory entry '%pd', error %d", ubifs_err(c, "dead directory entry '%pd', error %d", dentry, err); dentry, err); ubifs_ro_mode(c, err); ubifs_ro_mode(c, err); goto out_dent; goto done; } } if (ubifs_crypt_is_encrypted(dir) && if (ubifs_crypt_is_encrypted(dir) && Loading @@ -280,27 +280,14 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, !fscrypt_has_permitted_context(dir, inode)) { !fscrypt_has_permitted_context(dir, inode)) { ubifs_warn(c, "Inconsistent encryption contexts: %lu/%lu", ubifs_warn(c, "Inconsistent encryption contexts: %lu/%lu", dir->i_ino, inode->i_ino); dir->i_ino, inode->i_ino); err = -EPERM; iput(inode); goto out_inode; inode = ERR_PTR(-EPERM); } } done: done: kfree(dent); kfree(dent); fscrypt_free_filename(&nm); fscrypt_free_filename(&nm); /* return d_splice_alias(inode, dentry); * Note, d_splice_alias() would be required instead if we supported * NFS. */ d_add(dentry, inode); return NULL; out_inode: iput(inode); out_dent: kfree(dent); out_fname: fscrypt_free_filename(&nm); return ERR_PTR(err); } } static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode, static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode, Loading Loading
fs/ubifs/dir.c +15 −28 Original line number Original line Diff line number Diff line Loading @@ -214,7 +214,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, int err; int err; union ubifs_key key; union ubifs_key key; struct inode *inode = NULL; struct inode *inode = NULL; struct ubifs_dent_node *dent; struct ubifs_dent_node *dent = NULL; struct ubifs_info *c = dir->i_sb->s_fs_info; struct ubifs_info *c = dir->i_sb->s_fs_info; struct fscrypt_name nm; struct fscrypt_name nm; Loading @@ -229,14 +229,14 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, return ERR_PTR(err); return ERR_PTR(err); if (fname_len(&nm) > UBIFS_MAX_NLEN) { if (fname_len(&nm) > UBIFS_MAX_NLEN) { err = -ENAMETOOLONG; inode = ERR_PTR(-ENAMETOOLONG); goto out_fname; goto done; } } dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS); dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS); if (!dent) { if (!dent) { err = -ENOMEM; inode = ERR_PTR(-ENOMEM); goto out_fname; goto done; } } if (nm.hash) { if (nm.hash) { Loading @@ -250,16 +250,16 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, } } if (err) { if (err) { if (err == -ENOENT) { if (err == -ENOENT) dbg_gen("not found"); dbg_gen("not found"); else inode = ERR_PTR(err); goto done; goto done; } } goto out_dent; } if (dbg_check_name(c, dent, &nm)) { if (dbg_check_name(c, dent, &nm)) { err = -EINVAL; inode = ERR_PTR(-EINVAL); goto out_dent; goto done; } } inode = ubifs_iget(dir->i_sb, le64_to_cpu(dent->inum)); inode = ubifs_iget(dir->i_sb, le64_to_cpu(dent->inum)); Loading @@ -272,7 +272,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, ubifs_err(c, "dead directory entry '%pd', error %d", ubifs_err(c, "dead directory entry '%pd', error %d", dentry, err); dentry, err); ubifs_ro_mode(c, err); ubifs_ro_mode(c, err); goto out_dent; goto done; } } if (ubifs_crypt_is_encrypted(dir) && if (ubifs_crypt_is_encrypted(dir) && Loading @@ -280,27 +280,14 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, !fscrypt_has_permitted_context(dir, inode)) { !fscrypt_has_permitted_context(dir, inode)) { ubifs_warn(c, "Inconsistent encryption contexts: %lu/%lu", ubifs_warn(c, "Inconsistent encryption contexts: %lu/%lu", dir->i_ino, inode->i_ino); dir->i_ino, inode->i_ino); err = -EPERM; iput(inode); goto out_inode; inode = ERR_PTR(-EPERM); } } done: done: kfree(dent); kfree(dent); fscrypt_free_filename(&nm); fscrypt_free_filename(&nm); /* return d_splice_alias(inode, dentry); * Note, d_splice_alias() would be required instead if we supported * NFS. */ d_add(dentry, inode); return NULL; out_inode: iput(inode); out_dent: kfree(dent); out_fname: fscrypt_free_filename(&nm); return ERR_PTR(err); } } static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode, static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode, Loading