Re: [PATCH v2 3/3] smb/client: fix nlink of an overwritten open file

Steve French <[email protected]>
Newsgroups org.kernel.vger.linux-cifs
Message-ID <CAH2r5mu0rQKQDHgcF7jTBUk6zHitWinP5pzNUQ6+MxqP7j6w=g@mail.gmail.com>
> This patch fixes xfstests generic/035 when mounted with `posix` option.

generic/035 passes to Samba with posix mount option without the patch.
Any idea why this patch was needed for ksmbd but not for Samba

On Tue, Aug 4, 2026 at 7:34 AM ChenXiaoSong
<[email protected]> wrote:
>
> From: ChenXiaoSong <[email protected]>
>
> 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 <[email protected]>
> ---
>  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
>


-- 
Thanks,

Steve
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.