|
@@ -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,
|
|
|
};
|