diff options
Diffstat (limited to 'fs/sysfs/dir.c')
| -rw-r--r-- | fs/sysfs/dir.c | 17 | 
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 2fbdff6be25..e14512678c9 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -1020,6 +1020,8 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)  		ino = parent_sd->s_ino;  		if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) == 0)  			filp->f_pos++; +		else +			return 0;  	}  	if (filp->f_pos == 1) {  		if (parent_sd->s_parent) @@ -1028,6 +1030,8 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)  			ino = parent_sd->s_ino;  		if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) == 0)  			filp->f_pos++; +		else +			return 0;  	}  	mutex_lock(&sysfs_mutex);  	for (pos = sysfs_dir_pos(ns, parent_sd, filp->f_pos, pos); @@ -1058,10 +1062,21 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)  	return 0;  } +static loff_t sysfs_dir_llseek(struct file *file, loff_t offset, int whence) +{ +	struct inode *inode = file_inode(file); +	loff_t ret; + +	mutex_lock(&inode->i_mutex); +	ret = generic_file_llseek(file, offset, whence); +	mutex_unlock(&inode->i_mutex); + +	return ret; +}  const struct file_operations sysfs_dir_operations = {  	.read		= generic_read_dir,  	.readdir	= sysfs_readdir,  	.release	= sysfs_dir_release, -	.llseek		= generic_file_llseek, +	.llseek		= sysfs_dir_llseek,  };  |