mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 16:37:50 +00:00
ksmbd: fix oops from fuse driver
Marios reported kernel oops from fuse driver when ksmbd call mark_inode_dirty(). This patch directly update ->i_ctime after removing mark_inode_ditry() and notify_change will put inode to dirty list. Cc: Tom Talpey <tom@talpey.com> Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com> Cc: Ralph Böhme <slow@samba.org> Cc: Hyunchul Lee <hyc.lee@gmail.com> Reported-by: Marios Makassikis <mmakassikis@freebox.fr> Tested-by: Marios Makassikis <mmakassikis@freebox.fr> Acked-by: Hyunchul Lee <hyc.lee@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
2db72604f3
commit
64e7875560
1 changed files with 6 additions and 11 deletions
|
@ -5483,7 +5483,6 @@ static int set_file_basic_info(struct ksmbd_file *fp,
|
||||||
struct ksmbd_share_config *share)
|
struct ksmbd_share_config *share)
|
||||||
{
|
{
|
||||||
struct iattr attrs;
|
struct iattr attrs;
|
||||||
struct timespec64 ctime;
|
|
||||||
struct file *filp;
|
struct file *filp;
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct user_namespace *user_ns;
|
struct user_namespace *user_ns;
|
||||||
|
@ -5505,13 +5504,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
|
||||||
attrs.ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
|
attrs.ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_info->ChangeTime) {
|
attrs.ia_valid |= ATTR_CTIME;
|
||||||
|
if (file_info->ChangeTime)
|
||||||
attrs.ia_ctime = ksmbd_NTtimeToUnix(file_info->ChangeTime);
|
attrs.ia_ctime = ksmbd_NTtimeToUnix(file_info->ChangeTime);
|
||||||
ctime = attrs.ia_ctime;
|
else
|
||||||
attrs.ia_valid |= ATTR_CTIME;
|
attrs.ia_ctime = inode->i_ctime;
|
||||||
} else {
|
|
||||||
ctime = inode->i_ctime;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_info->LastWriteTime) {
|
if (file_info->LastWriteTime) {
|
||||||
attrs.ia_mtime = ksmbd_NTtimeToUnix(file_info->LastWriteTime);
|
attrs.ia_mtime = ksmbd_NTtimeToUnix(file_info->LastWriteTime);
|
||||||
|
@ -5557,11 +5554,9 @@ static int set_file_basic_info(struct ksmbd_file *fp,
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
inode_lock(inode);
|
inode_lock(inode);
|
||||||
|
inode->i_ctime = attrs.ia_ctime;
|
||||||
|
attrs.ia_valid &= ~ATTR_CTIME;
|
||||||
rc = notify_change(user_ns, dentry, &attrs, NULL);
|
rc = notify_change(user_ns, dentry, &attrs, NULL);
|
||||||
if (!rc) {
|
|
||||||
inode->i_ctime = ctime;
|
|
||||||
mark_inode_dirty(inode);
|
|
||||||
}
|
|
||||||
inode_unlock(inode);
|
inode_unlock(inode);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
|
Loading…
Reference in a new issue