什么是虚假文件 nlink 值?

什么是虚假文件 nlink 值?

我正在运行 Raspbian 的 Raspberry Pi 上使用来自 SMB 共享的文件。每当我访问这些文件时,我都会在系统日志中收到以下消息:

CIFS VFS: bogus file nlink value 0

这实际上意味着什么?我该如何摆脱它?

SMB 服务器是 Apple TimeCapsule。

答案1

这似乎是一种“虚假”情况,您在挂载点上显示了一个文件,并且该文件在 Inode 链接上的编号小于 1。

这里是CIF结构.cf_nlink是特定文件具有的 inode 链接数。

这件作品代码显示它将把文件的所有信息填充到 cifs

     if (symlink) {
             fattr->cf_mode = S_IFLNK;
             fattr->cf_dtype = DT_LNK;
     } else if (fattr->cf_cifsattrs & ATTR_DIRECTORY) {
             fattr->cf_mode = S_IFDIR | cifs_sb->mnt_dir_mode;
             fattr->cf_dtype = DT_DIR;
             /*
              * Server can return wrong NumberOfLinks value for directories
              * when Unix extensions are disabled - fake it.
              */
             if (!tcon->unix_ext)
                     fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
     } else {
             fattr->cf_mode = S_IFREG | cifs_sb->mnt_file_mode;
             fattr->cf_dtype = DT_REG;

             /* clear write bits if ATTR_READONLY is set */
             if (fattr->cf_cifsattrs & ATTR_READONLY)
                     fattr->cf_mode &= ~(S_IWUGO);

             /*
              * Don't accept zero nlink from non-unix servers unless
              * delete is pending.  Instead mark it as unknown.
              */
             if ((fattr->cf_nlink < 1) && !tcon->unix_ext &&
                 !info->DeletePending) {
                     cifs_dbg(1, "bogus file nlink value %u\n",
                             fattr->cf_nlink);
                     fattr->cf_flags |= CIFS_FATTR_UNKNOWN_NLINK;
             }
     }

方法:如果是符号链接,只需设置属性。如果它是一个目录,当 Unix 扩展被禁用时,服务器可能会返回错误数量的链接,那么,只需CIFS_FATTR_UNKNOWN_NLINK在 Linux CIFS 客户端上用“我不知道我有多少个 nlink”来屏蔽它。

然而,可能会发生这样的情况:一个文件cf_nlink < 1既没有发生删除操作(!info->DeletePending),又没有可用的 Unix 扩展名(tcon->unix_ext),这很奇怪。没有硬链接且未被删除的文件,您将收到以下消息:CIFS VFS: bogus file nlink value 0

我完全理解这种情况,但我无法为您提供解决方案。 或许强制使用 unix 扩展,因为您在客户端和服务器站点上都有类似 unix 的扩展,这可能会掩盖问题。

相关内容