mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-22 17:44:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/fs/Kconfig
 | |
| +++ b/fs/Kconfig
 | |
| @@ -62,6 +62,11 @@ config FILE_LOCKING
 | |
|            for filesystems like NFS and for the flock() system
 | |
|            call. Disabling this option saves about 11k.
 | |
|  
 | |
| +config DIRECT_IO
 | |
| +	bool "Enable O_DIRECT support" if EXPERT
 | |
| +	depends on BLOCK
 | |
| +	default y
 | |
| +
 | |
|  source "fs/notify/Kconfig"
 | |
|  
 | |
|  source "fs/quota/Kconfig"
 | |
| --- a/fs/Makefile
 | |
| +++ b/fs/Makefile
 | |
| @@ -14,7 +14,8 @@ obj-y :=	open.o read_write.o file_table.
 | |
|  		stack.o fs_struct.o statfs.o
 | |
|  
 | |
|  ifeq ($(CONFIG_BLOCK),y)
 | |
| -obj-y +=	buffer.o bio.o block_dev.o direct-io.o mpage.o ioprio.o
 | |
| +obj-y +=	buffer.o bio.o block_dev.o mpage.o ioprio.o
 | |
| +obj-$(CONFIG_DIRECT_IO) += direct-io.o
 | |
|  else
 | |
|  obj-y +=	no-block.o
 | |
|  endif
 | |
| --- a/include/linux/fs.h
 | |
| +++ b/include/linux/fs.h
 | |
| @@ -2632,12 +2632,26 @@ enum {
 | |
|  	DIO_SKIP_HOLES	= 0x02,
 | |
|  };
 | |
|  
 | |
| +#ifdef CONFIG_DIRECT_IO
 | |
|  void dio_end_io(struct bio *bio, int error);
 | |
|  
 | |
|  ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
 | |
|  	struct block_device *bdev, const struct iovec *iov, loff_t offset,
 | |
|  	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
 | |
|  	dio_submit_t submit_io,	int flags);
 | |
| +#else
 | |
| +static inline void dio_end_io(struct bio *bio, int error)
 | |
| +{
 | |
| +}
 | |
| +static inline ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
 | |
| +	struct block_device *bdev, const struct iovec *iov, loff_t offset,
 | |
| +	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
 | |
| +	dio_submit_t submit_io,	int flags)
 | |
| +{
 | |
| +	return -EOPNOTSUPP;
 | |
| +}
 | |
| +#endif
 | |
| +
 | |
|  
 | |
|  static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb,
 | |
|  		struct inode *inode, const struct iovec *iov, loff_t offset,
 | |
| --- a/fs/fcntl.c
 | |
| +++ b/fs/fcntl.c
 | |
| @@ -169,8 +169,10 @@ static int setfl(int fd, struct file * f
 | |
|  		   arg |= O_NONBLOCK;
 | |
|  
 | |
|  	if (arg & O_DIRECT) {
 | |
| +#ifdef CONFIG_DIRECT_IO
 | |
|  		if (!filp->f_mapping || !filp->f_mapping->a_ops ||
 | |
|  			!filp->f_mapping->a_ops->direct_IO)
 | |
| +#endif
 | |
|  				return -EINVAL;
 | |
|  	}
 | |
|  
 | |
| --- a/fs/open.c
 | |
| +++ b/fs/open.c
 | |
| @@ -636,9 +636,12 @@ int open_check_o_direct(struct file *f)
 | |
|  {
 | |
|  	/* NB: we're sure to have correct a_ops only after f_op->open */
 | |
|  	if (f->f_flags & O_DIRECT) {
 | |
| +#ifdef CONFIG_DIRECT_IO
 | |
|  		if (!f->f_mapping->a_ops ||
 | |
|  		    ((!f->f_mapping->a_ops->direct_IO) &&
 | |
| -		    (!f->f_mapping->a_ops->get_xip_mem))) {
 | |
| +		    (!f->f_mapping->a_ops->get_xip_mem)))
 | |
| +#endif
 | |
| +		{
 | |
|  			return -EINVAL;
 | |
|  		}
 | |
|  	}
 |