diff options
| -rw-r--r-- | fs/hpfs/dir.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 546f6d39713a..834ac13c04b7 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c | |||
| @@ -33,25 +33,27 @@ static loff_t hpfs_dir_lseek(struct file *filp, loff_t off, int whence) | |||
| 33 | if (whence == SEEK_DATA || whence == SEEK_HOLE) | 33 | if (whence == SEEK_DATA || whence == SEEK_HOLE) |
| 34 | return -EINVAL; | 34 | return -EINVAL; |
| 35 | 35 | ||
| 36 | mutex_lock(&i->i_mutex); | ||
| 36 | hpfs_lock(s); | 37 | hpfs_lock(s); |
| 37 | 38 | ||
| 38 | /*printk("dir lseek\n");*/ | 39 | /*printk("dir lseek\n");*/ |
| 39 | if (new_off == 0 || new_off == 1 || new_off == 11 || new_off == 12 || new_off == 13) goto ok; | 40 | if (new_off == 0 || new_off == 1 || new_off == 11 || new_off == 12 || new_off == 13) goto ok; |
| 40 | mutex_lock(&i->i_mutex); | ||
| 41 | pos = ((loff_t) hpfs_de_as_down_as_possible(s, hpfs_inode->i_dno) << 4) + 1; | 41 | pos = ((loff_t) hpfs_de_as_down_as_possible(s, hpfs_inode->i_dno) << 4) + 1; |
| 42 | while (pos != new_off) { | 42 | while (pos != new_off) { |
| 43 | if (map_pos_dirent(i, &pos, &qbh)) hpfs_brelse4(&qbh); | 43 | if (map_pos_dirent(i, &pos, &qbh)) hpfs_brelse4(&qbh); |
| 44 | else goto fail; | 44 | else goto fail; |
| 45 | if (pos == 12) goto fail; | 45 | if (pos == 12) goto fail; |
| 46 | } | 46 | } |
| 47 | mutex_unlock(&i->i_mutex); | 47 | hpfs_add_pos(i, &filp->f_pos); |
| 48 | ok: | 48 | ok: |
| 49 | filp->f_pos = new_off; | ||
| 49 | hpfs_unlock(s); | 50 | hpfs_unlock(s); |
| 50 | return filp->f_pos = new_off; | ||
| 51 | fail: | ||
| 52 | mutex_unlock(&i->i_mutex); | 51 | mutex_unlock(&i->i_mutex); |
| 52 | return new_off; | ||
| 53 | fail: | ||
| 53 | /*printk("illegal lseek: %016llx\n", new_off);*/ | 54 | /*printk("illegal lseek: %016llx\n", new_off);*/ |
| 54 | hpfs_unlock(s); | 55 | hpfs_unlock(s); |
| 56 | mutex_unlock(&i->i_mutex); | ||
| 55 | return -ESPIPE; | 57 | return -ESPIPE; |
| 56 | } | 58 | } |
| 57 | 59 | ||
