Skip to content

Commit

Permalink
ksmbd: use ksmbd_vfs_lock_parent to get stable parent dentry
Browse files Browse the repository at this point in the history
Use ksmbd_vfs_lock_parent to get stable parent dentry and remove
PARENT_INODE macro.

Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Namjae Jeon <[email protected]>
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
namjaejeon committed Jun 29, 2021
1 parent ab0b263 commit 12202c0
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 4 deletions.
15 changes: 14 additions & 1 deletion fs/ksmbd/smb2pdu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion fs/ksmbd/vfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions fs/ksmbd/vfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 0 additions & 2 deletions fs/ksmbd/vfs_cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 && \
Expand Down

0 comments on commit 12202c0

Please sign in to comment.