Commit cdf01226 authored by David Howells's avatar David Howells Committed by Al Viro

VFS: Provide empty name qstr

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