Commit 12202c05 authored by Namjae Jeon's avatar Namjae Jeon
Browse files

ksmbd: use ksmbd_vfs_lock_parent to get stable parent dentry



Use ksmbd_vfs_lock_parent to get stable parent dentry and remove
PARENT_INODE macro.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNamjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent ab0b263b
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -5538,6 +5538,9 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
			   char *buf)
{
	struct ksmbd_file *parent_fp;
	struct dentry *parent;
	struct dentry *dentry = fp->filp->f_path.dentry;
	int ret;

	if (!(fp->daccess & FILE_DELETE_LE)) {
		pr_err("no right to delete : 0x%x\n", fp->daccess);
@@ -5547,7 +5550,17 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
	if (ksmbd_stream_fd(fp))
		goto next;

	parent_fp = ksmbd_lookup_fd_inode(PARENT_INODE(fp));
	parent = dget_parent(dentry);
	ret = ksmbd_vfs_lock_parent(parent, dentry);
	if (ret) {
		dput(parent);
		return ret;
	}

	parent_fp = ksmbd_lookup_fd_inode(d_inode(parent));
	inode_unlock(d_inode(parent));
	dput(parent);

	if (parent_fp) {
		if (parent_fp->daccess & FILE_DELETE_LE) {
			pr_err("parent dir is opened with delete access\n");
+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ static void ksmbd_vfs_inherit_owner(struct ksmbd_work *work,
 *
 * the reference count of @parent isn't incremented.
 */
static int ksmbd_vfs_lock_parent(struct dentry *parent, struct dentry *child)
int ksmbd_vfs_lock_parent(struct dentry *parent, struct dentry *child)
{
	struct dentry *dentry;
	int ret = 0;
+1 −0
Original line number Diff line number Diff line
@@ -192,6 +192,7 @@ struct ksmbd_kstat {
	__le32			file_attributes;
};

int ksmbd_vfs_lock_parent(struct dentry *parent, struct dentry *child);
int ksmbd_vfs_may_delete(struct dentry *dentry);
int ksmbd_vfs_query_maximal_access(struct dentry *dentry, __le32 *daccess);
int ksmbd_vfs_create(struct ksmbd_work *work, const char *name, umode_t mode);
+0 −2
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@
#define KSMBD_NO_FID		(UINT_MAX)
#define SMB2_NO_FID		(0xFFFFFFFFFFFFFFFFULL)

#define PARENT_INODE(fp)	d_inode((fp)->filp->f_path.dentry->d_parent)

#define ATTR_FP(fp) ((fp)->attrib_only && \
		     ((fp)->cdoption != FILE_OVERWRITE_IF_LE && \
		      (fp)->cdoption != FILE_OVERWRITE_LE && \