mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
ubifs: Implement encrypted filenames
Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: David Gstir <david@sigma-star.at> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
+7
-7
@@ -233,7 +233,7 @@ static void dump_ch(const struct ubifs_ch *ch)
|
|||||||
void ubifs_dump_inode(struct ubifs_info *c, const struct inode *inode)
|
void ubifs_dump_inode(struct ubifs_info *c, const struct inode *inode)
|
||||||
{
|
{
|
||||||
const struct ubifs_inode *ui = ubifs_inode(inode);
|
const struct ubifs_inode *ui = ubifs_inode(inode);
|
||||||
struct qstr nm = { .name = NULL };
|
struct fscrypt_name nm = {0};
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
struct ubifs_dent_node *dent, *pdent = NULL;
|
struct ubifs_dent_node *dent, *pdent = NULL;
|
||||||
int count = 2;
|
int count = 2;
|
||||||
@@ -289,8 +289,8 @@ void ubifs_dump_inode(struct ubifs_info *c, const struct inode *inode)
|
|||||||
pr_err("\t%d: %s (%s)\n",
|
pr_err("\t%d: %s (%s)\n",
|
||||||
count++, dent->name, get_dent_type(dent->type));
|
count++, dent->name, get_dent_type(dent->type));
|
||||||
|
|
||||||
nm.name = dent->name;
|
fname_name(&nm) = dent->name;
|
||||||
nm.len = le16_to_cpu(dent->nlen);
|
fname_len(&nm) = le16_to_cpu(dent->nlen);
|
||||||
kfree(pdent);
|
kfree(pdent);
|
||||||
pdent = dent;
|
pdent = dent;
|
||||||
key_read(c, &dent->key, &key);
|
key_read(c, &dent->key, &key);
|
||||||
@@ -1107,7 +1107,7 @@ int dbg_check_dir(struct ubifs_info *c, const struct inode *dir)
|
|||||||
unsigned int nlink = 2;
|
unsigned int nlink = 2;
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
struct ubifs_dent_node *dent, *pdent = NULL;
|
struct ubifs_dent_node *dent, *pdent = NULL;
|
||||||
struct qstr nm = { .name = NULL };
|
struct fscrypt_name nm = {0};
|
||||||
loff_t size = UBIFS_INO_NODE_SZ;
|
loff_t size = UBIFS_INO_NODE_SZ;
|
||||||
|
|
||||||
if (!dbg_is_chk_gen(c))
|
if (!dbg_is_chk_gen(c))
|
||||||
@@ -1128,9 +1128,9 @@ int dbg_check_dir(struct ubifs_info *c, const struct inode *dir)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
nm.name = dent->name;
|
fname_name(&nm) = dent->name;
|
||||||
nm.len = le16_to_cpu(dent->nlen);
|
fname_len(&nm) = le16_to_cpu(dent->nlen);
|
||||||
size += CALC_DENT_SIZE(nm.len);
|
size += CALC_DENT_SIZE(fname_len(&nm));
|
||||||
if (dent->type == UBIFS_ITYPE_DIR)
|
if (dent->type == UBIFS_ITYPE_DIR)
|
||||||
nlink += 1;
|
nlink += 1;
|
||||||
kfree(pdent);
|
kfree(pdent);
|
||||||
|
|||||||
+265
-58
File diff suppressed because it is too large
Load Diff
+63
-60
@@ -530,7 +530,7 @@ static void mark_inode_clean(struct ubifs_info *c, struct ubifs_inode *ui)
|
|||||||
* success. In case of failure, a negative error code is returned.
|
* success. In case of failure, a negative error code is returned.
|
||||||
*/
|
*/
|
||||||
int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
||||||
const struct qstr *nm, const struct inode *inode,
|
const struct fscrypt_name *nm, const struct inode *inode,
|
||||||
int deletion, int xent)
|
int deletion, int xent)
|
||||||
{
|
{
|
||||||
int err, dlen, ilen, len, lnum, ino_offs, dent_offs;
|
int err, dlen, ilen, len, lnum, ino_offs, dent_offs;
|
||||||
@@ -542,11 +542,11 @@ 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",
|
//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);
|
// 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 + nm->len + 1;
|
dlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
|
||||||
ilen = UBIFS_INO_NODE_SZ;
|
ilen = UBIFS_INO_NODE_SZ;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -587,9 +587,10 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
|||||||
key_write(c, &dent_key, dent->key);
|
key_write(c, &dent_key, dent->key);
|
||||||
dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino);
|
dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino);
|
||||||
dent->type = get_dent_type(inode->i_mode);
|
dent->type = get_dent_type(inode->i_mode);
|
||||||
dent->nlen = cpu_to_le16(nm->len);
|
dent->nlen = cpu_to_le16(fname_len(nm));
|
||||||
memcpy(dent->name, nm->name, nm->len);
|
memcpy(dent->name, fname_name(nm), fname_len(nm));
|
||||||
dent->name[nm->len] = '\0';
|
dent->name[fname_len(nm)] = '\0';
|
||||||
|
|
||||||
zero_dent_node_unused(dent);
|
zero_dent_node_unused(dent);
|
||||||
ubifs_prep_grp_node(c, dent, dlen, 0);
|
ubifs_prep_grp_node(c, dent, dlen, 0);
|
||||||
|
|
||||||
@@ -914,9 +915,11 @@ int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode)
|
|||||||
* ubifs_jnl_xrename - cross rename two directory entries.
|
* ubifs_jnl_xrename - cross rename two directory entries.
|
||||||
* @c: UBIFS file-system description object
|
* @c: UBIFS file-system description object
|
||||||
* @fst_dir: parent inode of 1st directory entry to exchange
|
* @fst_dir: parent inode of 1st directory entry to exchange
|
||||||
* @fst_dentry: 1st directory entry to exchange
|
* @fst_inode: 1st inode to exchange
|
||||||
|
* @fst_nm: name of 1st inode to exchange
|
||||||
* @snd_dir: parent inode of 2nd directory entry to exchange
|
* @snd_dir: parent inode of 2nd directory entry to exchange
|
||||||
* @snd_dentry: 2nd directory entry to exchange
|
* @snd_inode: 2nd inode to exchange
|
||||||
|
* @snd_nm: name of 2nd inode to exchange
|
||||||
* @sync: non-zero if the write-buffer has to be synchronized
|
* @sync: non-zero if the write-buffer has to be synchronized
|
||||||
*
|
*
|
||||||
* This function implements the cross rename operation which may involve
|
* This function implements the cross rename operation which may involve
|
||||||
@@ -925,29 +928,29 @@ int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode)
|
|||||||
* returned.
|
* returned.
|
||||||
*/
|
*/
|
||||||
int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
||||||
const struct dentry *fst_dentry,
|
const struct inode *fst_inode,
|
||||||
|
const struct fscrypt_name *fst_nm,
|
||||||
const struct inode *snd_dir,
|
const struct inode *snd_dir,
|
||||||
const struct dentry *snd_dentry, int sync)
|
const struct inode *snd_inode,
|
||||||
|
const struct fscrypt_name *snd_nm, int sync)
|
||||||
{
|
{
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
struct ubifs_dent_node *dent1, *dent2;
|
struct ubifs_dent_node *dent1, *dent2;
|
||||||
int err, dlen1, dlen2, lnum, offs, len, plen = UBIFS_INO_NODE_SZ;
|
int err, dlen1, dlen2, lnum, offs, len, plen = UBIFS_INO_NODE_SZ;
|
||||||
int aligned_dlen1, aligned_dlen2;
|
int aligned_dlen1, aligned_dlen2;
|
||||||
int twoparents = (fst_dir != snd_dir);
|
int twoparents = (fst_dir != snd_dir);
|
||||||
const struct inode *fst_inode = d_inode(fst_dentry);
|
|
||||||
const struct inode *snd_inode = d_inode(snd_dentry);
|
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
dbg_jnl("dent '%pd' in dir ino %lu between dent '%pd' in dir ino %lu",
|
//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);
|
// 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));
|
||||||
ubifs_assert(mutex_is_locked(&ubifs_inode(snd_dir)->ui_mutex));
|
ubifs_assert(mutex_is_locked(&ubifs_inode(snd_dir)->ui_mutex));
|
||||||
|
|
||||||
dlen1 = UBIFS_DENT_NODE_SZ + snd_dentry->d_name.len + 1;
|
dlen1 = UBIFS_DENT_NODE_SZ + fname_len(snd_nm) + 1;
|
||||||
dlen2 = UBIFS_DENT_NODE_SZ + fst_dentry->d_name.len + 1;
|
dlen2 = UBIFS_DENT_NODE_SZ + fname_len(fst_nm) + 1;
|
||||||
aligned_dlen1 = ALIGN(dlen1, 8);
|
aligned_dlen1 = ALIGN(dlen1, 8);
|
||||||
aligned_dlen2 = ALIGN(dlen2, 8);
|
aligned_dlen2 = ALIGN(dlen2, 8);
|
||||||
|
|
||||||
@@ -966,24 +969,24 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
|||||||
|
|
||||||
/* Make new dent for 1st entry */
|
/* Make new dent for 1st entry */
|
||||||
dent1->ch.node_type = UBIFS_DENT_NODE;
|
dent1->ch.node_type = UBIFS_DENT_NODE;
|
||||||
dent_key_init_flash(c, &dent1->key, snd_dir->i_ino, &snd_dentry->d_name);
|
dent_key_init_flash(c, &dent1->key, snd_dir->i_ino, snd_nm);
|
||||||
dent1->inum = cpu_to_le64(fst_inode->i_ino);
|
dent1->inum = cpu_to_le64(fst_inode->i_ino);
|
||||||
dent1->type = get_dent_type(fst_inode->i_mode);
|
dent1->type = get_dent_type(fst_inode->i_mode);
|
||||||
dent1->nlen = cpu_to_le16(snd_dentry->d_name.len);
|
dent1->nlen = cpu_to_le16(fname_len(snd_nm));
|
||||||
memcpy(dent1->name, snd_dentry->d_name.name, snd_dentry->d_name.len);
|
memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm));
|
||||||
dent1->name[snd_dentry->d_name.len] = '\0';
|
dent1->name[fname_len(snd_nm)] = '\0';
|
||||||
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);
|
||||||
|
|
||||||
/* Make new dent for 2nd entry */
|
/* Make new dent for 2nd entry */
|
||||||
dent2 = (void *)dent1 + aligned_dlen1;
|
dent2 = (void *)dent1 + aligned_dlen1;
|
||||||
dent2->ch.node_type = UBIFS_DENT_NODE;
|
dent2->ch.node_type = UBIFS_DENT_NODE;
|
||||||
dent_key_init_flash(c, &dent2->key, fst_dir->i_ino, &fst_dentry->d_name);
|
dent_key_init_flash(c, &dent2->key, fst_dir->i_ino, fst_nm);
|
||||||
dent2->inum = cpu_to_le64(snd_inode->i_ino);
|
dent2->inum = cpu_to_le64(snd_inode->i_ino);
|
||||||
dent2->type = get_dent_type(snd_inode->i_mode);
|
dent2->type = get_dent_type(snd_inode->i_mode);
|
||||||
dent2->nlen = cpu_to_le16(fst_dentry->d_name.len);
|
dent2->nlen = cpu_to_le16(fname_len(fst_nm));
|
||||||
memcpy(dent2->name, fst_dentry->d_name.name, fst_dentry->d_name.len);
|
memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm));
|
||||||
dent2->name[fst_dentry->d_name.len] = '\0';
|
dent2->name[fname_len(fst_nm)] = '\0';
|
||||||
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);
|
||||||
|
|
||||||
@@ -1007,14 +1010,14 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
|||||||
}
|
}
|
||||||
release_head(c, BASEHD);
|
release_head(c, BASEHD);
|
||||||
|
|
||||||
dent_key_init(c, &key, snd_dir->i_ino, &snd_dentry->d_name);
|
dent_key_init(c, &key, snd_dir->i_ino, snd_nm);
|
||||||
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, &snd_dentry->d_name);
|
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, snd_nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_ro;
|
goto out_ro;
|
||||||
|
|
||||||
offs += aligned_dlen1;
|
offs += aligned_dlen1;
|
||||||
dent_key_init(c, &key, fst_dir->i_ino, &fst_dentry->d_name);
|
dent_key_init(c, &key, fst_dir->i_ino, fst_nm);
|
||||||
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, &fst_dentry->d_name);
|
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, fst_nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_ro;
|
goto out_ro;
|
||||||
|
|
||||||
@@ -1066,31 +1069,31 @@ out_free:
|
|||||||
* returned.
|
* returned.
|
||||||
*/
|
*/
|
||||||
int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
||||||
const struct dentry *old_dentry,
|
const struct inode *old_inode,
|
||||||
|
const struct fscrypt_name *old_nm,
|
||||||
const struct inode *new_dir,
|
const struct inode *new_dir,
|
||||||
const struct dentry *new_dentry,
|
const struct inode *new_inode,
|
||||||
|
const struct fscrypt_name *new_nm,
|
||||||
const struct inode *whiteout, int sync)
|
const struct inode *whiteout, int sync)
|
||||||
{
|
{
|
||||||
void *p;
|
void *p;
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
struct ubifs_dent_node *dent, *dent2;
|
struct ubifs_dent_node *dent, *dent2;
|
||||||
int err, dlen1, dlen2, ilen, lnum, offs, len;
|
int err, dlen1, dlen2, ilen, lnum, offs, len;
|
||||||
const struct inode *old_inode = d_inode(old_dentry);
|
|
||||||
const struct inode *new_inode = d_inode(new_dentry);
|
|
||||||
int aligned_dlen1, aligned_dlen2, plen = UBIFS_INO_NODE_SZ;
|
int aligned_dlen1, aligned_dlen2, plen = UBIFS_INO_NODE_SZ;
|
||||||
int last_reference = !!(new_inode && new_inode->i_nlink == 0);
|
int last_reference = !!(new_inode && new_inode->i_nlink == 0);
|
||||||
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",
|
//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);
|
// 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));
|
||||||
ubifs_assert(mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex));
|
ubifs_assert(mutex_is_locked(&ubifs_inode(new_dir)->ui_mutex));
|
||||||
|
|
||||||
dlen1 = UBIFS_DENT_NODE_SZ + new_dentry->d_name.len + 1;
|
dlen1 = UBIFS_DENT_NODE_SZ + fname_len(new_nm) + 1;
|
||||||
dlen2 = UBIFS_DENT_NODE_SZ + old_dentry->d_name.len + 1;
|
dlen2 = UBIFS_DENT_NODE_SZ + fname_len(old_nm) + 1;
|
||||||
if (new_inode) {
|
if (new_inode) {
|
||||||
new_ui = ubifs_inode(new_inode);
|
new_ui = ubifs_inode(new_inode);
|
||||||
ubifs_assert(mutex_is_locked(&new_ui->ui_mutex));
|
ubifs_assert(mutex_is_locked(&new_ui->ui_mutex));
|
||||||
@@ -1116,19 +1119,18 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
|||||||
|
|
||||||
/* Make new dent */
|
/* Make new dent */
|
||||||
dent->ch.node_type = UBIFS_DENT_NODE;
|
dent->ch.node_type = UBIFS_DENT_NODE;
|
||||||
dent_key_init_flash(c, &dent->key, new_dir->i_ino, &new_dentry->d_name);
|
dent_key_init_flash(c, &dent->key, new_dir->i_ino, new_nm);
|
||||||
dent->inum = cpu_to_le64(old_inode->i_ino);
|
dent->inum = cpu_to_le64(old_inode->i_ino);
|
||||||
dent->type = get_dent_type(old_inode->i_mode);
|
dent->type = get_dent_type(old_inode->i_mode);
|
||||||
dent->nlen = cpu_to_le16(new_dentry->d_name.len);
|
dent->nlen = cpu_to_le16(fname_len(new_nm));
|
||||||
memcpy(dent->name, new_dentry->d_name.name, new_dentry->d_name.len);
|
memcpy(dent->name, fname_name(new_nm), fname_len(new_nm));
|
||||||
dent->name[new_dentry->d_name.len] = '\0';
|
dent->name[fname_len(new_nm)] = '\0';
|
||||||
zero_dent_node_unused(dent);
|
zero_dent_node_unused(dent);
|
||||||
ubifs_prep_grp_node(c, dent, dlen1, 0);
|
ubifs_prep_grp_node(c, dent, dlen1, 0);
|
||||||
|
|
||||||
dent2 = (void *)dent + aligned_dlen1;
|
dent2 = (void *)dent + aligned_dlen1;
|
||||||
dent2->ch.node_type = UBIFS_DENT_NODE;
|
dent2->ch.node_type = UBIFS_DENT_NODE;
|
||||||
dent_key_init_flash(c, &dent2->key, old_dir->i_ino,
|
dent_key_init_flash(c, &dent2->key, old_dir->i_ino, old_nm);
|
||||||
&old_dentry->d_name);
|
|
||||||
|
|
||||||
if (whiteout) {
|
if (whiteout) {
|
||||||
dent2->inum = cpu_to_le64(whiteout->i_ino);
|
dent2->inum = cpu_to_le64(whiteout->i_ino);
|
||||||
@@ -1138,9 +1140,9 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
|||||||
dent2->inum = 0;
|
dent2->inum = 0;
|
||||||
dent2->type = DT_UNKNOWN;
|
dent2->type = DT_UNKNOWN;
|
||||||
}
|
}
|
||||||
dent2->nlen = cpu_to_le16(old_dentry->d_name.len);
|
dent2->nlen = cpu_to_le16(fname_len(old_nm));
|
||||||
memcpy(dent2->name, old_dentry->d_name.name, old_dentry->d_name.len);
|
memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm));
|
||||||
dent2->name[old_dentry->d_name.len] = '\0';
|
dent2->name[fname_len(old_nm)] = '\0';
|
||||||
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);
|
||||||
|
|
||||||
@@ -1181,15 +1183,15 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
|||||||
}
|
}
|
||||||
release_head(c, BASEHD);
|
release_head(c, BASEHD);
|
||||||
|
|
||||||
dent_key_init(c, &key, new_dir->i_ino, &new_dentry->d_name);
|
dent_key_init(c, &key, new_dir->i_ino, new_nm);
|
||||||
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, &new_dentry->d_name);
|
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen1, new_nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_ro;
|
goto out_ro;
|
||||||
|
|
||||||
offs += aligned_dlen1;
|
offs += aligned_dlen1;
|
||||||
if (whiteout) {
|
if (whiteout) {
|
||||||
dent_key_init(c, &key, old_dir->i_ino, &old_dentry->d_name);
|
dent_key_init(c, &key, old_dir->i_ino, old_nm);
|
||||||
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, &old_dentry->d_name);
|
err = ubifs_tnc_add_nm(c, &key, lnum, offs, dlen2, old_nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_ro;
|
goto out_ro;
|
||||||
|
|
||||||
@@ -1199,8 +1201,8 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
|||||||
if (err)
|
if (err)
|
||||||
goto out_ro;
|
goto out_ro;
|
||||||
|
|
||||||
dent_key_init(c, &key, old_dir->i_ino, &old_dentry->d_name);
|
dent_key_init(c, &key, old_dir->i_ino, old_nm);
|
||||||
err = ubifs_tnc_remove_nm(c, &key, &old_dentry->d_name);
|
err = ubifs_tnc_remove_nm(c, &key, old_nm);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_ro;
|
goto out_ro;
|
||||||
}
|
}
|
||||||
@@ -1461,7 +1463,8 @@ out_free:
|
|||||||
* error code in case of failure.
|
* error code in case of failure.
|
||||||
*/
|
*/
|
||||||
int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
||||||
const struct inode *inode, const struct qstr *nm)
|
const struct inode *inode,
|
||||||
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int err, xlen, hlen, len, lnum, xent_offs, aligned_xlen;
|
int err, xlen, hlen, len, lnum, xent_offs, aligned_xlen;
|
||||||
struct ubifs_dent_node *xent;
|
struct ubifs_dent_node *xent;
|
||||||
@@ -1470,9 +1473,9 @@ 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",
|
//dbg_jnl("host %lu, xattr ino %lu, name '%s', data len %d",
|
||||||
host->i_ino, inode->i_ino, nm->name,
|
// host->i_ino, inode->i_ino, nm->name,
|
||||||
ubifs_inode(inode)->data_len);
|
// 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));
|
||||||
|
|
||||||
@@ -1480,7 +1483,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
|||||||
* Since we are deleting the inode, we do not bother to attach any data
|
* Since we are deleting the inode, we do not bother to attach any data
|
||||||
* to it and assume its length is %UBIFS_INO_NODE_SZ.
|
* to it and assume its length is %UBIFS_INO_NODE_SZ.
|
||||||
*/
|
*/
|
||||||
xlen = UBIFS_DENT_NODE_SZ + nm->len + 1;
|
xlen = UBIFS_DENT_NODE_SZ + fname_len(nm) + 1;
|
||||||
aligned_xlen = ALIGN(xlen, 8);
|
aligned_xlen = ALIGN(xlen, 8);
|
||||||
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);
|
||||||
@@ -1501,9 +1504,9 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
|||||||
key_write(c, &xent_key, xent->key);
|
key_write(c, &xent_key, xent->key);
|
||||||
xent->inum = 0;
|
xent->inum = 0;
|
||||||
xent->type = get_dent_type(inode->i_mode);
|
xent->type = get_dent_type(inode->i_mode);
|
||||||
xent->nlen = cpu_to_le16(nm->len);
|
xent->nlen = cpu_to_le16(fname_len(nm));
|
||||||
memcpy(xent->name, nm->name, nm->len);
|
memcpy(xent->name, fname_name(nm), fname_len(nm));
|
||||||
xent->name[nm->len] = '\0';
|
xent->name[fname_len(nm)] = '\0';
|
||||||
zero_dent_node_unused(xent);
|
zero_dent_node_unused(xent);
|
||||||
ubifs_prep_grp_node(c, xent, xlen, 0);
|
ubifs_prep_grp_node(c, xent, xlen, 0);
|
||||||
|
|
||||||
|
|||||||
+10
-9
@@ -153,13 +153,13 @@ static inline void highest_ino_key(const struct ubifs_info *c,
|
|||||||
* @c: UBIFS file-system description object
|
* @c: UBIFS file-system description object
|
||||||
* @key: key to initialize
|
* @key: key to initialize
|
||||||
* @inum: parent inode number
|
* @inum: parent inode number
|
||||||
* @nm: direntry name and length
|
* @nm: direntry name and length. Not a string when encrypted!
|
||||||
*/
|
*/
|
||||||
static inline void dent_key_init(const struct ubifs_info *c,
|
static inline void dent_key_init(const struct ubifs_info *c,
|
||||||
union ubifs_key *key, ino_t inum,
|
union ubifs_key *key, ino_t inum,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
uint32_t hash = c->key_hash(nm->name, nm->len);
|
uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
|
||||||
|
|
||||||
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
||||||
key->u32[0] = inum;
|
key->u32[0] = inum;
|
||||||
@@ -191,10 +191,11 @@ static inline void dent_key_init_hash(const struct ubifs_info *c,
|
|||||||
* @nm: direntry name and length
|
* @nm: direntry name and length
|
||||||
*/
|
*/
|
||||||
static inline void dent_key_init_flash(const struct ubifs_info *c, void *k,
|
static inline void dent_key_init_flash(const struct ubifs_info *c, void *k,
|
||||||
ino_t inum, const struct qstr *nm)
|
ino_t inum,
|
||||||
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
union ubifs_key *key = k;
|
union ubifs_key *key = k;
|
||||||
uint32_t hash = c->key_hash(nm->name, nm->len);
|
uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
|
||||||
|
|
||||||
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
||||||
key->j32[0] = cpu_to_le32(inum);
|
key->j32[0] = cpu_to_le32(inum);
|
||||||
@@ -225,9 +226,9 @@ static inline void lowest_dent_key(const struct ubifs_info *c,
|
|||||||
*/
|
*/
|
||||||
static inline void xent_key_init(const struct ubifs_info *c,
|
static inline void xent_key_init(const struct ubifs_info *c,
|
||||||
union ubifs_key *key, ino_t inum,
|
union ubifs_key *key, ino_t inum,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
uint32_t hash = c->key_hash(nm->name, nm->len);
|
uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
|
||||||
|
|
||||||
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
||||||
key->u32[0] = inum;
|
key->u32[0] = inum;
|
||||||
@@ -242,10 +243,10 @@ static inline void xent_key_init(const struct ubifs_info *c,
|
|||||||
* @nm: extended attribute entry name and length
|
* @nm: extended attribute entry name and length
|
||||||
*/
|
*/
|
||||||
static inline void xent_key_init_flash(const struct ubifs_info *c, void *k,
|
static inline void xent_key_init_flash(const struct ubifs_info *c, void *k,
|
||||||
ino_t inum, const struct qstr *nm)
|
ino_t inum, const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
union ubifs_key *key = k;
|
union ubifs_key *key = k;
|
||||||
uint32_t hash = c->key_hash(nm->name, nm->len);
|
uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
|
||||||
|
|
||||||
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
|
||||||
key->j32[0] = cpu_to_le32(inum);
|
key->j32[0] = cpu_to_le32(inum);
|
||||||
|
|||||||
+4
-4
@@ -61,7 +61,7 @@ struct replay_entry {
|
|||||||
struct list_head list;
|
struct list_head list;
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
union {
|
union {
|
||||||
struct qstr nm;
|
struct fscrypt_name nm;
|
||||||
struct {
|
struct {
|
||||||
loff_t old_size;
|
loff_t old_size;
|
||||||
loff_t new_size;
|
loff_t new_size;
|
||||||
@@ -327,7 +327,7 @@ static void destroy_replay_list(struct ubifs_info *c)
|
|||||||
|
|
||||||
list_for_each_entry_safe(r, tmp, &c->replay_list, list) {
|
list_for_each_entry_safe(r, tmp, &c->replay_list, list) {
|
||||||
if (is_hash_key(c, &r->key))
|
if (is_hash_key(c, &r->key))
|
||||||
kfree(r->nm.name);
|
kfree(fname_name(&r->nm));
|
||||||
list_del(&r->list);
|
list_del(&r->list);
|
||||||
kfree(r);
|
kfree(r);
|
||||||
}
|
}
|
||||||
@@ -430,10 +430,10 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len,
|
|||||||
r->deletion = !!deletion;
|
r->deletion = !!deletion;
|
||||||
r->sqnum = sqnum;
|
r->sqnum = sqnum;
|
||||||
key_copy(c, key, &r->key);
|
key_copy(c, key, &r->key);
|
||||||
r->nm.len = nlen;
|
fname_len(&r->nm) = nlen;
|
||||||
memcpy(nbuf, name, nlen);
|
memcpy(nbuf, name, nlen);
|
||||||
nbuf[nlen] = '\0';
|
nbuf[nlen] = '\0';
|
||||||
r->nm.name = nbuf;
|
fname_name(&r->nm) = nbuf;
|
||||||
|
|
||||||
list_add_tail(&r->list, &c->replay_list);
|
list_add_tail(&r->list, &c->replay_list);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+28
-26
@@ -519,7 +519,7 @@ static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
|
|||||||
* of failure, a negative error code is returned.
|
* of failure, a negative error code is returned.
|
||||||
*/
|
*/
|
||||||
static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
struct ubifs_dent_node *dent;
|
struct ubifs_dent_node *dent;
|
||||||
int nlen, err;
|
int nlen, err;
|
||||||
@@ -542,11 +542,11 @@ static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
|||||||
dent = zbr->leaf;
|
dent = zbr->leaf;
|
||||||
|
|
||||||
nlen = le16_to_cpu(dent->nlen);
|
nlen = le16_to_cpu(dent->nlen);
|
||||||
err = memcmp(dent->name, nm->name, min_t(int, nlen, nm->len));
|
err = memcmp(dent->name, fname_name(nm), min_t(int, nlen, fname_len(nm)));
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
if (nlen == nm->len)
|
if (nlen == fname_len(nm))
|
||||||
return NAME_MATCHES;
|
return NAME_MATCHES;
|
||||||
else if (nlen < nm->len)
|
else if (nlen < fname_len(nm))
|
||||||
return NAME_LESS;
|
return NAME_LESS;
|
||||||
else
|
else
|
||||||
return NAME_GREATER;
|
return NAME_GREATER;
|
||||||
@@ -689,7 +689,7 @@ static int tnc_prev(struct ubifs_info *c, struct ubifs_znode **zn, int *n)
|
|||||||
*/
|
*/
|
||||||
static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key,
|
static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
struct ubifs_znode **zn, int *n,
|
struct ubifs_znode **zn, int *n,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -807,7 +807,7 @@ static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key,
|
|||||||
*/
|
*/
|
||||||
static int fallible_matches_name(struct ubifs_info *c,
|
static int fallible_matches_name(struct ubifs_info *c,
|
||||||
struct ubifs_zbranch *zbr,
|
struct ubifs_zbranch *zbr,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
struct ubifs_dent_node *dent;
|
struct ubifs_dent_node *dent;
|
||||||
int nlen, err;
|
int nlen, err;
|
||||||
@@ -835,11 +835,11 @@ static int fallible_matches_name(struct ubifs_info *c,
|
|||||||
dent = zbr->leaf;
|
dent = zbr->leaf;
|
||||||
|
|
||||||
nlen = le16_to_cpu(dent->nlen);
|
nlen = le16_to_cpu(dent->nlen);
|
||||||
err = memcmp(dent->name, nm->name, min_t(int, nlen, nm->len));
|
err = memcmp(dent->name, fname_name(nm), min_t(int, nlen, fname_len(nm)));
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
if (nlen == nm->len)
|
if (nlen == fname_len(nm))
|
||||||
return NAME_MATCHES;
|
return NAME_MATCHES;
|
||||||
else if (nlen < nm->len)
|
else if (nlen < fname_len(nm))
|
||||||
return NAME_LESS;
|
return NAME_LESS;
|
||||||
else
|
else
|
||||||
return NAME_GREATER;
|
return NAME_GREATER;
|
||||||
@@ -878,7 +878,8 @@ out_free:
|
|||||||
static int fallible_resolve_collision(struct ubifs_info *c,
|
static int fallible_resolve_collision(struct ubifs_info *c,
|
||||||
const union ubifs_key *key,
|
const union ubifs_key *key,
|
||||||
struct ubifs_znode **zn, int *n,
|
struct ubifs_znode **zn, int *n,
|
||||||
const struct qstr *nm, int adding)
|
const struct fscrypt_name *nm,
|
||||||
|
int adding)
|
||||||
{
|
{
|
||||||
struct ubifs_znode *o_znode = NULL, *znode = *zn;
|
struct ubifs_znode *o_znode = NULL, *znode = *zn;
|
||||||
int uninitialized_var(o_n), err, cmp, unsure = 0, nn = *n;
|
int uninitialized_var(o_n), err, cmp, unsure = 0, nn = *n;
|
||||||
@@ -1789,12 +1790,12 @@ int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu)
|
|||||||
* was not found, and a negative error code in case of failure.
|
* was not found, and a negative error code in case of failure.
|
||||||
*/
|
*/
|
||||||
static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
void *node, const struct qstr *nm)
|
void *node, const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int found, n, err;
|
int found, n, err;
|
||||||
struct ubifs_znode *znode;
|
struct ubifs_znode *znode;
|
||||||
|
|
||||||
dbg_tnck(key, "name '%.*s' key ", nm->len, nm->name);
|
//dbg_tnck(key, "name '%.*s' key ", nm->len, nm->name);
|
||||||
mutex_lock(&c->tnc_mutex);
|
mutex_lock(&c->tnc_mutex);
|
||||||
found = ubifs_lookup_level0(c, key, &znode, &n);
|
found = ubifs_lookup_level0(c, key, &znode, &n);
|
||||||
if (!found) {
|
if (!found) {
|
||||||
@@ -1837,7 +1838,7 @@ out_unlock:
|
|||||||
* was not found, and a negative error code in case of failure.
|
* was not found, and a negative error code in case of failure.
|
||||||
*/
|
*/
|
||||||
int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
void *node, const struct qstr *nm)
|
void *node, const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int err, len;
|
int err, len;
|
||||||
const struct ubifs_dent_node *dent = node;
|
const struct ubifs_dent_node *dent = node;
|
||||||
@@ -1851,7 +1852,7 @@ int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
len = le16_to_cpu(dent->nlen);
|
len = le16_to_cpu(dent->nlen);
|
||||||
if (nm->len == len && !memcmp(dent->name, nm->name, len))
|
if (fname_len(nm) == len && !memcmp(dent->name, fname_name(nm), len))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2279,14 +2280,15 @@ out_unlock:
|
|||||||
* may have collisions, like directory entry keys.
|
* may have collisions, like directory entry keys.
|
||||||
*/
|
*/
|
||||||
int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
int lnum, int offs, int len, const struct qstr *nm)
|
int lnum, int offs, int len,
|
||||||
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int found, n, err = 0;
|
int found, n, err = 0;
|
||||||
struct ubifs_znode *znode;
|
struct ubifs_znode *znode;
|
||||||
|
|
||||||
mutex_lock(&c->tnc_mutex);
|
mutex_lock(&c->tnc_mutex);
|
||||||
dbg_tnck(key, "LEB %d:%d, name '%.*s', key ",
|
//dbg_tnck(key, "LEB %d:%d, name '%.*s', key ",
|
||||||
lnum, offs, nm->len, nm->name);
|
// lnum, offs, nm->len, nm->name);
|
||||||
found = lookup_level0_dirty(c, key, &znode, &n);
|
found = lookup_level0_dirty(c, key, &znode, &n);
|
||||||
if (found < 0) {
|
if (found < 0) {
|
||||||
err = found;
|
err = found;
|
||||||
@@ -2344,7 +2346,7 @@ int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
|
|||||||
* by passing 'ubifs_tnc_remove_nm()' the same key but
|
* by passing 'ubifs_tnc_remove_nm()' the same key but
|
||||||
* an unmatchable name.
|
* an unmatchable name.
|
||||||
*/
|
*/
|
||||||
struct qstr noname = { .name = "" };
|
struct fscrypt_name noname = { .disk_name = { .name = "", .len = 1 } };
|
||||||
|
|
||||||
err = dbg_check_tnc(c, 0);
|
err = dbg_check_tnc(c, 0);
|
||||||
mutex_unlock(&c->tnc_mutex);
|
mutex_unlock(&c->tnc_mutex);
|
||||||
@@ -2514,13 +2516,13 @@ out_unlock:
|
|||||||
* Returns %0 on success or negative error code on failure.
|
* Returns %0 on success or negative error code on failure.
|
||||||
*/
|
*/
|
||||||
int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int n, err;
|
int n, err;
|
||||||
struct ubifs_znode *znode;
|
struct ubifs_znode *znode;
|
||||||
|
|
||||||
mutex_lock(&c->tnc_mutex);
|
mutex_lock(&c->tnc_mutex);
|
||||||
dbg_tnck(key, "%.*s, key ", nm->len, nm->name);
|
//dbg_tnck(key, "%.*s, key ", nm->len, nm->name);
|
||||||
err = lookup_level0_dirty(c, key, &znode, &n);
|
err = lookup_level0_dirty(c, key, &znode, &n);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
@@ -2669,7 +2671,7 @@ int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
|
|||||||
{
|
{
|
||||||
union ubifs_key key1, key2;
|
union ubifs_key key1, key2;
|
||||||
struct ubifs_dent_node *xent, *pxent = NULL;
|
struct ubifs_dent_node *xent, *pxent = NULL;
|
||||||
struct qstr nm = { .name = NULL };
|
struct fscrypt_name nm = {0};
|
||||||
|
|
||||||
dbg_tnc("ino %lu", (unsigned long)inum);
|
dbg_tnc("ino %lu", (unsigned long)inum);
|
||||||
|
|
||||||
@@ -2694,8 +2696,8 @@ int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
|
|||||||
dbg_tnc("xent '%s', ino %lu", xent->name,
|
dbg_tnc("xent '%s', ino %lu", xent->name,
|
||||||
(unsigned long)xattr_inum);
|
(unsigned long)xattr_inum);
|
||||||
|
|
||||||
nm.name = xent->name;
|
fname_name(&nm) = xent->name;
|
||||||
nm.len = le16_to_cpu(xent->nlen);
|
fname_len(&nm) = le16_to_cpu(xent->nlen);
|
||||||
err = ubifs_tnc_remove_nm(c, &key1, &nm);
|
err = ubifs_tnc_remove_nm(c, &key1, &nm);
|
||||||
if (err) {
|
if (err) {
|
||||||
kfree(xent);
|
kfree(xent);
|
||||||
@@ -2747,7 +2749,7 @@ int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
|
|||||||
*/
|
*/
|
||||||
struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
||||||
union ubifs_key *key,
|
union ubifs_key *key,
|
||||||
const struct qstr *nm)
|
const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int n, err, type = key_type(c, key);
|
int n, err, type = key_type(c, key);
|
||||||
struct ubifs_znode *znode;
|
struct ubifs_znode *znode;
|
||||||
@@ -2755,7 +2757,7 @@ struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
|||||||
struct ubifs_zbranch *zbr;
|
struct ubifs_zbranch *zbr;
|
||||||
union ubifs_key *dkey;
|
union ubifs_key *dkey;
|
||||||
|
|
||||||
dbg_tnck(key, "%s ", nm->name ? (char *)nm->name : "(lowest)");
|
//dbg_tnck(key, "%s ", nm->name ? (char *)nm->name : "(lowest)");
|
||||||
ubifs_assert(is_hash_key(c, key));
|
ubifs_assert(is_hash_key(c, key));
|
||||||
|
|
||||||
mutex_lock(&c->tnc_mutex);
|
mutex_lock(&c->tnc_mutex);
|
||||||
@@ -2763,7 +2765,7 @@ struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
|||||||
if (unlikely(err < 0))
|
if (unlikely(err < 0))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
if (nm->name) {
|
if (fname_len(nm) > 0) {
|
||||||
if (err) {
|
if (err) {
|
||||||
/* Handle collisions */
|
/* Handle collisions */
|
||||||
err = resolve_collision(c, key, &znode, &n, nm);
|
err = resolve_collision(c, key, &znode, &n, nm);
|
||||||
|
|||||||
+14
-10
@@ -1513,25 +1513,29 @@ int ubifs_consolidate_log(struct ubifs_info *c);
|
|||||||
|
|
||||||
/* journal.c */
|
/* journal.c */
|
||||||
int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
|
||||||
const struct qstr *nm, const struct inode *inode,
|
const struct fscrypt_name *nm, const struct inode *inode,
|
||||||
int deletion, int xent);
|
int deletion, int xent);
|
||||||
int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
|
int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode,
|
||||||
const union ubifs_key *key, const void *buf, int len);
|
const union ubifs_key *key, const void *buf, int len);
|
||||||
int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode);
|
int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode);
|
||||||
int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode);
|
int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode);
|
||||||
int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir,
|
||||||
const struct dentry *fst_dentry,
|
const struct inode *fst_inode,
|
||||||
|
const struct fscrypt_name *fst_nm,
|
||||||
const struct inode *snd_dir,
|
const struct inode *snd_dir,
|
||||||
const struct dentry *snd_dentry, int sync);
|
const struct inode *snd_inode,
|
||||||
|
const struct fscrypt_name *snd_nm, int sync);
|
||||||
int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir,
|
||||||
const struct dentry *old_dentry,
|
const struct inode *old_inode,
|
||||||
|
const struct fscrypt_name *old_nm,
|
||||||
const struct inode *new_dir,
|
const struct inode *new_dir,
|
||||||
const struct dentry *new_dentry,
|
const struct inode *new_inode,
|
||||||
|
const struct fscrypt_name *new_nm,
|
||||||
const struct inode *whiteout, int sync);
|
const struct inode *whiteout, int sync);
|
||||||
int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
|
int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
|
||||||
loff_t old_size, loff_t new_size);
|
loff_t old_size, loff_t new_size);
|
||||||
int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host,
|
||||||
const struct inode *inode, const struct qstr *nm);
|
const struct inode *inode, const struct fscrypt_name *nm);
|
||||||
int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode1,
|
int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode1,
|
||||||
const struct inode *inode2);
|
const struct inode *inode2);
|
||||||
|
|
||||||
@@ -1566,7 +1570,7 @@ int ubifs_save_dirty_idx_lnums(struct ubifs_info *c);
|
|||||||
int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
struct ubifs_znode **zn, int *n);
|
struct ubifs_znode **zn, int *n);
|
||||||
int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
void *node, const struct qstr *nm);
|
void *node, const struct fscrypt_name *nm);
|
||||||
int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
void *node, int *lnum, int *offs);
|
void *node, int *lnum, int *offs);
|
||||||
int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
|
int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
|
||||||
@@ -1574,16 +1578,16 @@ int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
|
|||||||
int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
int old_lnum, int old_offs, int lnum, int offs, int len);
|
int old_lnum, int old_offs, int lnum, int offs, int len);
|
||||||
int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
int lnum, int offs, int len, const struct qstr *nm);
|
int lnum, int offs, int len, const struct fscrypt_name *nm);
|
||||||
int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key);
|
int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key);
|
||||||
int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
|
int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
|
||||||
const struct qstr *nm);
|
const struct fscrypt_name *nm);
|
||||||
int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
|
int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
|
||||||
union ubifs_key *to_key);
|
union ubifs_key *to_key);
|
||||||
int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum);
|
int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum);
|
||||||
struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
||||||
union ubifs_key *key,
|
union ubifs_key *key,
|
||||||
const struct qstr *nm);
|
const struct fscrypt_name *nm);
|
||||||
void ubifs_tnc_close(struct ubifs_info *c);
|
void ubifs_tnc_close(struct ubifs_info *c);
|
||||||
int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
|
int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
|
||||||
int lnum, int offs, int is_idx);
|
int lnum, int offs, int is_idx);
|
||||||
|
|||||||
+23
-23
@@ -97,7 +97,7 @@ static const struct file_operations empty_fops;
|
|||||||
* of failure.
|
* of failure.
|
||||||
*/
|
*/
|
||||||
static int create_xattr(struct ubifs_info *c, struct inode *host,
|
static int create_xattr(struct ubifs_info *c, struct inode *host,
|
||||||
const struct qstr *nm, const void *value, int size)
|
const struct fscrypt_name *nm, const void *value, int size)
|
||||||
{
|
{
|
||||||
int err, names_len;
|
int err, names_len;
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
@@ -117,7 +117,7 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
|
|||||||
* extended attributes if the name list becomes larger. This limitation
|
* extended attributes if the name list becomes larger. This limitation
|
||||||
* is artificial for UBIFS, though.
|
* is artificial for UBIFS, though.
|
||||||
*/
|
*/
|
||||||
names_len = host_ui->xattr_names + host_ui->xattr_cnt + nm->len + 1;
|
names_len = host_ui->xattr_names + host_ui->xattr_cnt + fname_len(nm) + 1;
|
||||||
if (names_len > XATTR_LIST_MAX) {
|
if (names_len > XATTR_LIST_MAX) {
|
||||||
ubifs_err(c, "cannot add one more xattr name to inode %lu, total names length would become %d, max. is %d",
|
ubifs_err(c, "cannot add one more xattr name to inode %lu, total names length would become %d, max. is %d",
|
||||||
host->i_ino, names_len, XATTR_LIST_MAX);
|
host->i_ino, names_len, XATTR_LIST_MAX);
|
||||||
@@ -154,9 +154,9 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
|
|||||||
mutex_lock(&host_ui->ui_mutex);
|
mutex_lock(&host_ui->ui_mutex);
|
||||||
host->i_ctime = ubifs_current_time(host);
|
host->i_ctime = ubifs_current_time(host);
|
||||||
host_ui->xattr_cnt += 1;
|
host_ui->xattr_cnt += 1;
|
||||||
host_ui->xattr_size += CALC_DENT_SIZE(nm->len);
|
host_ui->xattr_size += CALC_DENT_SIZE(fname_len(nm));
|
||||||
host_ui->xattr_size += CALC_XATTR_BYTES(size);
|
host_ui->xattr_size += CALC_XATTR_BYTES(size);
|
||||||
host_ui->xattr_names += nm->len;
|
host_ui->xattr_names += fname_len(nm);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We handle UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT here because we
|
* We handle UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT here because we
|
||||||
@@ -164,7 +164,7 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
|
|||||||
* To avoid multiple updates of the same inode in the same operation,
|
* To avoid multiple updates of the same inode in the same operation,
|
||||||
* let's do it here.
|
* let's do it here.
|
||||||
*/
|
*/
|
||||||
if (strcmp(nm->name, UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT) == 0)
|
if (strcmp(fname_name(nm), UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT) == 0)
|
||||||
host_ui->flags |= UBIFS_CRYPT_FL;
|
host_ui->flags |= UBIFS_CRYPT_FL;
|
||||||
|
|
||||||
err = ubifs_jnl_update(c, host, nm, inode, 0, 1);
|
err = ubifs_jnl_update(c, host, nm, inode, 0, 1);
|
||||||
@@ -179,9 +179,9 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
|
|||||||
|
|
||||||
out_cancel:
|
out_cancel:
|
||||||
host_ui->xattr_cnt -= 1;
|
host_ui->xattr_cnt -= 1;
|
||||||
host_ui->xattr_size -= CALC_DENT_SIZE(nm->len);
|
host_ui->xattr_size -= CALC_DENT_SIZE(fname_len(nm));
|
||||||
host_ui->xattr_size -= CALC_XATTR_BYTES(size);
|
host_ui->xattr_size -= CALC_XATTR_BYTES(size);
|
||||||
host_ui->xattr_names -= nm->len;
|
host_ui->xattr_names -= fname_len(nm);
|
||||||
host_ui->flags &= ~UBIFS_CRYPT_FL;
|
host_ui->flags &= ~UBIFS_CRYPT_FL;
|
||||||
mutex_unlock(&host_ui->ui_mutex);
|
mutex_unlock(&host_ui->ui_mutex);
|
||||||
out_free:
|
out_free:
|
||||||
@@ -284,7 +284,7 @@ int ubifs_xattr_set(struct inode *host, const char *name, const void *value,
|
|||||||
{
|
{
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct ubifs_info *c = host->i_sb->s_fs_info;
|
struct ubifs_info *c = host->i_sb->s_fs_info;
|
||||||
struct qstr nm = QSTR_INIT(name, strlen(name));
|
struct fscrypt_name nm = { .disk_name = FSTR_INIT((char *)name, strlen(name))};
|
||||||
struct ubifs_dent_node *xent;
|
struct ubifs_dent_node *xent;
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
int err;
|
int err;
|
||||||
@@ -300,7 +300,7 @@ int ubifs_xattr_set(struct inode *host, const char *name, const void *value,
|
|||||||
if (size > UBIFS_MAX_INO_DATA)
|
if (size > UBIFS_MAX_INO_DATA)
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
|
||||||
if (nm.len > UBIFS_MAX_NLEN)
|
if (fname_len(&nm) > UBIFS_MAX_NLEN)
|
||||||
return -ENAMETOOLONG;
|
return -ENAMETOOLONG;
|
||||||
|
|
||||||
xent = kmalloc(UBIFS_MAX_XENT_NODE_SZ, GFP_NOFS);
|
xent = kmalloc(UBIFS_MAX_XENT_NODE_SZ, GFP_NOFS);
|
||||||
@@ -350,13 +350,13 @@ ssize_t ubifs_xattr_get(struct inode *host, const char *name, void *buf,
|
|||||||
{
|
{
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct ubifs_info *c = host->i_sb->s_fs_info;
|
struct ubifs_info *c = host->i_sb->s_fs_info;
|
||||||
struct qstr nm = QSTR_INIT(name, strlen(name));
|
struct fscrypt_name nm = { .disk_name = FSTR_INIT((char *)name, strlen(name))};
|
||||||
struct ubifs_inode *ui;
|
struct ubifs_inode *ui;
|
||||||
struct ubifs_dent_node *xent;
|
struct ubifs_dent_node *xent;
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (nm.len > UBIFS_MAX_NLEN)
|
if (fname_len(&nm) > UBIFS_MAX_NLEN)
|
||||||
return -ENAMETOOLONG;
|
return -ENAMETOOLONG;
|
||||||
|
|
||||||
xent = kmalloc(UBIFS_MAX_XENT_NODE_SZ, GFP_NOFS);
|
xent = kmalloc(UBIFS_MAX_XENT_NODE_SZ, GFP_NOFS);
|
||||||
@@ -425,7 +425,7 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size)
|
|||||||
struct ubifs_inode *host_ui = ubifs_inode(host);
|
struct ubifs_inode *host_ui = ubifs_inode(host);
|
||||||
struct ubifs_dent_node *xent, *pxent = NULL;
|
struct ubifs_dent_node *xent, *pxent = NULL;
|
||||||
int err, len, written = 0;
|
int err, len, written = 0;
|
||||||
struct qstr nm = { .name = NULL };
|
struct fscrypt_name nm = {0};
|
||||||
|
|
||||||
dbg_gen("ino %lu ('%pd'), buffer size %zd", host->i_ino,
|
dbg_gen("ino %lu ('%pd'), buffer size %zd", host->i_ino,
|
||||||
dentry, size);
|
dentry, size);
|
||||||
@@ -449,12 +449,12 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
nm.name = xent->name;
|
fname_name(&nm) = xent->name;
|
||||||
nm.len = le16_to_cpu(xent->nlen);
|
fname_len(&nm) = le16_to_cpu(xent->nlen);
|
||||||
|
|
||||||
if (xattr_visible(xent->name)) {
|
if (xattr_visible(xent->name)) {
|
||||||
memcpy(buffer + written, nm.name, nm.len + 1);
|
memcpy(buffer + written, fname_name(&nm), fname_len(&nm) + 1);
|
||||||
written += nm.len + 1;
|
written += fname_len(&nm) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(pxent);
|
kfree(pxent);
|
||||||
@@ -473,7 +473,7 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int remove_xattr(struct ubifs_info *c, struct inode *host,
|
static int remove_xattr(struct ubifs_info *c, struct inode *host,
|
||||||
struct inode *inode, const struct qstr *nm)
|
struct inode *inode, const struct fscrypt_name *nm)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct ubifs_inode *host_ui = ubifs_inode(host);
|
struct ubifs_inode *host_ui = ubifs_inode(host);
|
||||||
@@ -490,9 +490,9 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
|
|||||||
mutex_lock(&host_ui->ui_mutex);
|
mutex_lock(&host_ui->ui_mutex);
|
||||||
host->i_ctime = ubifs_current_time(host);
|
host->i_ctime = ubifs_current_time(host);
|
||||||
host_ui->xattr_cnt -= 1;
|
host_ui->xattr_cnt -= 1;
|
||||||
host_ui->xattr_size -= CALC_DENT_SIZE(nm->len);
|
host_ui->xattr_size -= CALC_DENT_SIZE(fname_len(nm));
|
||||||
host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len);
|
host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len);
|
||||||
host_ui->xattr_names -= nm->len;
|
host_ui->xattr_names -= fname_len(nm);
|
||||||
|
|
||||||
err = ubifs_jnl_delete_xattr(c, host, inode, nm);
|
err = ubifs_jnl_delete_xattr(c, host, inode, nm);
|
||||||
if (err)
|
if (err)
|
||||||
@@ -504,9 +504,9 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
|
|||||||
|
|
||||||
out_cancel:
|
out_cancel:
|
||||||
host_ui->xattr_cnt += 1;
|
host_ui->xattr_cnt += 1;
|
||||||
host_ui->xattr_size += CALC_DENT_SIZE(nm->len);
|
host_ui->xattr_size += CALC_DENT_SIZE(fname_len(nm));
|
||||||
host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);
|
host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);
|
||||||
host_ui->xattr_names += nm->len;
|
host_ui->xattr_names += fname_len(nm);
|
||||||
mutex_unlock(&host_ui->ui_mutex);
|
mutex_unlock(&host_ui->ui_mutex);
|
||||||
ubifs_release_budget(c, &req);
|
ubifs_release_budget(c, &req);
|
||||||
make_bad_inode(inode);
|
make_bad_inode(inode);
|
||||||
@@ -517,14 +517,14 @@ static int ubifs_xattr_remove(struct inode *host, const char *name)
|
|||||||
{
|
{
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct ubifs_info *c = host->i_sb->s_fs_info;
|
struct ubifs_info *c = host->i_sb->s_fs_info;
|
||||||
struct qstr nm = QSTR_INIT(name, strlen(name));
|
struct fscrypt_name nm = { .disk_name = FSTR_INIT((char *)name, strlen(name))};
|
||||||
struct ubifs_dent_node *xent;
|
struct ubifs_dent_node *xent;
|
||||||
union ubifs_key key;
|
union ubifs_key key;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
ubifs_assert(inode_is_locked(host));
|
ubifs_assert(inode_is_locked(host));
|
||||||
|
|
||||||
if (nm.len > UBIFS_MAX_NLEN)
|
if (fname_len(&nm) > UBIFS_MAX_NLEN)
|
||||||
return -ENAMETOOLONG;
|
return -ENAMETOOLONG;
|
||||||
|
|
||||||
xent = kmalloc(UBIFS_MAX_XENT_NODE_SZ, GFP_NOFS);
|
xent = kmalloc(UBIFS_MAX_XENT_NODE_SZ, GFP_NOFS);
|
||||||
|
|||||||
Reference in New Issue
Block a user