forked from mirrors/linux
		
	fs: remove no_llseek
Now that all callers of ->llseek are going through vfs_llseek(), we don't gain anything by keeping no_llseek around. Nothing actually calls it and setting ->llseek to no_lseek is completely equivalent to leaving it NULL. Longer term (== by the end of merge window) we want to remove all such intializations. To simplify the merge window this commit does *not* touch initializers - it only defines no_llseek as NULL (and simplifies the tests on file opening). At -rc1 we'll need do a mechanical removal of no_llseek - git grep -l -w no_llseek | grep -v porting.rst | while read i; do sed -i '/\<no_llseek\>/d' $i done would do it. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									97ef77c52b
								
							
						
					
					
						commit
						868941b144
					
				
					 7 changed files with 12 additions and 14 deletions
				
			
		|  | @ -914,3 +914,11 @@ Calling conventions for file_open_root() changed; now it takes struct path * | ||||||
| instead of passing mount and dentry separately.  For callers that used to | instead of passing mount and dentry separately.  For callers that used to | ||||||
| pass <mnt, mnt->mnt_root> pair (i.e. the root of given mount), a new helper | pass <mnt, mnt->mnt_root> pair (i.e. the root of given mount), a new helper | ||||||
| is provided - file_open_root_mnt().  In-tree users adjusted. | is provided - file_open_root_mnt().  In-tree users adjusted. | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | **mandatory** | ||||||
|  | 
 | ||||||
|  | no_llseek is gone; don't set .llseek to that - just leave it NULL instead. | ||||||
|  | Checks for "does that file have llseek(2), or should it fail with ESPIPE" | ||||||
|  | should be done by looking at FMODE_LSEEK in file->f_mode. | ||||||
|  |  | ||||||
|  | @ -552,8 +552,7 @@ EXPORT_SYMBOL(drm_release_noglobal); | ||||||
|  * Since events are used by the KMS API for vblank and page flip completion this |  * Since events are used by the KMS API for vblank and page flip completion this | ||||||
|  * means all modern display drivers must use it. |  * means all modern display drivers must use it. | ||||||
|  * |  * | ||||||
|  * @offset is ignored, DRM events are read like a pipe. Therefore drivers also |  * @offset is ignored, DRM events are read like a pipe. Polling support is | ||||||
|  * must set the &file_operation.llseek to no_llseek(). Polling support is |  | ||||||
|  * provided by drm_poll(). |  * provided by drm_poll(). | ||||||
|  * |  * | ||||||
|  * This function will only ever read a full event. Therefore userspace must |  * This function will only ever read a full event. Therefore userspace must | ||||||
|  |  | ||||||
|  | @ -235,7 +235,7 @@ static struct file *alloc_file(const struct path *path, int flags, | ||||||
| 	file->f_mapping = path->dentry->d_inode->i_mapping; | 	file->f_mapping = path->dentry->d_inode->i_mapping; | ||||||
| 	file->f_wb_err = filemap_sample_wb_err(file->f_mapping); | 	file->f_wb_err = filemap_sample_wb_err(file->f_mapping); | ||||||
| 	file->f_sb_err = file_sample_sb_err(file); | 	file->f_sb_err = file_sample_sb_err(file); | ||||||
| 	if (fop->llseek && fop->llseek != no_llseek) | 	if (fop->llseek) | ||||||
| 		file->f_mode |= FMODE_LSEEK; | 		file->f_mode |= FMODE_LSEEK; | ||||||
| 	if ((file->f_mode & FMODE_READ) && | 	if ((file->f_mode & FMODE_READ) && | ||||||
| 	     likely(fop->read || fop->read_iter)) | 	     likely(fop->read || fop->read_iter)) | ||||||
|  |  | ||||||
|  | @ -860,8 +860,6 @@ static int do_dentry_open(struct file *f, | ||||||
| 		f->f_mode |= FMODE_CAN_WRITE; | 		f->f_mode |= FMODE_CAN_WRITE; | ||||||
| 	if ((f->f_mode & FMODE_LSEEK) && !f->f_op->llseek) | 	if ((f->f_mode & FMODE_LSEEK) && !f->f_op->llseek) | ||||||
| 		f->f_mode &= ~FMODE_LSEEK; | 		f->f_mode &= ~FMODE_LSEEK; | ||||||
| 	if ((f->f_mode & FMODE_LSEEK) && f->f_op->llseek == no_llseek) |  | ||||||
| 		f->f_mode &= ~FMODE_LSEEK; |  | ||||||
| 	if (f->f_mapping->a_ops && f->f_mapping->a_ops->direct_IO) | 	if (f->f_mapping->a_ops && f->f_mapping->a_ops->direct_IO) | ||||||
| 		f->f_mode |= FMODE_CAN_ODIRECT; | 		f->f_mode |= FMODE_CAN_ODIRECT; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -227,12 +227,6 @@ loff_t noop_llseek(struct file *file, loff_t offset, int whence) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(noop_llseek); | EXPORT_SYMBOL(noop_llseek); | ||||||
| 
 | 
 | ||||||
| loff_t no_llseek(struct file *file, loff_t offset, int whence) |  | ||||||
| { |  | ||||||
| 	return -ESPIPE; |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(no_llseek); |  | ||||||
| 
 |  | ||||||
| loff_t default_llseek(struct file *file, loff_t offset, int whence) | loff_t default_llseek(struct file *file, loff_t offset, int whence) | ||||||
| { | { | ||||||
| 	struct inode *inode = file_inode(file); | 	struct inode *inode = file_inode(file); | ||||||
|  |  | ||||||
|  | @ -3022,7 +3022,7 @@ extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, | ||||||
| extern void | extern void | ||||||
| file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); | file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); | ||||||
| extern loff_t noop_llseek(struct file *file, loff_t offset, int whence); | extern loff_t noop_llseek(struct file *file, loff_t offset, int whence); | ||||||
| extern loff_t no_llseek(struct file *file, loff_t offset, int whence); | #define no_llseek NULL | ||||||
| extern loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize); | extern loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize); | ||||||
| extern loff_t generic_file_llseek(struct file *file, loff_t offset, int whence); | extern loff_t generic_file_llseek(struct file *file, loff_t offset, int whence); | ||||||
| extern loff_t generic_file_llseek_size(struct file *file, loff_t offset, | extern loff_t generic_file_llseek_size(struct file *file, loff_t offset, | ||||||
|  |  | ||||||
|  | @ -81,10 +81,9 @@ static bool bpf_iter_support_resched(struct seq_file *seq) | ||||||
| #define MAX_ITER_OBJECTS	1000000 | #define MAX_ITER_OBJECTS	1000000 | ||||||
| 
 | 
 | ||||||
| /* bpf_seq_read, a customized and simpler version for bpf iterator.
 | /* bpf_seq_read, a customized and simpler version for bpf iterator.
 | ||||||
|  * no_llseek is assumed for this file. |  | ||||||
|  * The following are differences from seq_read(): |  * The following are differences from seq_read(): | ||||||
|  *  . fixed buffer size (PAGE_SIZE) |  *  . fixed buffer size (PAGE_SIZE) | ||||||
|  *  . assuming no_llseek |  *  . assuming NULL ->llseek() | ||||||
|  *  . stop() may call bpf program, handling potential overflow there |  *  . stop() may call bpf program, handling potential overflow there | ||||||
|  */ |  */ | ||||||
| static ssize_t bpf_seq_read(struct file *file, char __user *buf, size_t size, | static ssize_t bpf_seq_read(struct file *file, char __user *buf, size_t size, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jason A. Donenfeld
						Jason A. Donenfeld