VFS: Provide empty name qstr
Provide an empty name (ie. "") qstr for general use. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
ee416bcdba
commit
cdf01226b2
6 changed files with 15 additions and 10 deletions
|
@ -90,6 +90,11 @@ EXPORT_SYMBOL(rename_lock);
|
|||
|
||||
static struct kmem_cache *dentry_cache __read_mostly;
|
||||
|
||||
const struct qstr empty_name = QSTR_INIT("", 0);
|
||||
EXPORT_SYMBOL(empty_name);
|
||||
const struct qstr slash_name = QSTR_INIT("/", 1);
|
||||
EXPORT_SYMBOL(slash_name);
|
||||
|
||||
/*
|
||||
* This is the single most critical data structure when it comes
|
||||
* to the dcache: the hashtable for lookups. Somebody should try
|
||||
|
@ -1578,8 +1583,7 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
|
|||
*/
|
||||
dentry->d_iname[DNAME_INLINE_LEN-1] = 0;
|
||||
if (unlikely(!name)) {
|
||||
static const struct qstr anon = QSTR_INIT("/", 1);
|
||||
name = &anon;
|
||||
name = &slash_name;
|
||||
dname = dentry->d_iname;
|
||||
} else if (name->len > DNAME_INLINE_LEN-1) {
|
||||
size_t size = offsetof(struct external_name, name[1]);
|
||||
|
|
|
@ -872,7 +872,6 @@ static struct gfs2_leaf *new_leaf(struct inode *inode, struct buffer_head **pbh,
|
|||
struct buffer_head *bh;
|
||||
struct gfs2_leaf *leaf;
|
||||
struct gfs2_dirent *dent;
|
||||
struct qstr name = { .name = "" };
|
||||
struct timespec tv = current_time(inode);
|
||||
|
||||
error = gfs2_alloc_blocks(ip, &bn, &n, 0, NULL);
|
||||
|
@ -896,7 +895,7 @@ static struct gfs2_leaf *new_leaf(struct inode *inode, struct buffer_head **pbh,
|
|||
leaf->lf_sec = cpu_to_be64(tv.tv_sec);
|
||||
memset(leaf->lf_reserved2, 0, sizeof(leaf->lf_reserved2));
|
||||
dent = (struct gfs2_dirent *)(leaf+1);
|
||||
gfs2_qstr2dirent(&name, bh->b_size - sizeof(struct gfs2_leaf), dent);
|
||||
gfs2_qstr2dirent(&empty_name, bh->b_size - sizeof(struct gfs2_leaf), dent);
|
||||
*pbh = bh;
|
||||
return leaf;
|
||||
}
|
||||
|
|
|
@ -3400,7 +3400,6 @@ static int do_last(struct nameidata *nd,
|
|||
|
||||
struct dentry *vfs_tmpfile(struct dentry *dentry, umode_t mode, int open_flag)
|
||||
{
|
||||
static const struct qstr name = QSTR_INIT("/", 1);
|
||||
struct dentry *child = NULL;
|
||||
struct inode *dir = dentry->d_inode;
|
||||
struct inode *inode;
|
||||
|
@ -3414,7 +3413,7 @@ struct dentry *vfs_tmpfile(struct dentry *dentry, umode_t mode, int open_flag)
|
|||
if (!dir->i_op->tmpfile)
|
||||
goto out_err;
|
||||
error = -ENOMEM;
|
||||
child = d_alloc(dentry, &name);
|
||||
child = d_alloc(dentry, &slash_name);
|
||||
if (unlikely(!child))
|
||||
goto out_err;
|
||||
error = dir->i_op->tmpfile(dir, child, mode);
|
||||
|
|
|
@ -53,7 +53,6 @@ static void nsfs_evict(struct inode *inode)
|
|||
static void *__ns_get_path(struct path *path, struct ns_common *ns)
|
||||
{
|
||||
struct vfsmount *mnt = nsfs_mnt;
|
||||
struct qstr qname = { .name = "", };
|
||||
struct dentry *dentry;
|
||||
struct inode *inode;
|
||||
unsigned long d;
|
||||
|
@ -85,7 +84,7 @@ static void *__ns_get_path(struct path *path, struct ns_common *ns)
|
|||
inode->i_fop = &ns_file_operations;
|
||||
inode->i_private = ns;
|
||||
|
||||
dentry = d_alloc_pseudo(mnt->mnt_sb, &qname);
|
||||
dentry = d_alloc_pseudo(mnt->mnt_sb, &empty_name);
|
||||
if (!dentry) {
|
||||
iput(inode);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
|
|
@ -739,13 +739,12 @@ int create_pipe_files(struct file **res, int flags)
|
|||
struct inode *inode = get_pipe_inode();
|
||||
struct file *f;
|
||||
struct path path;
|
||||
static struct qstr name = { .name = "" };
|
||||
|
||||
if (!inode)
|
||||
return -ENFILE;
|
||||
|
||||
err = -ENOMEM;
|
||||
path.dentry = d_alloc_pseudo(pipe_mnt->mnt_sb, &name);
|
||||
path.dentry = d_alloc_pseudo(pipe_mnt->mnt_sb, &empty_name);
|
||||
if (!path.dentry)
|
||||
goto err_inode;
|
||||
path.mnt = mntget(pipe_mnt);
|
||||
|
|
|
@ -55,6 +55,11 @@ struct qstr {
|
|||
|
||||
#define QSTR_INIT(n,l) { { { .len = l } }, .name = n }
|
||||
|
||||
extern const char empty_string[];
|
||||
extern const struct qstr empty_name;
|
||||
extern const char slash_string[];
|
||||
extern const struct qstr slash_name;
|
||||
|
||||
struct dentry_stat_t {
|
||||
long nr_dentry;
|
||||
long nr_unused;
|
||||
|
|
Loading…
Reference in a new issue