ksmbd: use ksmbd_vfs_lock_parent to get stable parent dentry
authorNamjae Jeon <namjae.jeon@samsung.com>
Tue, 29 Jun 2021 00:23:56 +0000 (09:23 +0900)
committerNamjae Jeon <namjae.jeon@samsung.com>
Tue, 29 Jun 2021 06:07:51 +0000 (15:07 +0900)
Use ksmbd_vfs_lock_parent to get stable parent dentry and remove
PARENT_INODE macro.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/ksmbd/smb2pdu.c
fs/ksmbd/vfs.c
fs/ksmbd/vfs.h
fs/ksmbd/vfs_cache.h

index 2d515e4..bf798ee 100644 (file)
@@ -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");
index 40783bb..7021662 100644 (file)
@@ -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;
index ae8eff1..ba12fea 100644 (file)
@@ -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);
index b01192e..752cbda 100644 (file)
@@ -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 && \