Commit f4f61d2c authored by Richard Weinberger's avatar Richard Weinberger

ubifs: Implement encrypted filenames

Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
Signed-off-by: default avatarDavid Gstir <david@sigma-star.at>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent b9bc8c7b
...@@ -233,7 +233,7 @@ static void dump_ch(const struct ubifs_ch *ch) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
This diff is collapsed.
This diff is collapsed.
...@@ -153,13 +153,13 @@ static inline void highest_ino_key(const struct ubifs_info *c, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -61,7 +61,7 @@ struct replay_entry { ...@@ -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) ...@@ -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, ...@@ -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;
......
...@@ -519,7 +519,7 @@ static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 @@ static int fallible_matches_name(struct ubifs_info *c, ...@@ -878,7 +878,8 @@ static int fallible_matches_name(struct ubifs_info *c,
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) ...@@ -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 @@ static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key, ...@@ -1837,7 +1838,7 @@ static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
* 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, ...@@ -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 @@ int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key, ...@@ -2279,14 +2280,15 @@ int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
* 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, ...@@ -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 @@ int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key) ...@@ -2514,13 +2516,13 @@ int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key)
* 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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -1513,25 +1513,29 @@ int ubifs_consolidate_log(struct ubifs_info *c); ...@@ -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); ...@@ -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, ...@@ -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);
......
...@@ -97,7 +97,7 @@ static const struct file_operations empty_fops; ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment