diff options
Diffstat (limited to 'fs/reiserfs/dir.c')
| -rw-r--r-- | fs/reiserfs/dir.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c index 6d2668fdc384..c094f58c7448 100644 --- a/fs/reiserfs/dir.c +++ b/fs/reiserfs/dir.c | |||
| @@ -20,7 +20,7 @@ const struct file_operations reiserfs_dir_operations = { | |||
| 20 | .read = generic_read_dir, | 20 | .read = generic_read_dir, |
| 21 | .readdir = reiserfs_readdir, | 21 | .readdir = reiserfs_readdir, |
| 22 | .fsync = reiserfs_dir_fsync, | 22 | .fsync = reiserfs_dir_fsync, |
| 23 | .ioctl = reiserfs_ioctl, | 23 | .unlocked_ioctl = reiserfs_ioctl, |
| 24 | #ifdef CONFIG_COMPAT | 24 | #ifdef CONFIG_COMPAT |
| 25 | .compat_ioctl = reiserfs_compat_ioctl, | 25 | .compat_ioctl = reiserfs_compat_ioctl, |
| 26 | #endif | 26 | #endif |
| @@ -174,14 +174,22 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent, | |||
| 174 | // user space buffer is swapped out. At that time | 174 | // user space buffer is swapped out. At that time |
| 175 | // entry can move to somewhere else | 175 | // entry can move to somewhere else |
| 176 | memcpy(local_buf, d_name, d_reclen); | 176 | memcpy(local_buf, d_name, d_reclen); |
| 177 | |||
| 178 | /* | ||
| 179 | * Since filldir might sleep, we can release | ||
| 180 | * the write lock here for other waiters | ||
| 181 | */ | ||
| 182 | reiserfs_write_unlock(inode->i_sb); | ||
| 177 | if (filldir | 183 | if (filldir |
| 178 | (dirent, local_buf, d_reclen, d_off, d_ino, | 184 | (dirent, local_buf, d_reclen, d_off, d_ino, |
| 179 | DT_UNKNOWN) < 0) { | 185 | DT_UNKNOWN) < 0) { |
| 186 | reiserfs_write_lock(inode->i_sb); | ||
| 180 | if (local_buf != small_buf) { | 187 | if (local_buf != small_buf) { |
| 181 | kfree(local_buf); | 188 | kfree(local_buf); |
| 182 | } | 189 | } |
| 183 | goto end; | 190 | goto end; |
| 184 | } | 191 | } |
| 192 | reiserfs_write_lock(inode->i_sb); | ||
| 185 | if (local_buf != small_buf) { | 193 | if (local_buf != small_buf) { |
| 186 | kfree(local_buf); | 194 | kfree(local_buf); |
| 187 | } | 195 | } |
