From: Zhang AiHua <zhangaihua1@huawei.com>
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-unionfs@vger.kernel.org
Subject: retry:[PATCH] fix error: a bin file can truncate itself while running on overlayfs
Date: Mon, 27 Jun 2016 09:06:54 +0800 [thread overview]
Message-ID: <57707C2E.2080500@huawei.com> (raw)
In-Reply-To: <1466590388-4914-1-git-send-email-zhangaihua1@huawei.com>
-------- 转发的消息 --------
主题: [PATCH] fix error: a bin file can truncate itself while running on overlayfs
日期: Wed, 22 Jun 2016 18:13:08 +0800
发件人: zhangaihua1@huawei.com
收件人: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-unionfs@vger.kernel.org
抄送: Aihua Zhang <zhangaihua1@huawei.com>
From: Aihua Zhang <zhangaihua1@huawei.com>
I wrote a testcase to truncate a bin file while it is running on overlayfs.
the mount:
/dev/mapper/fedora-home on /home type ext4 (rw,relatime,data=ordered)
overlay on /tmp type overlay (rw,relatime,lowerdir=/home/zah/lower,
upperdir=/home/zah/upper,workdir=/home/zah/workdir)
the code cpp:
int main(int argc, char *argv[])
{
int status;
pthread_t thread;
int err;
char *ptr;
ptr = basename(argv[0]);
printf("%s\n",ptr);
errno = 0;
status = truncate(ptr, 4096);
printf("status:%d\n",status);
printf("errno:%d\n",errno);
printf("ETXTBSY:%d\n",ETXTBSY);
if ((-1 == status) && (ETXTBSY == errno))
{
printf("PASS\n");
return 0;
}
err = errno;
printf("err = %d\n", err);
printf("FAIL\n");
return 1;
}
I running the test on overlayfs, the result as below:
Bus error (core dumped)
and running the test on ext4, the result as below:
status:-1
errno:26
ETXTBSY:26
PASS
I add some log, and I find the inode is not correct on overlayfs,
and the inode->i_writecount is not correct also called by vfs_truncate->
get_write_access(), the log as below:
Jun 22 09:50:38 kernel: [131.872920] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873109] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873110] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873112] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873114] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873115] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873116] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873162] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873947] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.874039] vfs_truncate: inode ino:24061
before vfs_truncate, the inode is point to upper filesystem(ext4),
and in vfs_truncate the inode is point to overlayfs.
So, I fix it by geting the real inode via ovl_d_select_inode.
Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com>
---
fs/open.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/open.c b/fs/open.c
index 93ae3cd..43b17d1 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -67,10 +67,16 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
long vfs_truncate(const struct path *path, loff_t length)
{
+ struct dentry *dentry = path->dentry;
struct inode *inode;
long error;
- inode = path->dentry->d_inode;
+ if (dentry->d_flags & DCACHE_OP_SELECT_INODE) {
+ inode = dentry->d_op->d_select_inode(dentry, O_TRUNC);
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+ } else
+ inode = dentry->d_inode;
/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
if (S_ISDIR(inode->i_mode))
@@ -106,7 +112,7 @@ long vfs_truncate(const struct path *path, loff_t length)
if (!error)
error = security_path_truncate(path);
if (!error)
- error = do_truncate(path->dentry, length, 0, NULL);
+ error = do_truncate(dentry, length, 0, NULL);
put_write_and_out:
put_write_access(inode);
--
1.7.1
.
WARNING: multiple messages have this Message-ID (diff)
From: Zhang AiHua <zhangaihua1@huawei.com>
To: <linux-fsdevel@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-unionfs@vger.kernel.org>
Subject: retry:[PATCH] fix error: a bin file can truncate itself while running on overlayfs
Date: Mon, 27 Jun 2016 09:06:54 +0800 [thread overview]
Message-ID: <57707C2E.2080500@huawei.com> (raw)
In-Reply-To: <1466590388-4914-1-git-send-email-zhangaihua1@huawei.com>
-------- 转锟斤拷锟斤拷锟斤拷息 --------
锟斤拷锟斤拷: [PATCH] fix error: a bin file can truncate itself while running on overlayfs
锟斤拷锟斤拷: Wed, 22 Jun 2016 18:13:08 +0800
锟斤拷锟斤拷锟斤拷: zhangaihua1@huawei.com
锟秸硷拷锟斤拷: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-unionfs@vger.kernel.org
锟斤拷锟斤拷: Aihua Zhang <zhangaihua1@huawei.com>
From: Aihua Zhang <zhangaihua1@huawei.com>
I wrote a testcase to truncate a bin file while it is running on overlayfs.
the mount:
/dev/mapper/fedora-home on /home type ext4 (rw,relatime,data=ordered)
overlay on /tmp type overlay (rw,relatime,lowerdir=/home/zah/lower,
upperdir=/home/zah/upper,workdir=/home/zah/workdir)
the code cpp:
int main(int argc, char *argv[])
{
int status;
pthread_t thread;
int err;
char *ptr;
ptr = basename(argv[0]);
printf("%s\n",ptr);
errno = 0;
status = truncate(ptr, 4096);
printf("status:%d\n",status);
printf("errno:%d\n",errno);
printf("ETXTBSY:%d\n",ETXTBSY);
if ((-1 == status) && (ETXTBSY == errno))
{
printf("PASS\n");
return 0;
}
err = errno;
printf("err = %d\n", err);
printf("FAIL\n");
return 1;
}
I running the test on overlayfs, the result as below:
Bus error (core dumped)
and running the test on ext4, the result as below:
status:-1
errno:26
ETXTBSY:26
PASS
I add some log, and I find the inode is not correct on overlayfs,
and the inode->i_writecount is not correct also called by vfs_truncate->
get_write_access(), the log as below:
Jun 22 09:50:38 kernel: [131.872920] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873109] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873110] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873112] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873114] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873115] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873116] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873162] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873947] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.874039] vfs_truncate: inode ino:24061
before vfs_truncate, the inode is point to upper filesystem(ext4),
and in vfs_truncate the inode is point to overlayfs.
So, I fix it by geting the real inode via ovl_d_select_inode.
Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com>
---
fs/open.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/open.c b/fs/open.c
index 93ae3cd..43b17d1 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -67,10 +67,16 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
long vfs_truncate(const struct path *path, loff_t length)
{
+ struct dentry *dentry = path->dentry;
struct inode *inode;
long error;
- inode = path->dentry->d_inode;
+ if (dentry->d_flags & DCACHE_OP_SELECT_INODE) {
+ inode = dentry->d_op->d_select_inode(dentry, O_TRUNC);
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+ } else
+ inode = dentry->d_inode;
/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
if (S_ISDIR(inode->i_mode))
@@ -106,7 +112,7 @@ long vfs_truncate(const struct path *path, loff_t length)
if (!error)
error = security_path_truncate(path);
if (!error)
- error = do_truncate(path->dentry, length, 0, NULL);
+ error = do_truncate(dentry, length, 0, NULL);
put_write_and_out:
put_write_access(inode);
--
1.7.1
.
WARNING: multiple messages have this Message-ID (diff)
From: Zhang AiHua <zhangaihua1@huawei.com>
To: <linux-fsdevel@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-unionfs@vger.kernel.org>
Subject: retry:[PATCH] fix error: a bin file can truncate itself while running on overlayfs
Date: Mon, 27 Jun 2016 09:06:54 +0800 [thread overview]
Message-ID: <57707C2E.2080500@huawei.com> (raw)
In-Reply-To: <1466590388-4914-1-git-send-email-zhangaihua1@huawei.com>
-------- 转发的消息 --------
主题: [PATCH] fix error: a bin file can truncate itself while running on overlayfs
日期: Wed, 22 Jun 2016 18:13:08 +0800
发件人: zhangaihua1@huawei.com
收件人: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-unionfs@vger.kernel.org
抄送: Aihua Zhang <zhangaihua1@huawei.com>
From: Aihua Zhang <zhangaihua1@huawei.com>
I wrote a testcase to truncate a bin file while it is running on overlayfs.
the mount:
/dev/mapper/fedora-home on /home type ext4 (rw,relatime,data=ordered)
overlay on /tmp type overlay (rw,relatime,lowerdir=/home/zah/lower,
upperdir=/home/zah/upper,workdir=/home/zah/workdir)
the code cpp:
int main(int argc, char *argv[])
{
int status;
pthread_t thread;
int err;
char *ptr;
ptr = basename(argv[0]);
printf("%s\n",ptr);
errno = 0;
status = truncate(ptr, 4096);
printf("status:%d\n",status);
printf("errno:%d\n",errno);
printf("ETXTBSY:%d\n",ETXTBSY);
if ((-1 == status) && (ETXTBSY == errno))
{
printf("PASS\n");
return 0;
}
err = errno;
printf("err = %d\n", err);
printf("FAIL\n");
return 1;
}
I running the test on overlayfs, the result as below:
Bus error (core dumped)
and running the test on ext4, the result as below:
status:-1
errno:26
ETXTBSY:26
PASS
I add some log, and I find the inode is not correct on overlayfs,
and the inode->i_writecount is not correct also called by vfs_truncate->
get_write_access(), the log as below:
Jun 22 09:50:38 kernel: [131.872920] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873109] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873110] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873112] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873114] deny_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873115] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873116] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873162] allow_write_access: inode ino 64104618
Jun 22 09:50:38 kernel: [131.873947] __vma_link_file: inode ino 64104618
Jun 22 09:50:38 kernel: [131.874039] vfs_truncate: inode ino:24061
before vfs_truncate, the inode is point to upper filesystem(ext4),
and in vfs_truncate the inode is point to overlayfs.
So, I fix it by geting the real inode via ovl_d_select_inode.
Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com>
---
fs/open.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/fs/open.c b/fs/open.c
index 93ae3cd..43b17d1 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -67,10 +67,16 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
long vfs_truncate(const struct path *path, loff_t length)
{
+ struct dentry *dentry = path->dentry;
struct inode *inode;
long error;
- inode = path->dentry->d_inode;
+ if (dentry->d_flags & DCACHE_OP_SELECT_INODE) {
+ inode = dentry->d_op->d_select_inode(dentry, O_TRUNC);
+ if (IS_ERR(inode))
+ return PTR_ERR(inode);
+ } else
+ inode = dentry->d_inode;
/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
if (S_ISDIR(inode->i_mode))
@@ -106,7 +112,7 @@ long vfs_truncate(const struct path *path, loff_t length)
if (!error)
error = security_path_truncate(path);
if (!error)
- error = do_truncate(path->dentry, length, 0, NULL);
+ error = do_truncate(dentry, length, 0, NULL);
put_write_and_out:
put_write_access(inode);
--
1.7.1
.
next prev parent reply other threads:[~2016-06-27 1:09 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-22 10:13 [PATCH] fix error: a bin file can truncate itself while running on overlayfs zhangaihua1
2016-06-22 10:13 ` zhangaihua1
2016-06-27 1:06 ` Zhang AiHua [this message]
2016-06-27 1:06 ` retry:[PATCH] " Zhang AiHua
2016-06-27 1:06 ` Zhang AiHua
2016-06-29 14:03 ` Miklos Szeredi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57707C2E.2080500@huawei.com \
--to=zhangaihua1@huawei.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-unionfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.