summaryrefslogtreecommitdiff
path: root/fs
Commit message (Collapse)AuthorAgeFilesLines
* ovl: Provide a mount option metacopy=on/off for metadata copyupVivek Goyal2018-07-203-3/+63
| | | | | | | | | | | | | | | | | | By default metadata only copy up is disabled. Provide a mount option so that users can choose one way or other. Also provide a kernel config and module option to enable/disable metacopy feature. metacopy feature requires redirect_dir=on when upper is present. Otherwise, it requires redirect_dir=follow atleast. As of now, metacopy does not work with nfs_export=on. So if both metacopy=on and nfs_export=on then nfs_export is disabled. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: Move the copy up helpers to copy_up.cVivek Goyal2018-07-203-33/+33
| | | | | | | | | | | Right now two copy up helpers are in inode.c. Amir suggested it might be better to move these to copy_up.c. There will one more related function which will come in later patch. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: Initialize ovl_inode->redirect in ovl_get_inode()Vivek Goyal2018-07-203-7/+5
| | | | | | | | | | | | | | | | | ovl_inode->redirect is an inode property and should be initialized in ovl_get_inode() only when we are adding a new inode to cache. If inode is already in cache, it is already initialized and we should not be touching ovl_inode->redirect field. As of now this is not a problem as redirects are used only for directories which don't share inode. But soon I want to use redirects for regular files also and there it can become an issue. Hence, move ->redirect initialization in ovl_get_inode(). Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: obsolete "check_copy_up" module optionMiklos Szeredi2018-07-181-23/+7
| | | | | | | This was provided for debugging the ro/rw inconsistecy. The inconsitency is now gone so this option is obsolete. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* vfs: remove open_flags from d_real()Miklos Szeredi2018-07-181-33/+3
| | | | | | | | Opening regular files on overlayfs is now handled via ovl_open(). Remove the now unused "open_flags" argument from d_op->d_real() and the d_real() helper. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Partially revert "locks: fix file locking on overlayfs"Miklos Szeredi2018-07-182-12/+7
| | | | | | | | | | | | | | | | | | | This partially reverts commit c568d68341be7030f5647def68851e469b21ca11. Overlayfs files will now automatically get the correct locks, no need to hack overlay support in VFS. It is a partial revert, because it leaves the locks_inode() calls in place and defines locks_inode() to file_inode(). We could revert those as well, but it would be unnecessary code churn and it makes sense to document that we are getting the inode for locking purposes. Don't revert MS_NOREMOTELOCK yet since that has been part of the userspace API for some time (though not in a useful way). Will try to remove internal flags later when the dust around the new mount API settles. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Acked-by: Jeff Layton <jlayton@kernel.org>
* Revert "vfs: do get_write_access() on upper layer of overlayfs"Miklos Szeredi2018-07-182-15/+3
| | | | | | | | | This reverts commit 4d0c5ba2ff79ef9f5188998b29fd28fcb05f3667. We now get write access on both overlay and underlying layers so this patch is no longer needed for correct operation. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Revert "vfs: add flags to d_real()"Miklos Szeredi2018-07-182-3/+3
| | | | | | | | This reverts commit 495e642939114478a5237a7d91661ba93b76f15a. No user of "flags" argument of d_real() remain. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Revert "vfs: update ovl inode before relatime check"Miklos Szeredi2018-07-183-35/+7
| | | | | | | | This reverts commit 598e3c8f72f5b77c84d2cb26cfd936ffb3cfdbaa. Overlayfs no longer relies on the vfs correct atime handling. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Revert "ovl: fix relatime for directories"Miklos Szeredi2018-07-182-20/+4
| | | | | | | | This reverts commit cd91304e7190b4c4802f8e413ab2214b233e0260. Overlayfs no longer relies on the vfs correct atime handling. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* vfs: fix freeze protection in mnt_want_write_file() for overlayfsMiklos Szeredi2018-07-181-3/+4
| | | | | | | | | | | | | The underlying real file used by overlayfs still contains the overlay path. This results in mnt_want_write_file() calls by the filesystem getting freeze protection on the wrong inode (the overlayfs one instead of the real one). Fix by using file_inode(file)->i_sb instead of file->f_path.mnt->mnt_sb. Reported-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
* Revert "ovl: don't allow writing ioctl on lower layer"Miklos Szeredi2018-07-184-70/+9
| | | | | | | | This reverts commit 7c6893e3c9abf6a9676e060a1e35e5caca673d57. Overlayfs no longer relies on the vfs for checking writability of files. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Revert "ovl: fix may_write_real() for overlayfs directories"Miklos Szeredi2018-07-181-3/+1
| | | | | | | | This reverts commit 954c736f865d6c0c68ae4263a2f3502ee7c447a3. Overlayfs no longer relies on the vfs for checking writability of files. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* vfs: don't open realMiklos Szeredi2018-07-181-6/+1
| | | | | | | | | | | | Let overlayfs do its thing when opening a file. This enables stacking and fixes the corner case when a file is opened for read, modified through a writable open, and data is read from the read-only file. After this patch the read-only open will not return stale data even in this case. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* ovl: add reflink/copyfile/dedup supportMiklos Szeredi2018-07-181-0/+87
| | | | | | Since set of arguments are so similar, handle in a common helper. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add O_DIRECT supportMiklos Szeredi2018-07-181-0/+3
| | | | Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add ovl_fiemap()Miklos Szeredi2018-07-181-1/+28
| | | | | | | | | Implement stacked fiemap(). Need to split inode operations for regular file (which has fiemap) and special file (which doesn't have fiemap). Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add lsattr/chattr supportMiklos Szeredi2018-07-181-0/+79
| | | | | | Implement FS_IOC_GETFLAGS and FS_IOC_SETFLAGS. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add ovl_fallocate()Miklos Szeredi2018-07-181-0/+24
| | | | | | Implement stacked fallocate. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add ovl_mmap()Miklos Szeredi2018-07-181-0/+32
| | | | | | Implement stacked mmap. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add ovl_fsync()Miklos Szeredi2018-07-181-0/+23
| | | | | | | | Implement stacked fsync(). Don't sync if lower (noticed by Amir Goldstein). Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add ovl_write_iter()Miklos Szeredi2018-07-181-0/+39
| | | | | | Implement stacked writes. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add ovl_read_iter()Miklos Szeredi2018-07-181-0/+67
| | | | | | Implement stacked reading. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: add helper to return real fileMiklos Szeredi2018-07-181-0/+60
| | | | | | | | | | | | | | | | In the common case we can just use the real file cached in file->private_data. There are two exceptions: 1) File has been copied up since open: in this unlikely corner case just use a throwaway real file for the operation. If ever this becomes a perfomance problem (very unlikely, since overlayfs has been doing most fine without correctly handling this case at all), then we can deal with that by updating the cached real file. 2) File's f_flags have changed since open: no need to reopen the cached real file, we can just change the flags there as well. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: stack file opsMiklos Szeredi2018-07-184-2/+82
| | | | | | | | | | | | | | | | | | | | | | Implement file operations on a regular overlay file. The underlying file is opened separately and cached in ->private_data. It might be worth making an exception for such files when accounting in nr_file to confirm to userspace expectations. We are only adding a small overhead (248bytes for the struct file) since the real inode and dentry are pinned by overlayfs anyway. This patch doesn't have any effect, since the vfs will use d_real() to find the real underlying file to open. The patch at the end of the series will actually enable this functionality. AV: make it use open_with_fake_path(), don't mess with override_creds SzM: still need to mess with override_creds() until no fs uses current_cred() in their open method. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* ovl: deal with overlay files in ovl_d_real()Miklos Szeredi2018-07-181-0/+4
| | | | Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: copy up file size as wellMiklos Szeredi2018-07-182-9/+2
| | | | | | | | | | | | Copy i_size of the underlying inode to the overlay inode in ovl_copyattr(). This is in preparation for stacking I/O operations on overlay files. This patch shouldn't have any observable effect. Remove stale comment from ovl_setattr() [spotted by Vivek Goyal]. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Revert "Revert "ovl: get_write_access() in truncate""Miklos Szeredi2018-07-181-0/+21
| | | | | | | | | | | | This reverts commit 31c3a7069593b072bd57192b63b62f9a7e994e9a. Re-add functionality dealing with i_writecount on truncate to overlayfs. This patch shouldn't have any observable effects, since we just re-assert the writecout that vfs_truncate() already got for us. This is in preparation for moving overlay functionality out of the VFS. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: copy up inode flagsMiklos Szeredi2018-07-182-0/+8
| | | | | | | | | On inode creation copy certain inode flags from the underlying real inode to the overlay inode. This is in preparation for moving overlay functionality out of the VFS. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* ovl: copy up timesMiklos Szeredi2018-07-184-9/+37
| | | | | | | | | | | Copy up mtime and ctime to overlay inode after times in real object are modified. Be careful not to dirty cachelines when not necessary. This is in preparation for moving overlay functionality out of the VFS. This patch shouldn't have any observable effect. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* vfs: export vfs_dedupe_file_range_one() to modulesMiklos Szeredi2018-07-181-3/+3
| | | | | | This is needed by the stacked dedupe implementation in overlayfs. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* vfs: export vfs_ioctl() to modulesMiklos Szeredi2018-07-182-1/+1
| | | | | | This is needed by the stacked ioctl implementation in overlayfs. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* vfs: make open_with_fake_path() not contribute to nr_filesMiklos Szeredi2018-07-183-22/+50
| | | | | | | | | | | | | Stacking file operations in overlay will store an extra open file for each overlay file opened. The overhead is just that of "struct file" which is about 256bytes, because overlay already pins an extra dentry and inode when the file is open, which add up to a much larger overhead. For fear of breaking working setups, don't start accounting the extra file. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* Merge branch 'dedupe-cleanup' into overlayfs-nextMiklos Szeredi2018-07-185-83/+73
|\ | | | | | | Following series for stacking overlay files depends on this mini series.
| * vfs: dedupe: extract helper for a single dedupMiklos Szeredi2018-07-061-40/+49
| | | | | | | | | | | | | | | | Extract vfs_dedupe_file_range_one() helper to deal with a single dedup request. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
| * vfs: dedupe: rationalize argsMiklos Szeredi2018-07-065-19/+21
| | | | | | | | | | | | | | | | | | | | Clean up f_op->dedupe_file_range() interface. 1) Use loff_t for offsets and length instead of u64 2) Order the arguments the same way as {copy|clone}_file_range(). Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
| * vfs: dedupe: return intMiklos Szeredi2018-07-065-39/+15
| | | | | | | | Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
| * vfs: limit size of dedupeMiklos Szeredi2018-07-061-0/+3
| | | | | | | | | | Suggested-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
* | Merge branch 'for-ovl' of ↵Miklos Szeredi2018-07-1810-132/+99
|\ \ | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs into overlayfs-next This gives us the open_with_fake_path() helper that is needed for stacked open files in overlay and mmap in particular.
| * | new helper: open_with_fake_path()Al Viro2018-07-121-0/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | open a file by given inode, faking ->f_path. Use with shitloads of caution - at the very least you'd damn better make sure that some dentry alias of that inode is pinned down by the path in question. Again, this is no general-purpose interface and I hope it will eventually go away. Right now overlayfs wants something like that, but nothing else should. Any out-of-tree code with bright idea of using this one *will* eventually get hurt, with zero notice and great delight on my part. I refuse to use EXPORT_SYMBOL_GPL(), especially in situations when it's really EXPORT_SYMBOL_DONT_USE_IT(), but don't take that export as "you are welcome to use it". Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | now we can fold open_check_o_direct() into do_dentry_open()Al Viro2018-07-123-19/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | These checks are better off in do_dentry_open(); the reason we couldn't put them there used to be that callers couldn't tell what kind of cleanup would do_dentry_open() failure call for. Now that we have FMODE_OPENED, cleanup is the same in all cases - it's simply fput(). So let's fold that into do_dentry_open(), as Christoph's patch tried to. Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | lift fput() on late failures into path_openat()Al Viro2018-07-121-16/+12
| | | | | | | | | | | | | | | Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | fold put_filp() into fput()Al Viro2018-07-123-20/+10
| | | | | | | | | | | | | | | | | | | | | Just check FMODE_OPENED in __fput() and be done with that... Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | introduce FMODE_OPENEDAl Viro2018-07-122-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | basically, "is that instance set up enough for regular fput(), or do we want put_filp() for that one". NOTE: the only alloc_file() caller that could be followed by put_filp() is in arch/ia64/kernel/perfmon.c, which is (Kconfig-level) broken. Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | security_file_open(): lose cred argumentAl Viro2018-07-121-1/+1
| | | | | | | | | | | | | | | Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | get rid of cred argument of vfs_open() and do_dentry_open()Al Viro2018-07-123-12/+9
| | | | | | | | | | | | | | | | | | | | | always equal to ->f_cred Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | pass ->f_flags value to alloc_empty_file()Al Viro2018-07-124-13/+9
| | | | | | | | | | | | | | | | | | ... and have it set the f_flags-derived part of ->f_mode. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | pass creds to get_empty_filp(), make sure dentry_open() passes the right credsAl Viro2018-07-124-6/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ... and rename get_empty_filp() to alloc_empty_file(). dentry_open() gets creds as argument, but the only thing that sees those is security_file_open() - file->f_cred still ends up with current_cred(). For almost all callers it's the same thing, but there are several broken cases. Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | alloc_file(): switch to passing O_... flags instead of FMODE_... modeAl Viro2018-07-125-22/+17
| | | | | | | | | | | | | | | | | | | | | ... so that it could set both ->f_flags and ->f_mode, without callers having to set ->f_flags manually. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| * | make sure do_dentry_open() won't return positive as an errorAl Viro2018-07-101-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | An ->open() instances really, really should not be doing that. There's a lot of places e.g. around atomic_open() that could be confused by that, so let's catch that early. Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>