Commit 602e2806 authored by Hirofumi Ogawa's avatar Hirofumi Ogawa Committed by Linus Torvalds

[PATCH] Consolidate dot-stripping code

From Ren <l.s.r@web.de>

there are several places inside fs/vfat/namei.c where the length of a
struct qstr without any trailing dots is calculated. The patch below
adds a function vfat_striptail_len() which does that and makes use of it.
parent 3f4cb87c
...@@ -117,6 +117,17 @@ vfat_strnicmp(struct nls_table *t, const unsigned char *s1, ...@@ -117,6 +117,17 @@ vfat_strnicmp(struct nls_table *t, const unsigned char *s1,
return 0; return 0;
} }
/* returns the length of a struct qstr, ignoring trailing dots */
static unsigned int vfat_striptail_len(struct qstr *qstr)
{
unsigned int len = qstr->len;
while (len && qstr->name[len-1] == '.')
len--;
return len;
}
/* /*
* Compute the hash for the vfat name corresponding to the dentry. * Compute the hash for the vfat name corresponding to the dentry.
* Note: if the name is invalid, we leave the hash code unchanged so * Note: if the name is invalid, we leave the hash code unchanged so
...@@ -125,15 +136,7 @@ vfat_strnicmp(struct nls_table *t, const unsigned char *s1, ...@@ -125,15 +136,7 @@ vfat_strnicmp(struct nls_table *t, const unsigned char *s1,
*/ */
static int vfat_hash(struct dentry *dentry, struct qstr *qstr) static int vfat_hash(struct dentry *dentry, struct qstr *qstr)
{ {
const unsigned char *name; qstr->hash = full_name_hash(qstr->name, vfat_striptail_len(qstr));
int len;
len = qstr->len;
name = qstr->name;
while (len && name[len-1] == '.')
len--;
qstr->hash = full_name_hash(name, len);
return 0; return 0;
} }
...@@ -148,13 +151,11 @@ static int vfat_hashi(struct dentry *dentry, struct qstr *qstr) ...@@ -148,13 +151,11 @@ static int vfat_hashi(struct dentry *dentry, struct qstr *qstr)
{ {
struct nls_table *t = MSDOS_SB(dentry->d_inode->i_sb)->nls_io; struct nls_table *t = MSDOS_SB(dentry->d_inode->i_sb)->nls_io;
const unsigned char *name; const unsigned char *name;
int len; unsigned int len;
unsigned long hash; unsigned long hash;
len = qstr->len;
name = qstr->name; name = qstr->name;
while (len && name[len-1] == '.') len = vfat_striptail_len(qstr);
len--;
hash = init_name_hash(); hash = init_name_hash();
while (len--) while (len--)
...@@ -170,15 +171,11 @@ static int vfat_hashi(struct dentry *dentry, struct qstr *qstr) ...@@ -170,15 +171,11 @@ static int vfat_hashi(struct dentry *dentry, struct qstr *qstr)
static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b) static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b)
{ {
struct nls_table *t = MSDOS_SB(dentry->d_inode->i_sb)->nls_io; struct nls_table *t = MSDOS_SB(dentry->d_inode->i_sb)->nls_io;
int alen, blen; unsigned int alen, blen;
/* A filename cannot end in '.' or we treat it like it has none */ /* A filename cannot end in '.' or we treat it like it has none */
alen = a->len; alen = vfat_striptail_len(a);
blen = b->len; blen = vfat_striptail_len(b);
while (alen && a->name[alen-1] == '.')
alen--;
while (blen && b->name[blen-1] == '.')
blen--;
if (alen == blen) { if (alen == blen) {
if (vfat_strnicmp(t, a->name, b->name, alen) == 0) if (vfat_strnicmp(t, a->name, b->name, alen) == 0)
return 0; return 0;
...@@ -191,15 +188,11 @@ static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b) ...@@ -191,15 +188,11 @@ static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b)
*/ */
static int vfat_cmp(struct dentry *dentry, struct qstr *a, struct qstr *b) static int vfat_cmp(struct dentry *dentry, struct qstr *a, struct qstr *b)
{ {
int alen, blen; unsigned int alen, blen;
/* A filename cannot end in '.' or we treat it like it has none */ /* A filename cannot end in '.' or we treat it like it has none */
alen = a->len; alen = vfat_striptail_len(a);
blen = b->len; blen = vfat_striptail_len(b);
while (alen && a->name[alen-1] == '.')
alen--;
while (blen && b->name[blen-1] == '.')
blen--;
if (alen == blen) { if (alen == blen) {
if (strncmp(a->name, b->name, alen) == 0) if (strncmp(a->name, b->name, alen) == 0)
return 0; return 0;
...@@ -764,7 +757,7 @@ static int vfat_add_entry(struct inode *dir,struct qstr* qname, ...@@ -764,7 +757,7 @@ static int vfat_add_entry(struct inode *dir,struct qstr* qname,
struct msdos_dir_slot *dir_slots; struct msdos_dir_slot *dir_slots;
loff_t offset; loff_t offset;
int slots, slot; int slots, slot;
int res, len; int res;
struct msdos_dir_entry *dummy_de; struct msdos_dir_entry *dummy_de;
struct buffer_head *dummy_bh; struct buffer_head *dummy_bh;
loff_t dummy_i_pos; loff_t dummy_i_pos;
...@@ -774,10 +767,7 @@ static int vfat_add_entry(struct inode *dir,struct qstr* qname, ...@@ -774,10 +767,7 @@ static int vfat_add_entry(struct inode *dir,struct qstr* qname,
if (dir_slots == NULL) if (dir_slots == NULL)
return -ENOMEM; return -ENOMEM;
len = qname->len; res = vfat_build_slots(dir, qname->name, vfat_striptail_len(qname),
while (len && qname->name[len-1] == '.')
len--;
res = vfat_build_slots(dir, qname->name, len,
dir_slots, &slots, is_dir); dir_slots, &slots, is_dir);
if (res < 0) if (res < 0)
goto cleanup; goto cleanup;
...@@ -828,12 +818,9 @@ static int vfat_find(struct inode *dir,struct qstr* qname, ...@@ -828,12 +818,9 @@ static int vfat_find(struct inode *dir,struct qstr* qname,
{ {
struct super_block *sb = dir->i_sb; struct super_block *sb = dir->i_sb;
loff_t offset; loff_t offset;
int res,len; int res;
len = qname->len; res = fat_search_long(dir, qname->name, vfat_striptail_len(qname),
while (len && qname->name[len-1] == '.')
len--;
res = fat_search_long(dir, qname->name, len,
(MSDOS_SB(sb)->options.name_check != 's'), (MSDOS_SB(sb)->options.name_check != 's'),
&offset,&sinfo->longname_offset); &offset,&sinfo->longname_offset);
if (res>0) { if (res>0) {
......
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