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_OFDLCK(fl)	(fl->fl_flags & FL_OFDLCK) | ||||||
| #define IS_REMOTELCK(fl)	(fl->fl_pid <= 0) | #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) | static bool lease_breaking(struct file_lock *fl) | ||||||
| { | { | ||||||
| 	return fl->fl_flags & (FL_UNLOCK_PENDING | FL_DOWNGRADE_PENDING); | 	return fl->fl_flags & (FL_UNLOCK_PENDING | FL_DOWNGRADE_PENDING); | ||||||
|  | @ -1875,7 +1870,7 @@ EXPORT_SYMBOL(generic_setlease); | ||||||
| int | int | ||||||
| vfs_setlease(struct file *filp, long arg, struct file_lock **lease, void **priv) | 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); | 		return filp->f_op->setlease(filp, arg, lease, priv); | ||||||
| 	else | 	else | ||||||
| 		return generic_setlease(filp, arg, lease, priv); | 		return generic_setlease(filp, arg, lease, priv); | ||||||
|  | @ -2022,7 +2017,7 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd) | ||||||
| 	if (error) | 	if (error) | ||||||
| 		goto out_free; | 		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, | 		error = f.file->f_op->flock(f.file, | ||||||
| 					  (can_sleep) ? F_SETLKW : F_SETLK, | 					  (can_sleep) ? F_SETLKW : F_SETLK, | ||||||
| 					  lock); | 					  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) | 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); | 		return filp->f_op->lock(filp, F_GETLK, fl); | ||||||
| 	posix_test_lock(filp, fl); | 	posix_test_lock(filp, fl); | ||||||
| 	return 0; | 	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) | 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); | 		return filp->f_op->lock(filp, cmd, fl); | ||||||
| 	else | 	else | ||||||
| 		return posix_lock_file(filp, fl, conf); | 		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)) | 	if (list_empty(&flctx->flc_flock)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (filp->f_op->flock && is_remote_lock(filp)) | 	if (filp->f_op->flock) | ||||||
| 		filp->f_op->flock(filp, F_SETLKW, &fl); | 		filp->f_op->flock(filp, F_SETLKW, &fl); | ||||||
| 	else | 	else | ||||||
| 		flock_lock_inode(inode, &fl); | 		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) | 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 filp->f_op->lock(filp, F_CANCELLK, fl); | ||||||
| 	return 0; | 	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_op = &ovl_super_operations; | ||||||
| 	sb->s_xattr = ovl_xattr_handlers; | 	sb->s_xattr = ovl_xattr_handlers; | ||||||
| 	sb->s_fs_info = ofs; | 	sb->s_fs_info = ofs; | ||||||
| 	sb->s_flags |= SB_POSIXACL | SB_NOREMOTELOCK; | 	sb->s_flags |= SB_POSIXACL; | ||||||
| 
 | 
 | ||||||
| 	err = -ENOMEM; | 	err = -ENOMEM; | ||||||
| 	root_dentry = d_make_root(ovl_new_inode(sb, S_IFDIR, 0)); | 	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); | extern void send_sigio(struct fown_struct *fown, int fd, int band); | ||||||
| 
 | 
 | ||||||
| /*
 | #define locks_inode(f) file_inode(f) | ||||||
|  * 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; |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_FILE_LOCKING | #ifdef CONFIG_FILE_LOCKING | ||||||
| extern int fcntl_getlk(struct file *, unsigned int, struct flock *); | 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 */ | /* These sb flags are internal to the kernel */ | ||||||
| #define SB_SUBMOUNT     (1<<26) | #define SB_SUBMOUNT     (1<<26) | ||||||
| #define SB_NOREMOTELOCK	(1<<27) |  | ||||||
| #define SB_NOSEC	(1<<28) | #define SB_NOSEC	(1<<28) | ||||||
| #define SB_BORN		(1<<29) | #define SB_BORN		(1<<29) | ||||||
| #define SB_ACTIVE	(1<<30) | #define SB_ACTIVE	(1<<30) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Miklos Szeredi
						Miklos Szeredi