diff options
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 33 | 
1 files changed, 29 insertions, 4 deletions
| diff --git a/include/linux/fs.h b/include/linux/fs.h index e11d60cc867b..f0890e4a7c25 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -387,7 +387,7 @@ struct address_space {  	struct inode		*host;		/* owner: inode, block_device */  	struct radix_tree_root	page_tree;	/* radix tree of all pages */  	spinlock_t		tree_lock;	/* and lock protecting it */ -	unsigned int		i_mmap_writable;/* count VM_SHARED mappings */ +	atomic_t		i_mmap_writable;/* count VM_SHARED mappings */  	struct rb_root		i_mmap;		/* tree of private and shared mappings */  	struct list_head	i_mmap_nonlinear;/*list VM_NONLINEAR mappings */  	struct mutex		i_mmap_mutex;	/* protect tree, count, list */ @@ -470,10 +470,35 @@ static inline int mapping_mapped(struct address_space *mapping)   * Note that i_mmap_writable counts all VM_SHARED vmas: do_mmap_pgoff   * marks vma as VM_SHARED if it is shared, and the file was opened for   * writing i.e. vma may be mprotected writable even if now readonly. + * + * If i_mmap_writable is negative, no new writable mappings are allowed. You + * can only deny writable mappings, if none exists right now.   */  static inline int mapping_writably_mapped(struct address_space *mapping)  { -	return mapping->i_mmap_writable != 0; +	return atomic_read(&mapping->i_mmap_writable) > 0; +} + +static inline int mapping_map_writable(struct address_space *mapping) +{ +	return atomic_inc_unless_negative(&mapping->i_mmap_writable) ? +		0 : -EPERM; +} + +static inline void mapping_unmap_writable(struct address_space *mapping) +{ +	atomic_dec(&mapping->i_mmap_writable); +} + +static inline int mapping_deny_writable(struct address_space *mapping) +{ +	return atomic_dec_unless_positive(&mapping->i_mmap_writable) ? +		0 : -EBUSY; +} + +static inline void mapping_allow_writable(struct address_space *mapping) +{ +	atomic_inc(&mapping->i_mmap_writable);  }  /* @@ -833,7 +858,7 @@ static inline struct file *get_file(struct file *f)   *   * Lockd stuffs a "host" pointer into this.   */ -typedef struct files_struct *fl_owner_t; +typedef void *fl_owner_t;  struct file_lock_operations {  	void (*fl_copy_lock)(struct file_lock *, struct file_lock *); @@ -2688,7 +2713,7 @@ static const struct file_operations __fops = {				\  	.read	 = simple_attr_read,					\  	.write	 = simple_attr_write,					\  	.llseek	 = generic_file_llseek,					\ -}; +}  static inline __printf(1, 2)  void __simple_attr_check_format(const char *fmt, ...) | 
