我正在运行 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 的扩展,这可能会掩盖问题。