395 Star 1.4K Fork 1.3K

GVPopenEuler / kernel

 / 详情

[openEuler 20.03 LTS SP1/X86_64] LTP 测试用例ftruncate04执行失败

已完成
任务
创建于  
2021-04-21 15:24

【标题描述】能够简要描述问题:说明什么场景下,做了什么操作,出现什么问题(尽量使用正向表达方式)
【环境信息】
硬件信息:
1) 裸机场景提供出问题的硬件信息;
2) 虚机场景提供虚机XML文件或者配置信息
[root@hulk-34 bin]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 40
On-line CPU(s) list: 0-39
Thread(s) per core: 2
Core(s) per socket: 10
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Silver 4114 CPU @ 2.20GHz
Stepping: 4
软件信息:
1) OS版本及分支
cat /etc/openEuler-release
openEuler release 20.03 (LTS-SP1)
2) 内核信息
4.19.90
3) 发现问题的组件版本信息
如果有特殊组网,请提供网络拓扑图
【问题复现步骤】
具体操作步骤
cd /home/install/kernel_test_bin/bin/ltp/testcases/bin
./ftruncate04
出现概率(是否必现,概率性错误)
【预期结果】
pass
【实际结果】
[root@hulk-34 bin]# ./ftruncate04
tst_device.c:89: TINFO: Found free device 0 '/dev/loop0'
tst_test.c:859: TINFO: Formatting /dev/loop0 with ext2 opts='' extra opts=''
mke2fs 1.45.6 (20-Mar-2020)
tst_test.c:1263: TINFO: Timeout per run is 0h 05m 00s
ftruncate04.c:162: TCONF: Mandatory lock not supported by this system

Summary:
passed 0
failed 0
broken 0
skipped 1
warnings 0
【附件信息】
比如系统message日志/组件日志、dump信息、图片等

评论 (8)

汪可可 创建了任务
汪可可 关联仓库设置为openEuler/kernel
展开全部操作日志

Hey wang_keke, Welcome to openEuler Community.
All of the projects in openEuler Community are maintained by @openeuler-ci-bot.
That means the developers can comment below every pull request or issue to trigger Bot Commands.
Please follow instructions at https://gitee.com/openeuler/community/blob/master/en/sig-infrastructure/command.md to find the details.

/hdc-assigned test

测试用例代码

https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/syscalls/ftruncate/ftruncate04.c#L159

static void setup(void)
{
	 /*
	  * Kernel returns EPERM when CONFIG_MANDATORY_FILE_LOCKING is not
	  * supported - to avoid false negatives, mount the fs first without
	  * flags and then remount it as MS_MANDLOCK
	  */
	if (mount(NULL, MNTPOINT, NULL, MS_REMOUNT|MS_MANDLOCK, NULL) == -1) {
		if (errno == EPERM) {
			tst_brk(TCONF,
				"Mandatory lock not supported by this system");
		} else {
			tst_brk(TBROK | TTERRNO,
				"Remount with MS_MANDLOCK failed");
		}
	}
}

测试这个场景 mount 传入 MS_MANDLOCK
需要内核开启 CONFIG_MANDATORY_FILE_LOCKING=y
但是 openEuler X86 目前没有开启
内核支持

1 文件锁(File Lock)


文件锁(File Lock)是一种在特定的时间内只允许一个进程进行访问文件的机制,通过使用文件锁,可以使得多进程访问文件更加安全。

2 为什么文件锁是必须的


我们会举以下两个例子来解释为什么文件锁(file lock)是必须的

进程A打开并且读一个文件,这个文件关于账户信息
进程B此时也打开并且读这个相同的文件。
现在,进程A改变了一条记录,并且把改变写入了这个相同的文件内
进程B却无法知晓这个文件已经被改变了,这个时候进程B也做了相同记录改变的事情,把它的改变也写入了这个文件内
现在,这个文件只包含了进程B所做的改变
为了避免这类问题的发生,我们使用文件锁(file lock)来使进程串列化。

3 两种文件锁


接下来我们介绍两种linux的文件锁(advisory尝试性文件锁和mandatory强制性文件锁)

3.1 Advisory Locking


尝试性文件锁需要各个进程的无私合作,试想A进程获得一个 写 的文件锁,它开始往文件里写操作。 同时B进程,却没有去尝试获取写操作,它也同样可以进行写操作。但是很显然,B进程违反了游戏规则。我们称之为不合作进程。 尝试性文件锁,需要各个进程遵守统一规则,在文件访问时,都要礼貌的去尝试获得文件锁,然后进一步操作。

3.2 Mandatory Locking


强制性文件锁不需要进程的合作,强制性文件锁是通过内核强制检查文件的打开,读写操作是否符合文件锁的使用规则。
为了使强制性文件锁工作,我们必须要在文件系统上激活它,必要的操作包括
挂载 mount 文件系统,通过 "-o mand" 参数选项
对于文件锁施加的文件,打开 set-group-id 位,并且关闭 group-execut

参见:原文链接:https://blog.csdn.net/elfprincexu/article/details/43564425

# https://gitee.com/openeuler/kernel/blob/kernel-4.19/fs/namespace.c#L2800
long do_mount(const char *dev_name, const char __user *dir_name,
		const char *type_page, unsigned long flags, void *data_page)
{
    // ......
    if (!retval && (flags & SB_MANDLOCK) && !may_mandlock())
		retval = -EPERM;
    // ......
}

https://gitee.com/openeuler/kernel/blob/kernel-4.19/fs/namespace.c#L1666

static inline bool may_mandlock(void)
{
#ifndef	CONFIG_MANDATORY_FILE_LOCKING
	return false;
#endif
	return capable(CAP_SYS_ADMIN);
}

开启 CONFIG_MANDATORY_FILE_LOCKING 后,测试。

用例通过

@汪可可 用例失败,已经澄清了。我把 issue先 关掉。
如有疑问,请联系 @成坚 (CHENG Jian)

谢谢

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(4)
5329419 openeuler ci bot 1632792936
C
1
https://gitee.com/openeuler/kernel.git
git@gitee.com:openeuler/kernel.git
openeuler
kernel
kernel

搜索帮助