Commit 30a59ddd authored by Paulo Alcantara's avatar Paulo Alcantara Committed by Steve French
Browse files

vfs: introduce d_mark_tmpfile_name()



CIFS requires O_TMPFILE dentries to have names of newly created
delete-on-close files in the server so it can build full pathnames
from the root of the share when performing operations on them.

Suggested-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarPaulo Alcantara (Red Hat) <pc@manguebit.org>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Jan Kara <jack@suse.cz>
Cc: David Howells <dhowells@redhat.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-cifs@vger.kernel.org
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 158f4ff1
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -3196,6 +3196,25 @@ void d_mark_tmpfile(struct file *file, struct inode *inode)
}
EXPORT_SYMBOL(d_mark_tmpfile);

void d_mark_tmpfile_name(struct file *file, const struct qstr *name)
{
	struct dentry *dentry = file->f_path.dentry;
	char *dname = dentry->d_shortname.string;

	BUG_ON(dname_external(dentry));
	BUG_ON(d_really_is_positive(dentry));
	BUG_ON(!d_unlinked(dentry));
	BUG_ON(name->len > DNAME_INLINE_LEN - 1);
	spin_lock(&dentry->d_parent->d_lock);
	spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
	dentry->__d_name.len = name->len;
	memcpy(dname, name->name, name->len);
	dname[name->len] = '\0';
	spin_unlock(&dentry->d_lock);
	spin_unlock(&dentry->d_parent->d_lock);
}
EXPORT_SYMBOL(d_mark_tmpfile_name);

void d_tmpfile(struct file *file, struct inode *inode)
{
	struct dentry *dentry = file->f_path.dentry;
+1 −0
Original line number Diff line number Diff line
@@ -264,6 +264,7 @@ extern void d_invalidate(struct dentry *);
extern struct dentry * d_make_root(struct inode *);

extern void d_mark_tmpfile(struct file *, struct inode *);
void d_mark_tmpfile_name(struct file *file, const struct qstr *name);
extern void d_tmpfile(struct file *, struct inode *);

extern struct dentry *d_find_alias(struct inode *);