diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/anon_inodes.c | 4 | ||||
| -rw-r--r-- | fs/dcache.c | 4 | ||||
| -rw-r--r-- | fs/file.c | 19 | ||||
| -rw-r--r-- | fs/namei.c | 29 | ||||
| -rw-r--r-- | fs/nfsd/vfs.c | 1 | ||||
| -rw-r--r-- | fs/read_write.c | 4 | 
6 files changed, 22 insertions, 39 deletions
| diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 24084732b1d0..42fcc46e2cca 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -177,9 +177,6 @@ static int __init anon_inode_init(void)  {  	int error; -	error = register_filesystem(&anon_inode_fs_type); -	if (error) -		goto err_exit;  	anon_inode_mnt = kern_mount(&anon_inode_fs_type);  	if (IS_ERR(anon_inode_mnt)) {  		error = PTR_ERR(anon_inode_mnt); @@ -189,7 +186,6 @@ static int __init anon_inode_init(void)  err_unregister_filesystem:  	unregister_filesystem(&anon_inode_fs_type); -err_exit:  	panic(KERN_ERR "anon_inode_init() failed (%d)\n", error);  } diff --git a/fs/dcache.c b/fs/dcache.c index 265e0ce9769c..ca02c13a84aa 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2833,9 +2833,9 @@ static int prepend_name(char **buffer, int *buflen, struct qstr *name)  	u32 dlen = ACCESS_ONCE(name->len);  	char *p; -	if (*buflen < dlen + 1) -		return -ENAMETOOLONG;  	*buflen -= dlen + 1; +	if (*buflen < 0) +		return -ENAMETOOLONG;  	p = *buffer -= dlen + 1;  	*p++ = '/';  	while (dlen--) { diff --git a/fs/file.c b/fs/file.c index 60a45e9f5323..eb56a13dab3e 100644 --- a/fs/file.c +++ b/fs/file.c @@ -713,27 +713,16 @@ unsigned long __fdget_raw(unsigned int fd)  unsigned long __fdget_pos(unsigned int fd)  { -	struct files_struct *files = current->files; -	struct file *file; -	unsigned long v; - -	if (atomic_read(&files->count) == 1) { -		file = __fcheck_files(files, fd); -		v = 0; -	} else { -		file = __fget(fd, 0); -		v = FDPUT_FPUT; -	} -	if (!file) -		return 0; +	unsigned long v = __fdget(fd); +	struct file *file = (struct file *)(v & ~3); -	if (file->f_mode & FMODE_ATOMIC_POS) { +	if (file && (file->f_mode & FMODE_ATOMIC_POS)) {  		if (file_count(file) > 1) {  			v |= FDPUT_POS_UNLOCK;  			mutex_lock(&file->f_pos_lock);  		}  	} -	return v | (unsigned long)file; +	return v;  }  /* diff --git a/fs/namei.c b/fs/namei.c index 2f730ef9b4b3..4b491b431990 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1109,7 +1109,7 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,  			return false;  		if (!d_mountpoint(path->dentry)) -			break; +			return true;  		mounted = __lookup_mnt(path->mnt, path->dentry);  		if (!mounted) @@ -1125,20 +1125,7 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,  		 */  		*inode = path->dentry->d_inode;  	} -	return true; -} - -static void follow_mount_rcu(struct nameidata *nd) -{ -	while (d_mountpoint(nd->path.dentry)) { -		struct mount *mounted; -		mounted = __lookup_mnt(nd->path.mnt, nd->path.dentry); -		if (!mounted) -			break; -		nd->path.mnt = &mounted->mnt; -		nd->path.dentry = mounted->mnt.mnt_root; -		nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); -	} +	return read_seqretry(&mount_lock, nd->m_seq);  }  static int follow_dotdot_rcu(struct nameidata *nd) @@ -1166,7 +1153,17 @@ static int follow_dotdot_rcu(struct nameidata *nd)  			break;  		nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq);  	} -	follow_mount_rcu(nd); +	while (d_mountpoint(nd->path.dentry)) { +		struct mount *mounted; +		mounted = __lookup_mnt(nd->path.mnt, nd->path.dentry); +		if (!mounted) +			break; +		nd->path.mnt = &mounted->mnt; +		nd->path.dentry = mounted->mnt.mnt_root; +		nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); +		if (!read_seqretry(&mount_lock, nd->m_seq)) +			goto failed; +	}  	nd->inode = nd->path.dentry->d_inode;  	return 0; diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 017d3cb5e99b..6d7be3f80356 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -449,6 +449,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,  	fh_lock(fhp);  	host_err = notify_change(dentry, iap, NULL);  	fh_unlock(fhp); +	err = nfserrno(host_err);  out_put_write_access:  	if (size_change) diff --git a/fs/read_write.c b/fs/read_write.c index 54e19b9392dc..28cc9c810744 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -307,7 +307,7 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,  		unsigned int, whence)  {  	int retval; -	struct fd f = fdget(fd); +	struct fd f = fdget_pos(fd);  	loff_t offset;  	if (!f.file) @@ -327,7 +327,7 @@ SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,  			retval = 0;  	}  out_putf: -	fdput(f); +	fdput_pos(f);  	return retval;  }  #endif | 
