Skip to content

Commit 4ec9c8e

Browse files
ChenXiaoSongsmfrench
authored andcommitted
smb/server: promote S_DEL_ON_CLS to S_DEL_PENDING when close
Reproducer: 1. server: systemctl start ksmbd 2. client: mount -t cifs //${server_ip}/export /mnt 3. client: C program: openat(AT_FDCWD, "/mnt", O_RDWR | O_TMPFILE, 0600) Do not treat `FILE_DELETE_ON_CLOSE_LE` as delete pending while files remain open. This patch fixes xfstests generic/004. Cc: stable@vger.kernel.org Link: https://chenxiaosong.com/en/smb-xfstests-generic-004.html Co-developed-by: Huiwen He <hehuiwen@kylinos.cn> Signed-off-by: Huiwen He <hehuiwen@kylinos.cn> Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn> Tested-by: Steve French <stfrench@microsoft.com> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 69f030c commit 4ec9c8e

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

fs/smb/server/vfs_cache.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ int ksmbd_query_inode_status(struct dentry *dentry)
211211
return ret;
212212

213213
down_read(&ci->m_lock);
214-
if (ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS))
214+
if (ci->m_flags & S_DEL_PENDING)
215215
ret = KSMBD_INODE_STATUS_PENDING_DELETE;
216216
else
217217
ret = KSMBD_INODE_STATUS_OK;
@@ -227,7 +227,7 @@ bool ksmbd_inode_pending_delete(struct ksmbd_file *fp)
227227
int ret;
228228

229229
down_read(&ci->m_lock);
230-
ret = (ci->m_flags & (S_DEL_PENDING | S_DEL_ON_CLS));
230+
ret = (ci->m_flags & S_DEL_PENDING);
231231
up_read(&ci->m_lock);
232232

233233
return ret;
@@ -395,12 +395,20 @@ static void __ksmbd_inode_close(struct ksmbd_file *fp)
395395
}
396396
}
397397

398+
down_write(&ci->m_lock);
399+
/* Promote S_DEL_ON_CLS to S_DEL_PENDING when close */
400+
if (ci->m_flags & S_DEL_ON_CLS) {
401+
ci->m_flags &= ~S_DEL_ON_CLS;
402+
ci->m_flags |= S_DEL_PENDING;
403+
}
404+
up_write(&ci->m_lock);
405+
398406
if (atomic_dec_and_test(&ci->m_count)) {
399407
bool do_unlink = false;
400408

401409
down_write(&ci->m_lock);
402-
if (ci->m_flags & (S_DEL_ON_CLS | S_DEL_PENDING)) {
403-
ci->m_flags &= ~(S_DEL_ON_CLS | S_DEL_PENDING);
410+
if (ci->m_flags & S_DEL_PENDING) {
411+
ci->m_flags &= ~S_DEL_PENDING;
404412
do_unlink = true;
405413
}
406414
up_write(&ci->m_lock);

0 commit comments

Comments
 (0)