* [PATCH 0/2] more overlayfs hard link fixes @ 2016-05-20 20:48 Miklos Szeredi 2016-05-20 20:48 ` [PATCH 1/2] vfs: add d_real_inode() helper Miklos Szeredi 2016-05-20 20:48 ` [PATCH 2/2] af_unix: fix hard linked sockets on overlay Miklos Szeredi 0 siblings, 2 replies; 3+ messages in thread From: Miklos Szeredi @ 2016-05-20 20:48 UTC (permalink / raw) To: Al Viro; +Cc: linux-kernel, linux-fsdevel, David Howells Hi Al, Git tree (with previously posted vfs patches as well) is available here: git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs.git d_real Please pull. Thanks, Miklos --- Miklos Szeredi (5): vfs: add d_real_inode() helper af_unix: fix hard linked sockets on overlay vfs: merge .d_select_inode() into .d_real() vfs: document ->d_real() vfs: clean up documentation --- Documentation/filesystems/Locking | 4 ++-- Documentation/filesystems/vfs.txt | 39 +++++++++++++++++++++++++-------------- fs/dcache.c | 3 --- fs/namei.c | 2 +- fs/open.c | 17 +++++++++++++---- fs/overlayfs/inode.c | 31 ++++++++++--------------------- fs/overlayfs/overlayfs.h | 2 +- fs/overlayfs/super.c | 17 +++++++++++++---- include/linux/dcache.h | 35 ++++++++++++++++++++--------------- include/linux/fs.h | 2 +- net/unix/af_unix.c | 6 +++--- 11 files changed, 89 insertions(+), 69 deletions(-) ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] vfs: add d_real_inode() helper 2016-05-20 20:48 [PATCH 0/2] more overlayfs hard link fixes Miklos Szeredi @ 2016-05-20 20:48 ` Miklos Szeredi 2016-05-20 20:48 ` [PATCH 2/2] af_unix: fix hard linked sockets on overlay Miklos Szeredi 1 sibling, 0 replies; 3+ messages in thread From: Miklos Szeredi @ 2016-05-20 20:48 UTC (permalink / raw) To: Al Viro; +Cc: linux-kernel, linux-fsdevel, David Howells Needed by the following fix. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Cc: <stable@vger.kernel.org> --- include/linux/dcache.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 7e9422cb5989..ad5d582f9b14 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -576,5 +576,17 @@ static inline struct inode *vfs_select_inode(struct dentry *dentry, return inode; } +/** + * d_real_inode - Return the real inode + * @dentry: The dentry to query + * + * If dentry is on an union/overlay, then return the underlying, real inode. + * Otherwise return d_inode(). + */ +static inline struct inode *d_real_inode(struct dentry *dentry) +{ + return d_backing_inode(d_real(dentry)); +} + #endif /* __LINUX_DCACHE_H */ -- 2.5.5 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] af_unix: fix hard linked sockets on overlay 2016-05-20 20:48 [PATCH 0/2] more overlayfs hard link fixes Miklos Szeredi 2016-05-20 20:48 ` [PATCH 1/2] vfs: add d_real_inode() helper Miklos Szeredi @ 2016-05-20 20:48 ` Miklos Szeredi 1 sibling, 0 replies; 3+ messages in thread From: Miklos Szeredi @ 2016-05-20 20:48 UTC (permalink / raw) To: Al Viro; +Cc: linux-kernel, linux-fsdevel, David Howells Overlayfs uses separate inodes even in the case of hard links on the underlying filesystems. This is a problem for AF_UNIX socket implementation which indexes sockets based on the inode. This resulted in hard linked sockets not working. The fix is to use the real, underlying inode. Test case follows: -- ovl-sock-test.c -- #include <unistd.h> #include <err.h> #include <sys/socket.h> #include <sys/un.h> #define SOCK "test-sock" #define SOCK2 "test-sock2" int main(void) { int fd, fd2; struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = SOCK, }; struct sockaddr_un addr2 = { .sun_family = AF_UNIX, .sun_path = SOCK2, }; unlink(SOCK); unlink(SOCK2); if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) err(1, "socket"); if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) err(1, "bind"); if (listen(fd, 0) == -1) err(1, "listen"); if (link(SOCK, SOCK2) == -1) err(1, "link"); if ((fd2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) err(1, "socket"); if (connect(fd2, (struct sockaddr *) &addr2, sizeof(addr2)) == -1) err (1, "connect"); return 0; } ---- Reported-by: Alexander Morozov <alexandr.morozov@docker.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Cc: <stable@vger.kernel.org> --- net/unix/af_unix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 8269da73e9e5..7748199b3568 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -315,7 +315,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i) &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) { struct dentry *dentry = unix_sk(s)->path.dentry; - if (dentry && d_backing_inode(dentry) == i) { + if (dentry && d_real_inode(dentry) == i) { sock_hold(s); goto found; } @@ -911,7 +911,7 @@ static struct sock *unix_find_other(struct net *net, err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path); if (err) goto fail; - inode = d_backing_inode(path.dentry); + inode = d_real_inode(path.dentry); err = inode_permission(inode, MAY_WRITE); if (err) goto put_fail; @@ -1048,7 +1048,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) goto out_up; } addr->hash = UNIX_HASH_SIZE; - hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1); + hash = d_real_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1); spin_lock(&unix_table_lock); u->path = u_path; list = &unix_socket_table[hash]; -- 2.5.5 ^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-05-20 20:48 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-05-20 20:48 [PATCH 0/2] more overlayfs hard link fixes Miklos Szeredi 2016-05-20 20:48 ` [PATCH 1/2] vfs: add d_real_inode() helper Miklos Szeredi 2016-05-20 20:48 ` [PATCH 2/2] af_unix: fix hard linked sockets on overlay Miklos Szeredi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).