Commit 40b268d3 authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French

ksmbd: add mnt_want_write to ksmbd vfs functions

ksmbd is doing write access using vfs helpers. There are the cases that
mnt_want_write() is not called in vfs helper. This patch add missing
mnt_want_write() to ksmbd vfs functions.

Cc: stable@vger.kernel.org
Cc: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 2b9b8f3b
...@@ -2249,7 +2249,7 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len, ...@@ -2249,7 +2249,7 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
/* delete the EA only when it exits */ /* delete the EA only when it exits */
if (rc > 0) { if (rc > 0) {
rc = ksmbd_vfs_remove_xattr(idmap, rc = ksmbd_vfs_remove_xattr(idmap,
path->dentry, path,
attr_name); attr_name);
if (rc < 0) { if (rc < 0) {
...@@ -2263,8 +2263,7 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len, ...@@ -2263,8 +2263,7 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
/* if the EA doesn't exist, just do nothing. */ /* if the EA doesn't exist, just do nothing. */
rc = 0; rc = 0;
} else { } else {
rc = ksmbd_vfs_setxattr(idmap, rc = ksmbd_vfs_setxattr(idmap, path, attr_name, value,
path->dentry, attr_name, value,
le16_to_cpu(eabuf->EaValueLength), 0); le16_to_cpu(eabuf->EaValueLength), 0);
if (rc < 0) { if (rc < 0) {
ksmbd_debug(SMB, ksmbd_debug(SMB,
...@@ -2321,8 +2320,7 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path, ...@@ -2321,8 +2320,7 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
return -EBADF; return -EBADF;
} }
rc = ksmbd_vfs_setxattr(idmap, path->dentry, rc = ksmbd_vfs_setxattr(idmap, path, xattr_stream_name, NULL, 0, 0);
xattr_stream_name, NULL, 0, 0);
if (rc < 0) if (rc < 0)
pr_err("Failed to store XATTR stream name :%d\n", rc); pr_err("Failed to store XATTR stream name :%d\n", rc);
return 0; return 0;
...@@ -2350,7 +2348,7 @@ static int smb2_remove_smb_xattrs(const struct path *path) ...@@ -2350,7 +2348,7 @@ static int smb2_remove_smb_xattrs(const struct path *path)
if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) && if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
!strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX, !strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX,
STREAM_PREFIX_LEN)) { STREAM_PREFIX_LEN)) {
err = ksmbd_vfs_remove_xattr(idmap, path->dentry, err = ksmbd_vfs_remove_xattr(idmap, path,
name); name);
if (err) if (err)
ksmbd_debug(SMB, "remove xattr failed : %s\n", ksmbd_debug(SMB, "remove xattr failed : %s\n",
...@@ -2397,8 +2395,7 @@ static void smb2_new_xattrs(struct ksmbd_tree_connect *tcon, const struct path * ...@@ -2397,8 +2395,7 @@ static void smb2_new_xattrs(struct ksmbd_tree_connect *tcon, const struct path *
da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME | da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
XATTR_DOSINFO_ITIME; XATTR_DOSINFO_ITIME;
rc = ksmbd_vfs_set_dos_attrib_xattr(mnt_idmap(path->mnt), rc = ksmbd_vfs_set_dos_attrib_xattr(mnt_idmap(path->mnt), path, &da);
path->dentry, &da);
if (rc) if (rc)
ksmbd_debug(SMB, "failed to store file attribute into xattr\n"); ksmbd_debug(SMB, "failed to store file attribute into xattr\n");
} }
...@@ -2972,7 +2969,7 @@ int smb2_open(struct ksmbd_work *work) ...@@ -2972,7 +2969,7 @@ int smb2_open(struct ksmbd_work *work)
struct inode *inode = d_inode(path.dentry); struct inode *inode = d_inode(path.dentry);
posix_acl_rc = ksmbd_vfs_inherit_posix_acl(idmap, posix_acl_rc = ksmbd_vfs_inherit_posix_acl(idmap,
path.dentry, &path,
d_inode(path.dentry->d_parent)); d_inode(path.dentry->d_parent));
if (posix_acl_rc) if (posix_acl_rc)
ksmbd_debug(SMB, "inherit posix acl failed : %d\n", posix_acl_rc); ksmbd_debug(SMB, "inherit posix acl failed : %d\n", posix_acl_rc);
...@@ -2988,7 +2985,7 @@ int smb2_open(struct ksmbd_work *work) ...@@ -2988,7 +2985,7 @@ int smb2_open(struct ksmbd_work *work)
if (rc) { if (rc) {
if (posix_acl_rc) if (posix_acl_rc)
ksmbd_vfs_set_init_posix_acl(idmap, ksmbd_vfs_set_init_posix_acl(idmap,
path.dentry); &path);
if (test_share_config_flag(work->tcon->share_conf, if (test_share_config_flag(work->tcon->share_conf,
KSMBD_SHARE_FLAG_ACL_XATTR)) { KSMBD_SHARE_FLAG_ACL_XATTR)) {
...@@ -3028,7 +3025,7 @@ int smb2_open(struct ksmbd_work *work) ...@@ -3028,7 +3025,7 @@ int smb2_open(struct ksmbd_work *work)
rc = ksmbd_vfs_set_sd_xattr(conn, rc = ksmbd_vfs_set_sd_xattr(conn,
idmap, idmap,
path.dentry, &path,
pntsd, pntsd,
pntsd_size); pntsd_size);
kfree(pntsd); kfree(pntsd);
...@@ -5464,7 +5461,7 @@ static int smb2_rename(struct ksmbd_work *work, ...@@ -5464,7 +5461,7 @@ static int smb2_rename(struct ksmbd_work *work,
goto out; goto out;
rc = ksmbd_vfs_setxattr(file_mnt_idmap(fp->filp), rc = ksmbd_vfs_setxattr(file_mnt_idmap(fp->filp),
fp->filp->f_path.dentry, &fp->filp->f_path,
xattr_stream_name, xattr_stream_name,
NULL, 0, 0); NULL, 0, 0);
if (rc < 0) { if (rc < 0) {
...@@ -5629,8 +5626,7 @@ static int set_file_basic_info(struct ksmbd_file *fp, ...@@ -5629,8 +5626,7 @@ static int set_file_basic_info(struct ksmbd_file *fp,
da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME | da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
XATTR_DOSINFO_ITIME; XATTR_DOSINFO_ITIME;
rc = ksmbd_vfs_set_dos_attrib_xattr(idmap, rc = ksmbd_vfs_set_dos_attrib_xattr(idmap, &filp->f_path, &da);
filp->f_path.dentry, &da);
if (rc) if (rc)
ksmbd_debug(SMB, ksmbd_debug(SMB,
"failed to restore file attribute in EA\n"); "failed to restore file attribute in EA\n");
...@@ -7485,7 +7481,7 @@ static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id, ...@@ -7485,7 +7481,7 @@ static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id,
da.attr = le32_to_cpu(fp->f_ci->m_fattr); da.attr = le32_to_cpu(fp->f_ci->m_fattr);
ret = ksmbd_vfs_set_dos_attrib_xattr(idmap, ret = ksmbd_vfs_set_dos_attrib_xattr(idmap,
fp->filp->f_path.dentry, &da); &fp->filp->f_path, &da);
if (ret) if (ret)
fp->f_ci->m_fattr = old_fattr; fp->f_ci->m_fattr = old_fattr;
} }
......
...@@ -1162,8 +1162,7 @@ int smb_inherit_dacl(struct ksmbd_conn *conn, ...@@ -1162,8 +1162,7 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
pntsd_size += sizeof(struct smb_acl) + nt_size; pntsd_size += sizeof(struct smb_acl) + nt_size;
} }
ksmbd_vfs_set_sd_xattr(conn, idmap, ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, pntsd_size);
path->dentry, pntsd, pntsd_size);
kfree(pntsd); kfree(pntsd);
} }
...@@ -1383,7 +1382,7 @@ int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon, ...@@ -1383,7 +1382,7 @@ int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon,
newattrs.ia_valid |= ATTR_MODE; newattrs.ia_valid |= ATTR_MODE;
newattrs.ia_mode = (inode->i_mode & ~0777) | (fattr.cf_mode & 0777); newattrs.ia_mode = (inode->i_mode & ~0777) | (fattr.cf_mode & 0777);
ksmbd_vfs_remove_acl_xattrs(idmap, path->dentry); ksmbd_vfs_remove_acl_xattrs(idmap, path);
/* Update posix acls */ /* Update posix acls */
if (IS_ENABLED(CONFIG_FS_POSIX_ACL) && fattr.cf_dacls) { if (IS_ENABLED(CONFIG_FS_POSIX_ACL) && fattr.cf_dacls) {
rc = set_posix_acl(idmap, path->dentry, rc = set_posix_acl(idmap, path->dentry,
...@@ -1414,9 +1413,8 @@ int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon, ...@@ -1414,9 +1413,8 @@ int set_info_sec(struct ksmbd_conn *conn, struct ksmbd_tree_connect *tcon,
if (test_share_config_flag(tcon->share_conf, KSMBD_SHARE_FLAG_ACL_XATTR)) { if (test_share_config_flag(tcon->share_conf, KSMBD_SHARE_FLAG_ACL_XATTR)) {
/* Update WinACL in xattr */ /* Update WinACL in xattr */
ksmbd_vfs_remove_sd_xattrs(idmap, path->dentry); ksmbd_vfs_remove_sd_xattrs(idmap, path);
ksmbd_vfs_set_sd_xattr(conn, idmap, ksmbd_vfs_set_sd_xattr(conn, idmap, path, pntsd, ntsd_len);
path->dentry, pntsd, ntsd_len);
} }
out: out:
......
This diff is collapsed.
...@@ -108,12 +108,12 @@ ssize_t ksmbd_vfs_casexattr_len(struct mnt_idmap *idmap, ...@@ -108,12 +108,12 @@ ssize_t ksmbd_vfs_casexattr_len(struct mnt_idmap *idmap,
struct dentry *dentry, char *attr_name, struct dentry *dentry, char *attr_name,
int attr_name_len); int attr_name_len);
int ksmbd_vfs_setxattr(struct mnt_idmap *idmap, int ksmbd_vfs_setxattr(struct mnt_idmap *idmap,
struct dentry *dentry, const char *attr_name, const struct path *path, const char *attr_name,
void *attr_value, size_t attr_size, int flags); void *attr_value, size_t attr_size, int flags);
int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name, int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name,
size_t *xattr_stream_name_size, int s_type); size_t *xattr_stream_name_size, int s_type);
int ksmbd_vfs_remove_xattr(struct mnt_idmap *idmap, int ksmbd_vfs_remove_xattr(struct mnt_idmap *idmap,
struct dentry *dentry, char *attr_name); const struct path *path, char *attr_name);
int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name, int ksmbd_vfs_kern_path_locked(struct ksmbd_work *work, char *name,
unsigned int flags, struct path *path, unsigned int flags, struct path *path,
bool caseless); bool caseless);
...@@ -139,26 +139,25 @@ void ksmbd_vfs_posix_lock_wait(struct file_lock *flock); ...@@ -139,26 +139,25 @@ void ksmbd_vfs_posix_lock_wait(struct file_lock *flock);
int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout); int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout);
void ksmbd_vfs_posix_lock_unblock(struct file_lock *flock); void ksmbd_vfs_posix_lock_unblock(struct file_lock *flock);
int ksmbd_vfs_remove_acl_xattrs(struct mnt_idmap *idmap, int ksmbd_vfs_remove_acl_xattrs(struct mnt_idmap *idmap,
struct dentry *dentry); const struct path *path);
int ksmbd_vfs_remove_sd_xattrs(struct mnt_idmap *idmap, int ksmbd_vfs_remove_sd_xattrs(struct mnt_idmap *idmap, const struct path *path);
struct dentry *dentry);
int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn, int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn,
struct mnt_idmap *idmap, struct mnt_idmap *idmap,
struct dentry *dentry, const struct path *path,
struct smb_ntsd *pntsd, int len); struct smb_ntsd *pntsd, int len);
int ksmbd_vfs_get_sd_xattr(struct ksmbd_conn *conn, int ksmbd_vfs_get_sd_xattr(struct ksmbd_conn *conn,
struct mnt_idmap *idmap, struct mnt_idmap *idmap,
struct dentry *dentry, struct dentry *dentry,
struct smb_ntsd **pntsd); struct smb_ntsd **pntsd);
int ksmbd_vfs_set_dos_attrib_xattr(struct mnt_idmap *idmap, int ksmbd_vfs_set_dos_attrib_xattr(struct mnt_idmap *idmap,
struct dentry *dentry, const struct path *path,
struct xattr_dos_attrib *da); struct xattr_dos_attrib *da);
int ksmbd_vfs_get_dos_attrib_xattr(struct mnt_idmap *idmap, int ksmbd_vfs_get_dos_attrib_xattr(struct mnt_idmap *idmap,
struct dentry *dentry, struct dentry *dentry,
struct xattr_dos_attrib *da); struct xattr_dos_attrib *da);
int ksmbd_vfs_set_init_posix_acl(struct mnt_idmap *idmap, int ksmbd_vfs_set_init_posix_acl(struct mnt_idmap *idmap,
struct dentry *dentry); struct path *path);
int ksmbd_vfs_inherit_posix_acl(struct mnt_idmap *idmap, int ksmbd_vfs_inherit_posix_acl(struct mnt_idmap *idmap,
struct dentry *dentry, struct path *path,
struct inode *parent_inode); struct inode *parent_inode);
#endif /* __KSMBD_VFS_H__ */ #endif /* __KSMBD_VFS_H__ */
...@@ -252,7 +252,7 @@ static void __ksmbd_inode_close(struct ksmbd_file *fp) ...@@ -252,7 +252,7 @@ static void __ksmbd_inode_close(struct ksmbd_file *fp)
if (ksmbd_stream_fd(fp) && (ci->m_flags & S_DEL_ON_CLS_STREAM)) { if (ksmbd_stream_fd(fp) && (ci->m_flags & S_DEL_ON_CLS_STREAM)) {
ci->m_flags &= ~S_DEL_ON_CLS_STREAM; ci->m_flags &= ~S_DEL_ON_CLS_STREAM;
err = ksmbd_vfs_remove_xattr(file_mnt_idmap(filp), err = ksmbd_vfs_remove_xattr(file_mnt_idmap(filp),
filp->f_path.dentry, &filp->f_path,
fp->stream.name); fp->stream.name);
if (err) if (err)
pr_err("remove xattr failed : %s\n", pr_err("remove xattr failed : %s\n",
......
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