Skip to contentSkip to conversation

Fix overlayfs inotify interaction

PATCH In review Andrey Jr. Melnikov 2 participants 6 messages Jun 30, 2016 – Jul 14, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Fix overlayfs inotify interaction

Fix overlayfs inotify interaction - use d_real_inode() helper
to resolve real (underlying) inode. Without this inotify is not functional on overlayfs.

---
Runtime tested with inotifywait in monitor mode to confirm event generation.

cd /tmp/ && mkdir dest upper lower work
mount -t overlay none dest -o upperdir=upper/,lowerdir=lower/,workdir=work/ while /bin/true; do echo test >>/tmp/dest/lower-data; sleep 5; done & inotifywait -m /tmp/dest/lower-data

 fs/notify/inotify/inotify_user.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/notify/inotify/inotify_user.c +1 -1
index b8d08d0..592ce16 100644
@@ -742,7 +742,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
 		goto fput_and_out;
 
 	/* inode held in place by reference to path; group by fget on fd */
-	inode = path.dentry->d_inode;
+	inode = d_real_inode(path.dentry);
 	group = f.file->private_data;
 
 	/* create/update an inode mark */
Signature · 1 line
2.8.1
#1 lore raw

Ping.

2016-06-30 14:04 GMT+03:00 Andrey Jr. Melnikov <[email protected]>:

Quoted 33 lines

Fix overlayfs inotify interaction - use d_real_inode() helper
to resolve real (underlying) inode. Without this inotify is not functional on overlayfs.

---
Runtime tested with inotifywait in monitor mode to confirm event generation.

cd /tmp/ && mkdir dest upper lower work
mount -t overlay none dest -o upperdir=upper/,lowerdir=lower/,workdir=work/ while /bin/true; do echo test >>/tmp/dest/lower-data; sleep 5; done & inotifywait -m /tmp/dest/lower-data

 fs/notify/inotify/inotify_user.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/notify/inotify/inotify_user.c +1 -2
index b8d08d0..592ce16 100644
@@ -742,7 +742,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
                goto fput_and_out;
 
        /* inode held in place by reference to path; group by fget on fd */
-       inode = path.dentry->d_inode;
+       inode = d_real_inode(path.dentry);
        group = f.file->private_data;
 
        /* create/update an inode mark */
--

2.8.1

#2 lore raw
Quoted 6 lines · Andrey Melnikov

Ping.

2016-06-30 14:04 GMT+03:00 Andrey Jr. Melnikov <[email protected]>:

Quoted 3 lines

Fix overlayfs inotify interaction - use d_real_inode() helper
to resolve real (underlying) inode. Without this inotify is not functional on overlayfs.

Have you tried the alternative patch from Aihua Zhang:

https://lkml.org/lkml/2016/7/7/83

?

Thanks,
Miklos

Quoted 30 lines
Quoted 30 lines

---
Runtime tested with inotifywait in monitor mode to confirm event generation.

cd /tmp/ && mkdir dest upper lower work
mount -t overlay none dest -o upperdir=upper/,lowerdir=lower/,workdir=work/ while /bin/true; do echo test >>/tmp/dest/lower-data; sleep 5; done & inotifywait -m /tmp/dest/lower-data

 fs/notify/inotify/inotify_user.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/notify/inotify/inotify_user.c +1 -2
index b8d08d0..592ce16 100644
@@ -742,7 +742,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
                goto fput_and_out;
 
        /* inode held in place by reference to path; group by fget on fd */
-       inode = path.dentry->d_inode;
+       inode = d_real_inode(path.dentry);
        group = f.file->private_data;
 
        /* create/update an inode mark */
--

2.8.1

#3 lore raw

2016-07-14 12:23 GMT+03:00 Miklos Szeredi <[email protected]>:

Quoted 10 lines · Andrey Melnikov
Quoted 6 lines

Ping.

2016-06-30 14:04 GMT+03:00 Andrey Jr. Melnikov <[email protected]>:

Quoted 3 lines

Fix overlayfs inotify interaction - use d_real_inode() helper
to resolve real (underlying) inode. Without this inotify is not functional on overlayfs.

Have you tried the alternative patch from Aihua Zhang:
https://lkml.org/lkml/2016/7/7/83

No. My patch add small overhead, lookup inode once when add inotify watch, this patch - lookup inode on each operation. For what?

Quoted 30 lines
Quoted 30 lines
Quoted 30 lines

---
Runtime tested with inotifywait in monitor mode to confirm event generation.

cd /tmp/ && mkdir dest upper lower work
mount -t overlay none dest -o upperdir=upper/,lowerdir=lower/,workdir=work/ while /bin/true; do echo test >>/tmp/dest/lower-data; sleep 5; done & inotifywait -m /tmp/dest/lower-data

 fs/notify/inotify/inotify_user.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/notify/inotify/inotify_user.c +1 -2
index b8d08d0..592ce16 100644
@@ -742,7 +742,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
                goto fput_and_out;
 
        /* inode held in place by reference to path; group by fget on fd */
-       inode = path.dentry->d_inode;
+       inode = d_real_inode(path.dentry);
        group = f.file->private_data;
 
        /* create/update an inode mark */
--

2.8.1

#4 lore raw
Quoted 9 lines · Andrey Melnikov

2016-07-14 12:23 GMT+03:00 Miklos Szeredi <[email protected]>:

Quoted 8 lines · Andrey Melnikov
Quoted 6 lines

Ping.

2016-06-30 14:04 GMT+03:00 Andrey Jr. Melnikov <[email protected]>:

Quoted 3 lines

Fix overlayfs inotify interaction - use d_real_inode() helper
to resolve real (underlying) inode. Without this inotify is not functional on overlayfs.

Quoted 5 lines
Quoted 2 lines

Have you tried the alternative patch from Aihua Zhang:
https://lkml.org/lkml/2016/7/7/83

No. My patch add small overhead, lookup inode once when add inotify watch, this patch - lookup inode on each operation. For what?

I'm afraid that your patch won't work for all notifications (like directory modification).

Thanks,
Miklos

Quoted 31 lines
Quoted 31 lines
Quoted 31 lines
Quoted 31 lines

---
Runtime tested with inotifywait in monitor mode to confirm event generation.

cd /tmp/ && mkdir dest upper lower work
mount -t overlay none dest -o upperdir=upper/,lowerdir=lower/,workdir=work/ while /bin/true; do echo test >>/tmp/dest/lower-data; sleep 5; done & inotifywait -m /tmp/dest/lower-data

 fs/notify/inotify/inotify_user.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/notify/inotify/inotify_user.c +1 -2
index b8d08d0..592ce16 100644
@@ -742,7 +742,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
                goto fput_and_out;
 
        /* inode held in place by reference to path; group by fget on fd */
-       inode = path.dentry->d_inode;
+       inode = d_real_inode(path.dentry);
        group = f.file->private_data;
 
        /* create/update an inode mark */
--

2.8.1

#5 lore raw

2016-07-14 12:53 GMT+03:00 Miklos Szeredi <[email protected]>:

Quoted 10 lines · Andrey Melnikov
Quoted 9 lines

2016-07-14 12:23 GMT+03:00 Miklos Szeredi <[email protected]>:

Quoted 8 lines · Andrey Melnikov
Quoted 6 lines

Ping.

2016-06-30 14:04 GMT+03:00 Andrey Jr. Melnikov <[email protected]>:

Quoted 3 lines

Fix overlayfs inotify interaction - use d_real_inode() helper
to resolve real (underlying) inode. Without this inotify is not functional on overlayfs.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Have you tried the alternative patch from Aihua Zhang:
https://lkml.org/lkml/2016/7/7/83

No. My patch add small overhead, lookup inode once when add inotify watch, this patch - lookup inode on each operation. For what?

I'm afraid that your patch won't work for all notifications (like directory modification).

It work with dir's too:

# mount
none on /tmp/dest type overlay
(rw,relatime,lowerdir=lower/,upperdir=upper/,workdir=work/)
# cd /tmp/dest/test-dir/
/tmp/dest/test-dir# ls -als
total 8
4 drwxr-xr-x 2 root root 4096 Jul 14 09:58 .
4 drwxr-xr-x 1 root root 4096 Jul 14 09:58 ..
/tmp/dest/test-dir# touch test-1
/tmp/dest/test-dir# cd ..
/tmp/dest# mv test-dir/ test-dir-1/
/tmp/dest# touch test-dir-1/test-2
/tmp/dest# mkdir test-dir-1/test-dir-2

in other console:

# inotifywait -m /tmp/dest/test-dir/
Setting up watches.
Watches established.
/tmp/dest/test-dir/ OPEN,ISDIR
/tmp/dest/test-dir/ ACCESS,ISDIR
/tmp/dest/test-dir/ CLOSE_NOWRITE,CLOSE,ISDIR
/tmp/dest/test-dir/ OPEN,ISDIR
/tmp/dest/test-dir/ ACCESS,ISDIR
/tmp/dest/test-dir/ CLOSE_NOWRITE,CLOSE,ISDIR
/tmp/dest/test-dir/ CREATE test-1
/tmp/dest/test-dir/ OPEN test-1
/tmp/dest/test-dir/ ATTRIB test-1
/tmp/dest/test-dir/ CLOSE_WRITE,CLOSE test-1
/tmp/dest/test-dir/ MOVE_SELF
/tmp/dest/test-dir/ OPEN,ISDIR
/tmp/dest/test-dir/ ACCESS,ISDIR
/tmp/dest/test-dir/ CLOSE_NOWRITE,CLOSE,ISDIR
/tmp/dest/test-dir/ CREATE test-2
/tmp/dest/test-dir/ OPEN test-2
/tmp/dest/test-dir/ ATTRIB test-2
/tmp/dest/test-dir/ CLOSE_WRITE,CLOSE test-2
/tmp/dest/test-dir/ CREATE,ISDIR test-dir-2
/tmp/dest/test-dir/ OPEN,ISDIR
/tmp/dest/test-dir/ ACCESS,ISDIR
/tmp/dest/test-dir/ CLOSE_NOWRITE,CLOSE,ISDIR

Can't see any problem here.

Quoted 29 lines
Quoted 29 lines
Quoted 29 lines
Quoted 29 lines
Quoted 29 lines

---
Runtime tested with inotifywait in monitor mode to confirm event generation.

cd /tmp/ && mkdir dest upper lower work
mount -t overlay none dest -o upperdir=upper/,lowerdir=lower/,workdir=work/ while /bin/true; do echo test >>/tmp/dest/lower-data; sleep 5; done & inotifywait -m /tmp/dest/lower-data

 fs/notify/inotify/inotify_user.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
fs/notify/inotify/inotify_user.c +1 -2
index b8d08d0..592ce16 100644
@@ -742,7 +742,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
                goto fput_and_out;
 
        /* inode held in place by reference to path; group by fget on fd */
-       inode = path.dentry->d_inode;
+       inode = d_real_inode(path.dentry);
        group = f.file->private_data;
 
        /* create/update an inode mark */
--

2.8.1