forked from mirrors/linux
		
	 658afed19c
			
		
	
	
		658afed19c
		
	
	
	
	
		
			
			Instead of propagating the fmode_t, just use a bool to track if a mtd block device was opened for writing. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Acked-by: Christian Brauner <brauner@kernel.org> Acked-by: Richard Weinberger <richard@nod.at> Link: https://lore.kernel.org/r/20230608110258.189493-23-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0-or-later */
 | |
| /*
 | |
|  * Copyright © 2003-2010 David Woodhouse <dwmw2@infradead.org>
 | |
|  */
 | |
| 
 | |
| #ifndef __MTD_TRANS_H__
 | |
| #define __MTD_TRANS_H__
 | |
| 
 | |
| #include <linux/mutex.h>
 | |
| #include <linux/kref.h>
 | |
| #include <linux/sysfs.h>
 | |
| 
 | |
| struct hd_geometry;
 | |
| struct mtd_info;
 | |
| struct mtd_blktrans_ops;
 | |
| struct file;
 | |
| struct inode;
 | |
| 
 | |
| struct mtd_blktrans_dev {
 | |
| 	struct mtd_blktrans_ops *tr;
 | |
| 	struct list_head list;
 | |
| 	struct mtd_info *mtd;
 | |
| 	struct mutex lock;
 | |
| 	int devnum;
 | |
| 	bool bg_stop;
 | |
| 	unsigned long size;
 | |
| 	int readonly;
 | |
| 	int open;
 | |
| 	struct kref ref;
 | |
| 	struct gendisk *disk;
 | |
| 	struct attribute_group *disk_attributes;
 | |
| 	struct request_queue *rq;
 | |
| 	struct list_head rq_list;
 | |
| 	struct blk_mq_tag_set *tag_set;
 | |
| 	spinlock_t queue_lock;
 | |
| 	void *priv;
 | |
| 	bool writable;
 | |
| };
 | |
| 
 | |
| struct mtd_blktrans_ops {
 | |
| 	char *name;
 | |
| 	int major;
 | |
| 	int part_bits;
 | |
| 	int blksize;
 | |
| 	int blkshift;
 | |
| 
 | |
| 	/* Access functions */
 | |
| 	int (*readsect)(struct mtd_blktrans_dev *dev,
 | |
| 		    unsigned long block, char *buffer);
 | |
| 	int (*writesect)(struct mtd_blktrans_dev *dev,
 | |
| 		     unsigned long block, char *buffer);
 | |
| 	int (*discard)(struct mtd_blktrans_dev *dev,
 | |
| 		       unsigned long block, unsigned nr_blocks);
 | |
| 	void (*background)(struct mtd_blktrans_dev *dev);
 | |
| 
 | |
| 	/* Block layer ioctls */
 | |
| 	int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);
 | |
| 	int (*flush)(struct mtd_blktrans_dev *dev);
 | |
| 
 | |
| 	/* Called with mtd_table_mutex held; no race with add/remove */
 | |
| 	int (*open)(struct mtd_blktrans_dev *dev);
 | |
| 	void (*release)(struct mtd_blktrans_dev *dev);
 | |
| 
 | |
| 	/* Called on {de,}registration and on subsequent addition/removal
 | |
| 	   of devices, with mtd_table_mutex held. */
 | |
| 	void (*add_mtd)(struct mtd_blktrans_ops *tr, struct mtd_info *mtd);
 | |
| 	void (*remove_dev)(struct mtd_blktrans_dev *dev);
 | |
| 
 | |
| 	struct list_head devs;
 | |
| 	struct list_head list;
 | |
| 	struct module *owner;
 | |
| };
 | |
| 
 | |
| extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr);
 | |
| extern int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr);
 | |
| extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
 | |
| extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev);
 | |
| extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev);
 | |
| 
 | |
| /**
 | |
|  * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver
 | |
|  * @__mtd_blktrans: mtd_blktrans_ops struct
 | |
|  *
 | |
|  * Helper macro for mtd blktrans drivers which do not do anything special in
 | |
|  * module init/exit. This eliminates a lot of boilerplate. Each module may only
 | |
|  * use this macro once, and calling it replaces module_init() and module_exit()
 | |
|  */
 | |
| #define module_mtd_blktrans(__mtd_blktrans) \
 | |
| 	module_driver(__mtd_blktrans, register_mtd_blktrans, \
 | |
| 					deregister_mtd_blktrans)
 | |
| 
 | |
| #endif /* __MTD_TRANS_H__ */
 |