exfat: add exfat_get_dentry_set_by_ei() helper

This helper gets the directory entry set of the file for the exfat
inode which has been created.

It's used to remove all the instances of the pattern it replaces
making the code cleaner, it's also a preparation for changing ->dir
to record the cluster where the directory entry set is located and
changing ->entry to record the index of the directory entry within
the cluster.

Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Reviewed-by: Aoyama Wataru <wataru.aoyama@sony.com>
Reviewed-by: Daniel Palmer <daniel.palmer@sony.com>
Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
Yuezhang Mo 2024-09-13 13:13:54 +08:00 committed by Namjae Jeon
parent 06a2b0b3b4
commit ac844e9136
3 changed files with 21 additions and 36 deletions

View File

@ -508,6 +508,8 @@ struct exfat_dentry *exfat_get_dentry_cached(struct exfat_entry_set_cache *es,
int exfat_get_dentry_set(struct exfat_entry_set_cache *es, int exfat_get_dentry_set(struct exfat_entry_set_cache *es,
struct super_block *sb, struct exfat_chain *p_dir, int entry, struct super_block *sb, struct exfat_chain *p_dir, int entry,
unsigned int num_entries); unsigned int num_entries);
#define exfat_get_dentry_set_by_ei(es, sb, ei) \
exfat_get_dentry_set(es, sb, &(ei)->dir, (ei)->entry, ES_ALL_ENTRIES)
int exfat_get_empty_dentry_set(struct exfat_entry_set_cache *es, int exfat_get_empty_dentry_set(struct exfat_entry_set_cache *es,
struct super_block *sb, struct exfat_chain *p_dir, int entry, struct super_block *sb, struct exfat_chain *p_dir, int entry,
unsigned int num_entries); unsigned int num_entries);

View File

@ -43,7 +43,7 @@ int __exfat_write_inode(struct inode *inode, int sync)
exfat_set_volume_dirty(sb); exfat_set_volume_dirty(sb);
/* get the directory entry of given file or directory */ /* get the directory entry of given file or directory */
if (exfat_get_dentry_set(&es, sb, &(ei->dir), ei->entry, ES_ALL_ENTRIES)) if (exfat_get_dentry_set_by_ei(&es, sb, ei))
return -EIO; return -EIO;
ep = exfat_get_dentry_cached(&es, ES_IDX_FILE); ep = exfat_get_dentry_cached(&es, ES_IDX_FILE);
ep2 = exfat_get_dentry_cached(&es, ES_IDX_STREAM); ep2 = exfat_get_dentry_cached(&es, ES_IDX_STREAM);

View File

@ -779,26 +779,23 @@ static struct dentry *exfat_lookup(struct inode *dir, struct dentry *dentry,
/* remove an entry, BUT don't truncate */ /* remove an entry, BUT don't truncate */
static int exfat_unlink(struct inode *dir, struct dentry *dentry) static int exfat_unlink(struct inode *dir, struct dentry *dentry)
{ {
struct exfat_chain cdir;
struct super_block *sb = dir->i_sb; struct super_block *sb = dir->i_sb;
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
struct exfat_inode_info *ei = EXFAT_I(inode); struct exfat_inode_info *ei = EXFAT_I(inode);
struct exfat_entry_set_cache es; struct exfat_entry_set_cache es;
int entry, err = 0; int err = 0;
if (unlikely(exfat_forced_shutdown(sb))) if (unlikely(exfat_forced_shutdown(sb)))
return -EIO; return -EIO;
mutex_lock(&EXFAT_SB(sb)->s_lock); mutex_lock(&EXFAT_SB(sb)->s_lock);
exfat_chain_dup(&cdir, &ei->dir);
entry = ei->entry;
if (ei->dir.dir == DIR_DELETED) { if (ei->dir.dir == DIR_DELETED) {
exfat_err(sb, "abnormal access to deleted dentry"); exfat_err(sb, "abnormal access to deleted dentry");
err = -ENOENT; err = -ENOENT;
goto unlock; goto unlock;
} }
err = exfat_get_dentry_set(&es, sb, &cdir, entry, ES_ALL_ENTRIES); err = exfat_get_dentry_set_by_ei(&es, sb, ei);
if (err) { if (err) {
err = -EIO; err = -EIO;
goto unlock; goto unlock;
@ -928,21 +925,18 @@ static int exfat_check_dir_empty(struct super_block *sb,
static int exfat_rmdir(struct inode *dir, struct dentry *dentry) static int exfat_rmdir(struct inode *dir, struct dentry *dentry)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
struct exfat_chain cdir, clu_to_free; struct exfat_chain clu_to_free;
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct exfat_sb_info *sbi = EXFAT_SB(sb); struct exfat_sb_info *sbi = EXFAT_SB(sb);
struct exfat_inode_info *ei = EXFAT_I(inode); struct exfat_inode_info *ei = EXFAT_I(inode);
struct exfat_entry_set_cache es; struct exfat_entry_set_cache es;
int entry, err; int err;
if (unlikely(exfat_forced_shutdown(sb))) if (unlikely(exfat_forced_shutdown(sb)))
return -EIO; return -EIO;
mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock); mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock);
exfat_chain_dup(&cdir, &ei->dir);
entry = ei->entry;
if (ei->dir.dir == DIR_DELETED) { if (ei->dir.dir == DIR_DELETED) {
exfat_err(sb, "abnormal access to deleted dentry"); exfat_err(sb, "abnormal access to deleted dentry");
err = -ENOENT; err = -ENOENT;
@ -960,7 +954,7 @@ static int exfat_rmdir(struct inode *dir, struct dentry *dentry)
goto unlock; goto unlock;
} }
err = exfat_get_dentry_set(&es, sb, &cdir, entry, ES_ALL_ENTRIES); err = exfat_get_dentry_set_by_ei(&es, sb, ei);
if (err) { if (err) {
err = -EIO; err = -EIO;
goto unlock; goto unlock;
@ -995,8 +989,8 @@ static int exfat_rmdir(struct inode *dir, struct dentry *dentry)
return err; return err;
} }
static int exfat_rename_file(struct inode *parent_inode, struct exfat_chain *p_dir, static int exfat_rename_file(struct inode *parent_inode,
int oldentry, struct exfat_uni_name *p_uniname, struct exfat_chain *p_dir, struct exfat_uni_name *p_uniname,
struct exfat_inode_info *ei) struct exfat_inode_info *ei)
{ {
int ret, num_new_entries; int ret, num_new_entries;
@ -1012,7 +1006,7 @@ static int exfat_rename_file(struct inode *parent_inode, struct exfat_chain *p_d
if (num_new_entries < 0) if (num_new_entries < 0)
return num_new_entries; return num_new_entries;
ret = exfat_get_dentry_set(&old_es, sb, p_dir, oldentry, ES_ALL_ENTRIES); ret = exfat_get_dentry_set_by_ei(&old_es, sb, ei);
if (ret) { if (ret) {
ret = -EIO; ret = -EIO;
return ret; return ret;
@ -1066,21 +1060,19 @@ static int exfat_rename_file(struct inode *parent_inode, struct exfat_chain *p_d
return ret; return ret;
} }
static int exfat_move_file(struct inode *parent_inode, struct exfat_chain *p_olddir, static int exfat_move_file(struct inode *parent_inode,
int oldentry, struct exfat_chain *p_newdir, struct exfat_chain *p_newdir, struct exfat_uni_name *p_uniname,
struct exfat_uni_name *p_uniname, struct exfat_inode_info *ei) struct exfat_inode_info *ei)
{ {
int ret, newentry, num_new_entries; int ret, newentry, num_new_entries;
struct exfat_dentry *epmov, *epnew; struct exfat_dentry *epmov, *epnew;
struct super_block *sb = parent_inode->i_sb;
struct exfat_entry_set_cache mov_es, new_es; struct exfat_entry_set_cache mov_es, new_es;
num_new_entries = exfat_calc_num_entries(p_uniname); num_new_entries = exfat_calc_num_entries(p_uniname);
if (num_new_entries < 0) if (num_new_entries < 0)
return num_new_entries; return num_new_entries;
ret = exfat_get_dentry_set(&mov_es, sb, p_olddir, oldentry, ret = exfat_get_dentry_set_by_ei(&mov_es, parent_inode->i_sb, ei);
ES_ALL_ENTRIES);
if (ret) if (ret)
return -EIO; return -EIO;
@ -1129,8 +1121,7 @@ static int __exfat_rename(struct inode *old_parent_inode,
struct dentry *new_dentry) struct dentry *new_dentry)
{ {
int ret; int ret;
int dentry; struct exfat_chain newdir;
struct exfat_chain olddir, newdir;
struct exfat_uni_name uni_name; struct exfat_uni_name uni_name;
struct super_block *sb = old_parent_inode->i_sb; struct super_block *sb = old_parent_inode->i_sb;
struct exfat_sb_info *sbi = EXFAT_SB(sb); struct exfat_sb_info *sbi = EXFAT_SB(sb);
@ -1147,11 +1138,6 @@ static int __exfat_rename(struct inode *old_parent_inode,
return -ENOENT; return -ENOENT;
} }
exfat_chain_set(&olddir, EXFAT_I(old_parent_inode)->start_clu,
EXFAT_B_TO_CLU_ROUND_UP(i_size_read(old_parent_inode), sbi),
EXFAT_I(old_parent_inode)->flags);
dentry = ei->entry;
/* check whether new dir is existing directory and empty */ /* check whether new dir is existing directory and empty */
if (new_inode) { if (new_inode) {
ret = -EIO; ret = -EIO;
@ -1186,21 +1172,18 @@ static int __exfat_rename(struct inode *old_parent_inode,
exfat_set_volume_dirty(sb); exfat_set_volume_dirty(sb);
if (olddir.dir == newdir.dir) if (new_parent_inode == old_parent_inode)
ret = exfat_rename_file(new_parent_inode, &olddir, dentry, ret = exfat_rename_file(new_parent_inode, &newdir,
&uni_name, ei); &uni_name, ei);
else else
ret = exfat_move_file(new_parent_inode, &olddir, dentry, ret = exfat_move_file(new_parent_inode, &newdir,
&newdir, &uni_name, ei); &uni_name, ei);
if (!ret && new_inode) { if (!ret && new_inode) {
struct exfat_entry_set_cache es; struct exfat_entry_set_cache es;
struct exfat_chain *p_dir = &(new_ei->dir);
int new_entry = new_ei->entry;
/* delete entries of new_dir */ /* delete entries of new_dir */
ret = exfat_get_dentry_set(&es, sb, p_dir, new_entry, ret = exfat_get_dentry_set_by_ei(&es, sb, new_ei);
ES_ALL_ENTRIES);
if (ret) { if (ret) {
ret = -EIO; ret = -EIO;
goto del_out; goto del_out;