diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/file.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/locking.h | 1 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.c | 10 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 11 | ||||
| -rw-r--r-- | fs/btrfs/volumes.c | 6 | ||||
| -rw-r--r-- | fs/cifs/cifsfs.c | 1 | ||||
| -rw-r--r-- | fs/compat.c | 15 | ||||
| -rw-r--r-- | fs/ext2/ialloc.c | 1 | ||||
| -rw-r--r-- | fs/ext2/inode.c | 2 | ||||
| -rw-r--r-- | fs/ext3/super.c | 4 | ||||
| -rw-r--r-- | fs/ext4/super.c | 2 | ||||
| -rw-r--r-- | fs/freevxfs/vxfs_super.c | 1 | ||||
| -rw-r--r-- | fs/hostfs/hostfs_kern.c | 10 | ||||
| -rw-r--r-- | fs/hpfs/super.c | 1 | ||||
| -rw-r--r-- | fs/isofs/inode.c | 1 | ||||
| -rw-r--r-- | fs/nfs/super.c | 1 | ||||
| -rw-r--r-- | fs/nfsd/nfs4state.c | 36 | ||||
| -rw-r--r-- | fs/pipe.c | 3 | ||||
| -rw-r--r-- | fs/quota/dquot.c | 5 | ||||
| -rw-r--r-- | fs/reiserfs/super.c | 4 | ||||
| -rw-r--r-- | fs/squashfs/super.c | 1 | ||||
| -rw-r--r-- | fs/sysv/super.c | 1 | ||||
| -rw-r--r-- | fs/udf/super.c | 1 | 
25 files changed, 58 insertions, 69 deletions
| diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 3e074dab2d5..9ac2eca681e 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1467,8 +1467,11 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,  	if (ret && !insert) {  		err = -ENOENT;  		goto out; +	} else if (ret) { +		err = -EIO; +		WARN_ON(1); +		goto out;  	} -	BUG_ON(ret); /* Corruption */  	leaf = path->nodes[0];  	item_size = btrfs_item_size_nr(leaf, path->slots[0]); diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index af1d0605a5c..5b4ea5f55b8 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -591,6 +591,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,  		}  		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);  		clear_bit(EXTENT_FLAG_PINNED, &em->flags); +		clear_bit(EXTENT_FLAG_LOGGING, &flags);  		remove_extent_mapping(em_tree, em);  		if (no_splits)  			goto next; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d1470adca8f..ca1b767d51f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2312,6 +2312,7 @@ again:  	key.type = BTRFS_EXTENT_DATA_KEY;  	key.offset = start; +	path->leave_spinning = 1;  	if (merge) {  		struct btrfs_file_extent_item *fi;  		u64 extent_len; @@ -2368,6 +2369,7 @@ again:  	btrfs_mark_buffer_dirty(leaf);  	inode_add_bytes(inode, len); +	btrfs_release_path(path);  	ret = btrfs_inc_extent_ref(trans, root, new->bytenr,  			new->disk_len, 0, @@ -2381,6 +2383,7 @@ again:  	ret = 1;  out_free_path:  	btrfs_release_path(path); +	path->leave_spinning = 0;  	btrfs_end_transaction(trans, root);  out_unlock:  	unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start, lock_end, diff --git a/fs/btrfs/locking.h b/fs/btrfs/locking.h index ca52681e5f4..b81e0e9a489 100644 --- a/fs/btrfs/locking.h +++ b/fs/btrfs/locking.h @@ -26,7 +26,6 @@  void btrfs_tree_lock(struct extent_buffer *eb);  void btrfs_tree_unlock(struct extent_buffer *eb); -int btrfs_try_spin_lock(struct extent_buffer *eb);  void btrfs_tree_read_lock(struct extent_buffer *eb);  void btrfs_tree_read_unlock(struct extent_buffer *eb); diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index aee4b1cc3d9..5471e47d655 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -1525,21 +1525,23 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes)  		if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) &&  		    qg->reserved + qg->rfer + num_bytes > -		    qg->max_rfer) +		    qg->max_rfer) {  			ret = -EDQUOT; +			goto out; +		}  		if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_EXCL) &&  		    qg->reserved + qg->excl + num_bytes > -		    qg->max_excl) +		    qg->max_excl) {  			ret = -EDQUOT; +			goto out; +		}  		list_for_each_entry(glist, &qg->groups, next_group) {  			ulist_add(ulist, glist->group->qgroupid,  				  (uintptr_t)glist->group, GFP_ATOMIC);  		}  	} -	if (ret) -		goto out;  	/*  	 * no limits exceeded, now record the reservation into all qgroups diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 9250b9c4f01..50767bbaad6 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -625,14 +625,13 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,  	btrfs_trans_release_metadata(trans, root);  	trans->block_rsv = NULL; -	/* -	 * the same root has to be passed to start_transaction and -	 * end_transaction. Subvolume quota depends on this. -	 */ -	WARN_ON(trans->root != root);  	if (trans->qgroup_reserved) { -		btrfs_qgroup_free(root, trans->qgroup_reserved); +		/* +		 * the same root has to be passed here between start_transaction +		 * and end_transaction. Subvolume quota depends on this. +		 */ +		btrfs_qgroup_free(trans->root, trans->qgroup_reserved);  		trans->qgroup_reserved = 0;  	} diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 6b9cff42265..5989a92236f 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -684,6 +684,12 @@ int btrfs_close_devices(struct btrfs_fs_devices *fs_devices)  		__btrfs_close_devices(fs_devices);  		free_fs_devices(fs_devices);  	} +	/* +	 * Wait for rcu kworkers under __btrfs_close_devices +	 * to finish all blkdev_puts so device is really +	 * free when umount is done. +	 */ +	rcu_barrier();  	return ret;  } diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 1a052c0eee8..3cf8a15af91 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -777,6 +777,7 @@ struct file_system_type cifs_fs_type = {  	.kill_sb = cifs_kill_sb,  	/*  .fs_flags */  }; +MODULE_ALIAS_FS("cifs");  const struct inode_operations cifs_dir_inode_ops = {  	.create = cifs_create,  	.atomic_open = cifs_atomic_open, diff --git a/fs/compat.c b/fs/compat.c index fe40fde2911..d487985dd0e 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -558,6 +558,10 @@ ssize_t compat_rw_copy_check_uvector(int type,  	}  	*ret_pointer = iov; +	ret = -EFAULT; +	if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector))) +		goto out; +  	/*  	 * Single unix specification:  	 * We should -EINVAL if an element length is not >= 0 and fitting an @@ -1080,17 +1084,12 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,  	if (!file->f_op)  		goto out; -	ret = -EFAULT; -	if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector))) -		goto out; - -	tot_len = compat_rw_copy_check_uvector(type, uvector, nr_segs, +	ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,  					       UIO_FASTIOV, iovstack, &iov); -	if (tot_len == 0) { -		ret = 0; +	if (ret <= 0)  		goto out; -	} +	tot_len = ret;  	ret = rw_verify_area(type, file, pos, tot_len);  	if (ret < 0)  		goto out; diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index 8f370e012e6..7cadd823bb3 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -118,7 +118,6 @@ void ext2_free_inode (struct inode * inode)  	 * as writing the quota to disk may need the lock as well.  	 */  	/* Quota is already initialized in iput() */ -	ext2_xattr_delete_inode(inode);  	dquot_free_inode(inode);  	dquot_drop(inode); diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index c3881e56662..fe60cc1117d 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -34,6 +34,7 @@  #include "ext2.h"  #include "acl.h"  #include "xip.h" +#include "xattr.h"  static int __ext2_write_inode(struct inode *inode, int do_sync); @@ -88,6 +89,7 @@ void ext2_evict_inode(struct inode * inode)  		inode->i_size = 0;  		if (inode->i_blocks)  			ext2_truncate_blocks(inode, 0); +		ext2_xattr_delete_inode(inode);  	}  	invalidate_inode_buffers(inode); diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 1d6e2ed8532..fb5120a5505 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -353,7 +353,7 @@ static struct block_device *ext3_blkdev_get(dev_t dev, struct super_block *sb)  	return bdev;  fail: -	ext3_msg(sb, "error: failed to open journal device %s: %ld", +	ext3_msg(sb, KERN_ERR, "error: failed to open journal device %s: %ld",  		__bdevname(dev, b), PTR_ERR(bdev));  	return NULL; @@ -887,7 +887,7 @@ static ext3_fsblk_t get_sb_block(void **data, struct super_block *sb)  	/*todo: use simple_strtoll with >32bit ext3 */  	sb_block = simple_strtoul(options, &options, 0);  	if (*options && *options != ',') { -		ext3_msg(sb, "error: invalid sb specification: %s", +		ext3_msg(sb, KERN_ERR, "error: invalid sb specification: %s",  		       (char *) *data);  		return 1;  	} diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 34e85521923..b3818b48f41 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -91,6 +91,7 @@ static struct file_system_type ext2_fs_type = {  	.fs_flags	= FS_REQUIRES_DEV,  };  MODULE_ALIAS_FS("ext2"); +MODULE_ALIAS("ext2");  #define IS_EXT2_SB(sb) ((sb)->s_bdev->bd_holder == &ext2_fs_type)  #else  #define IS_EXT2_SB(sb) (0) @@ -106,6 +107,7 @@ static struct file_system_type ext3_fs_type = {  	.fs_flags	= FS_REQUIRES_DEV,  };  MODULE_ALIAS_FS("ext3"); +MODULE_ALIAS("ext3");  #define IS_EXT3_SB(sb) ((sb)->s_bdev->bd_holder == &ext3_fs_type)  #else  #define IS_EXT3_SB(sb) (0) diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index 45507430806..e37eb274e49 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c @@ -258,6 +258,7 @@ static struct file_system_type vxfs_fs_type = {  	.fs_flags	= FS_REQUIRES_DEV,  };  MODULE_ALIAS_FS("vxfs"); /* makes mount -t vxfs autoload the module */ +MODULE_ALIAS("vxfs");  static int __init  vxfs_init(void) diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index fbabb906066..0f6e52d22b8 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -845,15 +845,8 @@ int hostfs_setattr(struct dentry *dentry, struct iattr *attr)  		return err;  	if ((attr->ia_valid & ATTR_SIZE) && -	    attr->ia_size != i_size_read(inode)) { -		int error; - -		error = inode_newsize_ok(inode, attr->ia_size); -		if (error) -			return error; - +	    attr->ia_size != i_size_read(inode))  		truncate_setsize(inode, attr->ia_size); -	}  	setattr_copy(inode, attr);  	mark_inode_dirty(inode); @@ -993,6 +986,7 @@ static struct file_system_type hostfs_type = {  	.kill_sb	= hostfs_kill_sb,  	.fs_flags 	= 0,  }; +MODULE_ALIAS_FS("hostfs");  static int __init init_hostfs(void)  { diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index a3076228523..a0617e70695 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c @@ -688,6 +688,7 @@ static struct file_system_type hpfs_fs_type = {  	.kill_sb	= kill_block_super,  	.fs_flags	= FS_REQUIRES_DEV,  }; +MODULE_ALIAS_FS("hpfs");  static int __init init_hpfs_fs(void)  { diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index a67f16e846a..d9b8aebdeb2 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -1557,6 +1557,7 @@ static struct file_system_type iso9660_fs_type = {  	.fs_flags	= FS_REQUIRES_DEV,  };  MODULE_ALIAS_FS("iso9660"); +MODULE_ALIAS("iso9660");  static int __init init_iso9660_fs(void)  { diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 95cdcb208df..2f8a29db0f1 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -335,6 +335,7 @@ struct file_system_type nfs4_fs_type = {  	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  MODULE_ALIAS_FS("nfs4"); +MODULE_ALIAS("nfs4");  EXPORT_SYMBOL_GPL(nfs4_fs_type);  static int __init register_nfs4_fs(void) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 16d39c6c4fb..2e27430b907 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -230,37 +230,6 @@ static void nfs4_file_put_access(struct nfs4_file *fp, int oflag)  		__nfs4_file_put_access(fp, oflag);  } -static inline int get_new_stid(struct nfs4_stid *stid) -{ -	static int min_stateid = 0; -	struct idr *stateids = &stid->sc_client->cl_stateids; -	int new_stid; -	int error; - -	error = idr_get_new_above(stateids, stid, min_stateid, &new_stid); -	/* -	 * Note: the necessary preallocation was done in -	 * nfs4_alloc_stateid().  The idr code caps the number of -	 * preallocations that can exist at a time, but the state lock -	 * prevents anyone from using ours before we get here: -	 */ -	WARN_ON_ONCE(error); -	/* -	 * It shouldn't be a problem to reuse an opaque stateid value. -	 * I don't think it is for 4.1.  But with 4.0 I worry that, for -	 * example, a stray write retransmission could be accepted by -	 * the server when it should have been rejected.  Therefore, -	 * adopt a trick from the sctp code to attempt to maximize the -	 * amount of time until an id is reused, by ensuring they always -	 * "increase" (mod INT_MAX): -	 */ - -	min_stateid = new_stid+1; -	if (min_stateid == INT_MAX) -		min_stateid = 0; -	return new_stid; -} -  static struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct  kmem_cache *slab)  { @@ -273,9 +242,8 @@ kmem_cache *slab)  	if (!stid)  		return NULL; -	if (!idr_pre_get(stateids, GFP_KERNEL)) -		goto out_free; -	if (idr_get_new_above(stateids, stid, min_stateid, &new_id)) +	new_id = idr_alloc(stateids, stid, min_stateid, 0, GFP_KERNEL); +	if (new_id < 0)  		goto out_free;  	stid->sc_client = cl;  	stid->sc_type = 0; diff --git a/fs/pipe.c b/fs/pipe.c index 64a494cef0a..2234f3f61f8 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -863,6 +863,9 @@ pipe_rdwr_open(struct inode *inode, struct file *filp)  {  	int ret = -ENOENT; +	if (!(filp->f_mode & (FMODE_READ|FMODE_WRITE))) +		return -EINVAL; +  	mutex_lock(&inode->i_mutex);  	if (inode->i_pipe) { diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 05ae3c97f7a..3e64169ef52 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -1439,8 +1439,11 @@ static void __dquot_initialize(struct inode *inode, int type)  			 * did a write before quota was turned on  			 */  			rsv = inode_get_rsv_space(inode); -			if (unlikely(rsv)) +			if (unlikely(rsv)) { +				spin_lock(&dq_data_lock);  				dquot_resv_space(inode->i_dquot[cnt], rsv); +				spin_unlock(&dq_data_lock); +			}  		}  	}  out_err: diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 194113b1b11..f8a23c3078f 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -1147,8 +1147,7 @@ static int reiserfs_parse_options(struct super_block *s, char *options,	/* strin  							 "on filesystem root.");  					return 0;  				} -				qf_names[qtype] = -				    kmalloc(strlen(arg) + 1, GFP_KERNEL); +				qf_names[qtype] = kstrdup(arg, GFP_KERNEL);  				if (!qf_names[qtype]) {  					reiserfs_warning(s, "reiserfs-2502",  							 "not enough memory " @@ -1156,7 +1155,6 @@ static int reiserfs_parse_options(struct super_block *s, char *options,	/* strin  							 "quotafile name.");  					return 0;  				} -				strcpy(qf_names[qtype], arg);  				if (qtype == USRQUOTA)  					*mount_options |= 1 << REISERFS_USRQUOTA;  				else diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 260e3928d4f..60553a9053c 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -489,6 +489,7 @@ static struct file_system_type squashfs_fs_type = {  	.kill_sb = kill_block_super,  	.fs_flags = FS_REQUIRES_DEV  }; +MODULE_ALIAS_FS("squashfs");  static const struct super_operations squashfs_super_ops = {  	.alloc_inode = squashfs_alloc_inode, diff --git a/fs/sysv/super.c b/fs/sysv/super.c index a39938b1fee..d0c6a007ce8 100644 --- a/fs/sysv/super.c +++ b/fs/sysv/super.c @@ -555,6 +555,7 @@ static struct file_system_type v7_fs_type = {  	.fs_flags	= FS_REQUIRES_DEV,  };  MODULE_ALIAS_FS("v7"); +MODULE_ALIAS("v7");  static int __init init_sysv_fs(void)  { diff --git a/fs/udf/super.c b/fs/udf/super.c index bc5b30a819e..9ac4057a86c 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -118,6 +118,7 @@ static struct file_system_type udf_fstype = {  	.kill_sb	= kill_block_super,  	.fs_flags	= FS_REQUIRES_DEV,  }; +MODULE_ALIAS_FS("udf");  static struct kmem_cache *udf_inode_cachep; |