mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	Partially revert "locks: fix file locking on overlayfs"
This partially reverts commit c568d68341.
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>
			
			
This commit is contained in:
		
							parent
							
								
									8cf9ee5061
								
							
						
					
					
						commit
						de2a4a501e
					
				
					 3 changed files with 8 additions and 24 deletions
				
			
		
							
								
								
									
										17
									
								
								fs/locks.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								fs/locks.c
									
									
									
									
									
								
							|  | @ -139,11 +139,6 @@ | |||
| #define IS_OFDLCK(fl)	(fl->fl_flags & FL_OFDLCK) | ||||
| #define IS_REMOTELCK(fl)	(fl->fl_pid <= 0) | ||||
| 
 | ||||
| static inline bool is_remote_lock(struct file *filp) | ||||
| { | ||||
| 	return likely(!(filp->f_path.dentry->d_sb->s_flags & SB_NOREMOTELOCK)); | ||||
| } | ||||
| 
 | ||||
| static bool lease_breaking(struct file_lock *fl) | ||||
| { | ||||
| 	return fl->fl_flags & (FL_UNLOCK_PENDING | FL_DOWNGRADE_PENDING); | ||||
|  | @ -1875,7 +1870,7 @@ EXPORT_SYMBOL(generic_setlease); | |||
| int | ||||
| vfs_setlease(struct file *filp, long arg, struct file_lock **lease, void **priv) | ||||
| { | ||||
| 	if (filp->f_op->setlease && is_remote_lock(filp)) | ||||
| 	if (filp->f_op->setlease) | ||||
| 		return filp->f_op->setlease(filp, arg, lease, priv); | ||||
| 	else | ||||
| 		return generic_setlease(filp, arg, lease, priv); | ||||
|  | @ -2022,7 +2017,7 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd) | |||
| 	if (error) | ||||
| 		goto out_free; | ||||
| 
 | ||||
| 	if (f.file->f_op->flock && is_remote_lock(f.file)) | ||||
| 	if (f.file->f_op->flock) | ||||
| 		error = f.file->f_op->flock(f.file, | ||||
| 					  (can_sleep) ? F_SETLKW : F_SETLK, | ||||
| 					  lock); | ||||
|  | @ -2048,7 +2043,7 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd) | |||
|  */ | ||||
| int vfs_test_lock(struct file *filp, struct file_lock *fl) | ||||
| { | ||||
| 	if (filp->f_op->lock && is_remote_lock(filp)) | ||||
| 	if (filp->f_op->lock) | ||||
| 		return filp->f_op->lock(filp, F_GETLK, fl); | ||||
| 	posix_test_lock(filp, fl); | ||||
| 	return 0; | ||||
|  | @ -2191,7 +2186,7 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock) | |||
|  */ | ||||
| int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl, struct file_lock *conf) | ||||
| { | ||||
| 	if (filp->f_op->lock && is_remote_lock(filp)) | ||||
| 	if (filp->f_op->lock) | ||||
| 		return filp->f_op->lock(filp, cmd, fl); | ||||
| 	else | ||||
| 		return posix_lock_file(filp, fl, conf); | ||||
|  | @ -2513,7 +2508,7 @@ locks_remove_flock(struct file *filp, struct file_lock_context *flctx) | |||
| 	if (list_empty(&flctx->flc_flock)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (filp->f_op->flock && is_remote_lock(filp)) | ||||
| 	if (filp->f_op->flock) | ||||
| 		filp->f_op->flock(filp, F_SETLKW, &fl); | ||||
| 	else | ||||
| 		flock_lock_inode(inode, &fl); | ||||
|  | @ -2600,7 +2595,7 @@ EXPORT_SYMBOL(posix_unblock_lock); | |||
|  */ | ||||
| int vfs_cancel_lock(struct file *filp, struct file_lock *fl) | ||||
| { | ||||
| 	if (filp->f_op->lock && is_remote_lock(filp)) | ||||
| 	if (filp->f_op->lock) | ||||
| 		return filp->f_op->lock(filp, F_CANCELLK, fl); | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -1456,7 +1456,7 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) | |||
| 	sb->s_op = &ovl_super_operations; | ||||
| 	sb->s_xattr = ovl_xattr_handlers; | ||||
| 	sb->s_fs_info = ofs; | ||||
| 	sb->s_flags |= SB_POSIXACL | SB_NOREMOTELOCK; | ||||
| 	sb->s_flags |= SB_POSIXACL; | ||||
| 
 | ||||
| 	err = -ENOMEM; | ||||
| 	root_dentry = d_make_root(ovl_new_inode(sb, S_IFDIR, 0)); | ||||
|  |  | |||
|  | @ -1054,17 +1054,7 @@ struct file_lock_context { | |||
| 
 | ||||
| extern void send_sigio(struct fown_struct *fown, int fd, int band); | ||||
| 
 | ||||
| /*
 | ||||
|  * Return the inode to use for locking | ||||
|  * | ||||
|  * For overlayfs this should be the overlay inode, not the real inode returned | ||||
|  * by file_inode().  For any other fs file_inode(filp) and locks_inode(filp) are | ||||
|  * equal. | ||||
|  */ | ||||
| static inline struct inode *locks_inode(const struct file *f) | ||||
| { | ||||
| 	return f->f_path.dentry->d_inode; | ||||
| } | ||||
| #define locks_inode(f) file_inode(f) | ||||
| 
 | ||||
| #ifdef CONFIG_FILE_LOCKING | ||||
| extern int fcntl_getlk(struct file *, unsigned int, struct flock *); | ||||
|  | @ -1305,7 +1295,6 @@ extern int send_sigurg(struct fown_struct *fown); | |||
| 
 | ||||
| /* These sb flags are internal to the kernel */ | ||||
| #define SB_SUBMOUNT     (1<<26) | ||||
| #define SB_NOREMOTELOCK	(1<<27) | ||||
| #define SB_NOSEC	(1<<28) | ||||
| #define SB_BORN		(1<<29) | ||||
| #define SB_ACTIVE	(1<<30) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Miklos Szeredi
						Miklos Szeredi