* [PATCH v3 resend 0/3] smb: fix xfstests generic/035
@ 2026-08-05 5:11 ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 1/3] smb/server: rename to ksmbd_has_nonposix_open_child() ChenXiaoSong
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: ChenXiaoSong @ 2026-08-05 5:11 UTC (permalink / raw)
To: smfrench, linkinjeon, pc, tom, senozhatsky, slow; +Cc: linux-cifs, ChenXiaoSong
From: ChenXiaoSong <chenxiaosong@kylinos.cn>
Resending patchset due to mail server issue.
v2->v3:
- Patch #02: iterate over `global_ft.idr`.
v2: https://lore.kernel.org/linux-cifs/20260804123301.285434-1-chenxiaosong@chenxiaosong.com/
ChenXiaoSong (3):
smb/server: rename to ksmbd_has_nonposix_open_child()
smb/server: deny overwriting targets with non-POSIX opens
smb/client: fix nlink of an overwritten open file
fs/smb/client/inode.c | 11 ++++++-----
fs/smb/server/vfs.c | 15 ++++++++++++++-
fs/smb/server/vfs_cache.c | 29 ++++++++++++++++++++++++++++-
fs/smb/server/vfs_cache.h | 3 ++-
4 files changed, 50 insertions(+), 8 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 resend 1/3] smb/server: rename to ksmbd_has_nonposix_open_child()
2026-08-05 5:11 [PATCH v3 resend 0/3] smb: fix xfstests generic/035 ChenXiaoSong
@ 2026-08-05 5:11 ` ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 2/3] smb/server: deny overwriting targets with non-POSIX opens ChenXiaoSong
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: ChenXiaoSong @ 2026-08-05 5:11 UTC (permalink / raw)
To: smfrench, linkinjeon, pc, tom, senozhatsky, slow; +Cc: linux-cifs, ChenXiaoSong
From: ChenXiaoSong <chenxiaosong@kylinos.cn>
The original function name `ksmbd_has_open_files()` could be confused with
the function name introduced in the next patch, and it does not accurately
describe what this function does.
Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
---
fs/smb/server/vfs.c | 2 +-
fs/smb/server/vfs_cache.c | 2 +-
fs/smb/server/vfs_cache.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
index 28940c7b5f83..16ef8d051b18 100644
--- a/fs/smb/server/vfs.c
+++ b/fs/smb/server/vfs.c
@@ -721,7 +721,7 @@ int ksmbd_vfs_rename(struct ksmbd_work *work, struct ksmbd_file *old_fp,
if (err)
goto out_drop_write;
- if (d_is_dir(old_child) && ksmbd_has_open_files(old_fp)) {
+ if (d_is_dir(old_child) && ksmbd_has_nonposix_open_child(old_fp)) {
err = -EACCES;
goto out3;
}
diff --git a/fs/smb/server/vfs_cache.c b/fs/smb/server/vfs_cache.c
index eac9886eb6e3..028bc1b0f652 100644
--- a/fs/smb/server/vfs_cache.c
+++ b/fs/smb/server/vfs_cache.c
@@ -1137,7 +1137,7 @@ struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry)
return NULL;
}
-bool ksmbd_has_open_files(struct ksmbd_file *old_fp)
+bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp)
{
struct dentry *dentry = old_fp->filp->f_path.dentry;
struct ksmbd_file *fp;
diff --git a/fs/smb/server/vfs_cache.h b/fs/smb/server/vfs_cache.h
index 127ea4987e3f..9dca617bc429 100644
--- a/fs/smb/server/vfs_cache.h
+++ b/fs/smb/server/vfs_cache.h
@@ -212,7 +212,7 @@ bool ksmbd_has_stream_without_delete_share(struct ksmbd_file *fp);
int ksmbd_close_fd_app_instance_id(char *app_instance_id);
struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid);
struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry);
-bool ksmbd_has_open_files(struct ksmbd_file *old_fp);
+bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp);
unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp);
struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp);
void ksmbd_launch_ksmbd_durable_scavenger(void);
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 resend 2/3] smb/server: deny overwriting targets with non-POSIX opens
2026-08-05 5:11 [PATCH v3 resend 0/3] smb: fix xfstests generic/035 ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 1/3] smb/server: rename to ksmbd_has_nonposix_open_child() ChenXiaoSong
@ 2026-08-05 5:11 ` ChenXiaoSong
2026-08-05 6:40 ` ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 3/3] smb/client: fix nlink of an overwritten open file ChenXiaoSong
2026-08-05 23:25 ` [PATCH v3 resend 0/3] smb: fix xfstests generic/035 Namjae Jeon
3 siblings, 1 reply; 7+ messages in thread
From: ChenXiaoSong @ 2026-08-05 5:11 UTC (permalink / raw)
To: smfrench, linkinjeon, pc, tom, senozhatsky, slow; +Cc: linux-cifs, ChenXiaoSong
From: ChenXiaoSong <chenxiaosong@kylinos.cn>
Reproducer:
1. server: systemctl start ksmbd
2. client: mount without `posix` option
mount -t cifs //${server_ip}/export /mnt
3. client: touch /mnt/file1 /mnt/file2
4. client: C program: int fd = open("/mnt/file2", O_RDONLY);
5. client: C program: rename("/mnt/file1", "/mnt/file2");
6. client: C program: struct stat stbuf; fstat(fd, &stbuf);
stbuf.st_nlink is 1, should be 0
This patch fixes xfstests generic/035 when mounted without `posix` option.
Suggested-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
---
fs/smb/server/vfs.c | 13 +++++++++++++
fs/smb/server/vfs_cache.c | 27 +++++++++++++++++++++++++++
fs/smb/server/vfs_cache.h | 1 +
3 files changed, 41 insertions(+)
diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
index 16ef8d051b18..9102ab47a3aa 100644
--- a/fs/smb/server/vfs.c
+++ b/fs/smb/server/vfs.c
@@ -726,6 +726,19 @@ int ksmbd_vfs_rename(struct ksmbd_work *work, struct ksmbd_file *old_fp,
goto out3;
}
+ /*
+ * See MS-FSA 2.1.5.15.12.
+ * An overwrite rename must fail with STATUS_ACCESS_DENIED if the
+ * existing target still has a non-POSIX open.
+ */
+ if (!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE)) &&
+ d_inode(rd.new_dentry) &&
+ d_inode(rd.new_dentry) != d_inode(old_child) &&
+ ksmbd_has_other_nonposix_open(rd.new_dentry)) {
+ err = -EACCES;
+ goto out3;
+ }
+
err = ksmbd_vfs_check_rename_share(work, old_path);
if (err)
goto out3;
diff --git a/fs/smb/server/vfs_cache.c b/fs/smb/server/vfs_cache.c
index 028bc1b0f652..90348a409162 100644
--- a/fs/smb/server/vfs_cache.c
+++ b/fs/smb/server/vfs_cache.c
@@ -1137,6 +1137,33 @@ struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry)
return NULL;
}
+bool ksmbd_has_other_nonposix_open(struct dentry *dentry)
+{
+ struct ksmbd_file *fp;
+ struct inode *inode = d_inode(dentry);
+ unsigned int id;
+ bool ret = false;
+
+ if (!inode)
+ return false;
+
+ read_lock(&global_ft.lock);
+ idr_for_each_entry(global_ft.idr, fp, id) {
+ if (READ_ONCE(fp->f_state) != FP_INITED)
+ continue;
+ if (inode != file_inode(fp->filp))
+ continue;
+ if (fp->is_posix_ctxt)
+ continue;
+
+ ret = true;
+ break;
+ }
+ read_unlock(&global_ft.lock);
+
+ return ret;
+}
+
bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp)
{
struct dentry *dentry = old_fp->filp->f_path.dentry;
diff --git a/fs/smb/server/vfs_cache.h b/fs/smb/server/vfs_cache.h
index 9dca617bc429..5cac022b540b 100644
--- a/fs/smb/server/vfs_cache.h
+++ b/fs/smb/server/vfs_cache.h
@@ -212,6 +212,7 @@ bool ksmbd_has_stream_without_delete_share(struct ksmbd_file *fp);
int ksmbd_close_fd_app_instance_id(char *app_instance_id);
struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid);
struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry);
+bool ksmbd_has_other_nonposix_open(struct dentry *dentry);
bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp);
unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp);
struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp);
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 resend 3/3] smb/client: fix nlink of an overwritten open file
2026-08-05 5:11 [PATCH v3 resend 0/3] smb: fix xfstests generic/035 ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 1/3] smb/server: rename to ksmbd_has_nonposix_open_child() ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 2/3] smb/server: deny overwriting targets with non-POSIX opens ChenXiaoSong
@ 2026-08-05 5:11 ` ChenXiaoSong
2026-08-07 10:27 ` hehuiwen
2026-08-05 23:25 ` [PATCH v3 resend 0/3] smb: fix xfstests generic/035 Namjae Jeon
3 siblings, 1 reply; 7+ messages in thread
From: ChenXiaoSong @ 2026-08-05 5:11 UTC (permalink / raw)
To: smfrench, linkinjeon, pc, tom, senozhatsky, slow; +Cc: linux-cifs, ChenXiaoSong
From: ChenXiaoSong <chenxiaosong@kylinos.cn>
Reproducer:
1. server: systemctl start ksmbd
2. client: mount with `posix` option
mount -t cifs -o posix //${server_ip}/export /mnt
3. client: touch /mnt/file1 /mnt/file2
4. client: C program: int fd = open("/mnt/file2", O_RDONLY);
5. client: C program: rename("/mnt/file1", "/mnt/file2");
6. client: C program: struct stat stbuf; fstat(fd, &stbuf);
stbuf.st_nlink is 1, should be 0
This patch fixes xfstests generic/035 when mounted with `posix` option.
Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
---
fs/smb/client/inode.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
index 0afff761aab9..0b6273ce01a8 100644
--- a/fs/smb/client/inode.c
+++ b/fs/smb/client/inode.c
@@ -2648,11 +2648,8 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
if (d_really_is_positive(target_dentry)) {
if (!rc) {
struct inode *inode = d_inode(target_dentry);
- /*
- * Samba and ksmbd servers allow renaming a target
- * directory that is open, so make sure to update
- * ->i_nlink and then mark it as delete pending.
- */
+
+ /* Update the target link count after rename. */
if (S_ISDIR(inode->i_mode)) {
drop_cached_dir_by_name(xid, tcon, to_name, cifs_sb);
spin_lock(&inode->i_lock);
@@ -2663,6 +2660,10 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
CIFS_I(inode)->time = 0; /* force reval */
inode_set_ctime_current(inode);
inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
+ } else {
+ cifs_mark_open_handles_for_deleted_file(inode, to_name);
+ cifs_drop_nlink(inode);
+ inode_set_ctime_current(inode);
}
} else if (rc == -EACCES || rc == -EEXIST) {
/*
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 resend 2/3] smb/server: deny overwriting targets with non-POSIX opens
2026-08-05 5:11 ` [PATCH v3 resend 2/3] smb/server: deny overwriting targets with non-POSIX opens ChenXiaoSong
@ 2026-08-05 6:40 ` ChenXiaoSong
0 siblings, 0 replies; 7+ messages in thread
From: ChenXiaoSong @ 2026-08-05 6:40 UTC (permalink / raw)
To: smfrench, linkinjeon, pc, tom, senozhatsky, slow; +Cc: linux-cifs, ChenXiaoSong
The following are my test steps for the hardlink case mentioned by Namjae.
```
--- a/fs/smb/server/vfs_cache.c
+++ b/fs/smb/server/vfs_cache.c
@@ -1156,6 +1156,7 @@ bool ksmbd_has_other_nonposix_open(struct dentry
*dentry)
if (fp->is_posix_ctxt)
continue;
+ printk("%s:%d\n", __func__, __LINE__);
ret = true;
break;
}
```
1. Add the above debug log.
2. server: systemctl start ksmbd
3. client: mount without `posix` option:
mount -t cifs //${server_ip}/export /mnt
4. client: touch /mnt/file1 /mnt/file2
5. client: ln /mnt/file2 /mnt/link1; sleep 3
6. client: tail -f /mnt/link1 # open link1
7. tcpdump -i any tcp port 445 -w test-open-hardlink.pcap
8. client: mv /mnt/file1 /mnt/file2
9. server log:
[102256.516146] ksmbd_has_other_nonposix_open:1159
[102256.518393] ksmbd_has_other_nonposix_open:1159
[102256.520443] ksmbd_has_other_nonposix_open:1159
[102256.522616] ksmbd_has_other_nonposix_open:1159
10. Packets captured by tcpdump:
SetInfo Response, Error: STATUS_ACCESS_DENIED
On 8/5/26 10:17, Namjae Jeon wrote:
> The new check is limited to the target dentry's
> ksmbd_inode->m_fp_list. Therefore, it does not cover a struct
> ksmbd_file opened through another hardlink dentry, even though
> file_inode(fp->filp) == d_inode(dentry). For example, if file2.link is
> a hardlink to file2 and file2.link is opened with a non-POSIX context,
> an overwrite rename of another file to file2 can miss that open
> handle.
> This appears to be an existing limitation rather than a regression
> introduced by this patch. However, since this patch is intended to
> reject overwrites when the target has a non-POSIX ksmbd_file...
On 8/5/26 13:11, ChenXiaoSong wrote:
> From: ChenXiaoSong <chenxiaosong@kylinos.cn>
>
> Reproducer:
>
> 1. server: systemctl start ksmbd
> 2. client: mount without `posix` option
> mount -t cifs //${server_ip}/export /mnt
> 3. client: touch /mnt/file1 /mnt/file2
> 4. client: C program: int fd = open("/mnt/file2", O_RDONLY);
> 5. client: C program: rename("/mnt/file1", "/mnt/file2");
> 6. client: C program: struct stat stbuf; fstat(fd, &stbuf);
> stbuf.st_nlink is 1, should be 0
>
> This patch fixes xfstests generic/035 when mounted without `posix` option.
>
> Suggested-by: Namjae Jeon <linkinjeon@kernel.org>
> Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
> ---
> fs/smb/server/vfs.c | 13 +++++++++++++
> fs/smb/server/vfs_cache.c | 27 +++++++++++++++++++++++++++
> fs/smb/server/vfs_cache.h | 1 +
> 3 files changed, 41 insertions(+)
>
> diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
> index 16ef8d051b18..9102ab47a3aa 100644
> --- a/fs/smb/server/vfs.c
> +++ b/fs/smb/server/vfs.c
> @@ -726,6 +726,19 @@ int ksmbd_vfs_rename(struct ksmbd_work *work, struct ksmbd_file *old_fp,
> goto out3;
> }
>
> + /*
> + * See MS-FSA 2.1.5.15.12.
> + * An overwrite rename must fail with STATUS_ACCESS_DENIED if the
> + * existing target still has a non-POSIX open.
> + */
> + if (!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE)) &&
> + d_inode(rd.new_dentry) &&
> + d_inode(rd.new_dentry) != d_inode(old_child) &&
> + ksmbd_has_other_nonposix_open(rd.new_dentry)) {
> + err = -EACCES;
> + goto out3;
> + }
> +
> err = ksmbd_vfs_check_rename_share(work, old_path);
> if (err)
> goto out3;
> diff --git a/fs/smb/server/vfs_cache.c b/fs/smb/server/vfs_cache.c
> index 028bc1b0f652..90348a409162 100644
> --- a/fs/smb/server/vfs_cache.c
> +++ b/fs/smb/server/vfs_cache.c
> @@ -1137,6 +1137,33 @@ struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry)
> return NULL;
> }
>
> +bool ksmbd_has_other_nonposix_open(struct dentry *dentry)
> +{
> + struct ksmbd_file *fp;
> + struct inode *inode = d_inode(dentry);
> + unsigned int id;
> + bool ret = false;
> +
> + if (!inode)
> + return false;
> +
> + read_lock(&global_ft.lock);
> + idr_for_each_entry(global_ft.idr, fp, id) {
> + if (READ_ONCE(fp->f_state) != FP_INITED)
> + continue;
> + if (inode != file_inode(fp->filp))
> + continue;
> + if (fp->is_posix_ctxt)
> + continue;
> +
> + ret = true;
> + break;
> + }
> + read_unlock(&global_ft.lock);
> +
> + return ret;
> +}
> +
> bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp)
> {
> struct dentry *dentry = old_fp->filp->f_path.dentry;
> diff --git a/fs/smb/server/vfs_cache.h b/fs/smb/server/vfs_cache.h
> index 9dca617bc429..5cac022b540b 100644
> --- a/fs/smb/server/vfs_cache.h
> +++ b/fs/smb/server/vfs_cache.h
> @@ -212,6 +212,7 @@ bool ksmbd_has_stream_without_delete_share(struct ksmbd_file *fp);
> int ksmbd_close_fd_app_instance_id(char *app_instance_id);
> struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid);
> struct ksmbd_file *ksmbd_lookup_fd_inode(struct dentry *dentry);
> +bool ksmbd_has_other_nonposix_open(struct dentry *dentry);
> bool ksmbd_has_nonposix_open_child(struct ksmbd_file *old_fp);
> unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp);
> struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp);
--
ChenXiaoSong <chenxiaosong@chenxiaosong.com>
Chinese Homepage: https://chenxiaosong.com
English Homepage: https://chenxiaosong.com/en
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 resend 0/3] smb: fix xfstests generic/035
2026-08-05 5:11 [PATCH v3 resend 0/3] smb: fix xfstests generic/035 ChenXiaoSong
` (2 preceding siblings ...)
2026-08-05 5:11 ` [PATCH v3 resend 3/3] smb/client: fix nlink of an overwritten open file ChenXiaoSong
@ 2026-08-05 23:25 ` Namjae Jeon
3 siblings, 0 replies; 7+ messages in thread
From: Namjae Jeon @ 2026-08-05 23:25 UTC (permalink / raw)
To: ChenXiaoSong
Cc: smfrench, pc, tom, senozhatsky, slow, linux-cifs, ChenXiaoSong
On Wed, Aug 5, 2026 at 2:12 PM ChenXiaoSong
<chenxiaosong@chenxiaosong.com> wrote:
>
> From: ChenXiaoSong <chenxiaosong@kylinos.cn>
>
> Resending patchset due to mail server issue.
>
> v2->v3:
> - Patch #02: iterate over `global_ft.idr`.
>
> v2: https://lore.kernel.org/linux-cifs/20260804123301.285434-1-chenxiaosong@chenxiaosong.com/
>
> ChenXiaoSong (3):
> smb/server: rename to ksmbd_has_nonposix_open_child()
> smb/server: deny overwriting targets with non-POSIX opens
Applied ksmbd's patches to #ksmbd-for-next-next.
Thanks!
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 resend 3/3] smb/client: fix nlink of an overwritten open file
2026-08-05 5:11 ` [PATCH v3 resend 3/3] smb/client: fix nlink of an overwritten open file ChenXiaoSong
@ 2026-08-07 10:27 ` hehuiwen
0 siblings, 0 replies; 7+ messages in thread
From: hehuiwen @ 2026-08-07 10:27 UTC (permalink / raw)
To: ChenXiaoSong, smfrench, linkinjeon, pc, tom, senozhatsky, slow
Cc: linux-cifs, ChenXiaoSong
The AI review of the overwrite rename patch raised two possible races.
1. A handle opened through a surviving hard link may be marked deleted:
target_fh -- target --+
+--> inode X (nlink = 2)
alias_fh -- alias --+
CPU A CPU B
----- -----
rename(source, target)
server nlink: 2 -> 1
statx(alias,
AT_STATX_FORCE_SYNC)
cached i_nlink: 2 -> 1
cifs_mark_open_handles_for_deleted_file()
sees i_nlink == 1
marks every handle:
target_fh: deleted correct
alias_fh: deleted wrong
2. A concurrently refreshed link count may be decremented again:
CPU A CPU B
----- -----
rename(source, target)
server nlink: 2 -> 1
statx(alias,
AT_STATX_FORCE_SYNC)
cached i_nlink: 2 -> 1
cifs_drop_nlink()
actual: cached i_nlink: 1 -> 0 wrong
expected: cached i_nlink remains 1
I tried addressing these problems by taking an i_nlink snapshot before
the unlink/rename request, using it to decide which handles to mark,
and decrementing the cached link count only if it still matched the
snapshot.
Unfortunately, an nlink snapshot does not show whether revalidation
happened before or after unlink/rename. Therefore, it cannot fully
address these races or reject stale attribute responses that arrive late.
NFS addresses these issues with per-dentry silly rename, attribute
generation counters, and cache invalidation. A similar CIFS solution
may be challenging, as it must coordinate namespace operations,
open-handle state, and asynchronous attribute updates.
Do you have any ideas?
Thanks,
Huiwen
在 2026/8/5 13:11, ChenXiaoSong 写道:
> From: ChenXiaoSong <chenxiaosong@kylinos.cn>
>
> Reproducer:
>
> 1. server: systemctl start ksmbd
> 2. client: mount with `posix` option
> mount -t cifs -o posix //${server_ip}/export /mnt
> 3. client: touch /mnt/file1 /mnt/file2
> 4. client: C program: int fd = open("/mnt/file2", O_RDONLY);
> 5. client: C program: rename("/mnt/file1", "/mnt/file2");
> 6. client: C program: struct stat stbuf; fstat(fd, &stbuf);
> stbuf.st_nlink is 1, should be 0
>
> This patch fixes xfstests generic/035 when mounted with `posix` option.
>
> Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
> ---
> fs/smb/client/inode.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
> index 0afff761aab9..0b6273ce01a8 100644
> --- a/fs/smb/client/inode.c
> +++ b/fs/smb/client/inode.c
> @@ -2648,11 +2648,8 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
> if (d_really_is_positive(target_dentry)) {
> if (!rc) {
> struct inode *inode = d_inode(target_dentry);
> - /*
> - * Samba and ksmbd servers allow renaming a target
> - * directory that is open, so make sure to update
> - * ->i_nlink and then mark it as delete pending.
> - */
> +
> + /* Update the target link count after rename. */
> if (S_ISDIR(inode->i_mode)) {
> drop_cached_dir_by_name(xid, tcon, to_name, cifs_sb);
> spin_lock(&inode->i_lock);
> @@ -2663,6 +2660,10 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir,
> CIFS_I(inode)->time = 0; /* force reval */
> inode_set_ctime_current(inode);
> inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
> + } else {
> + cifs_mark_open_handles_for_deleted_file(inode, to_name);
> + cifs_drop_nlink(inode);
> + inode_set_ctime_current(inode);
> }
> } else if (rc == -EACCES || rc == -EEXIST) {
> /*
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-08-07 10:28 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-05 5:11 [PATCH v3 resend 0/3] smb: fix xfstests generic/035 ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 1/3] smb/server: rename to ksmbd_has_nonposix_open_child() ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 2/3] smb/server: deny overwriting targets with non-POSIX opens ChenXiaoSong
2026-08-05 6:40 ` ChenXiaoSong
2026-08-05 5:11 ` [PATCH v3 resend 3/3] smb/client: fix nlink of an overwritten open file ChenXiaoSong
2026-08-07 10:27 ` hehuiwen
2026-08-05 23:25 ` [PATCH v3 resend 0/3] smb: fix xfstests generic/035 Namjae Jeon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox