qnx6: qnx6_readdir() has a braino in pos calculation
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 17 May 2013 19:21:56 +0000 (15:21 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 31 May 2013 19:17:31 +0000 (15:17 -0400)
We want to mask lower 5 bits out, not leave only those and clear the
rest...  As it is, we end up always starting to read from the beginning
of directory, no matter what the current position had been.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/qnx6/dir.c

index 8798d065e400fca8303e25b5665b0c1d7eaa579f..afa6be6fc39759edc22abca58d3e21677576b0b4 100644 (file)
@@ -120,7 +120,7 @@ static int qnx6_readdir(struct file *filp, void *dirent, filldir_t filldir)
        struct inode *inode = file_inode(filp);
        struct super_block *s = inode->i_sb;
        struct qnx6_sb_info *sbi = QNX6_SB(s);
-       loff_t pos = filp->f_pos & (QNX6_DIR_ENTRY_SIZE - 1);
+       loff_t pos = filp->f_pos & ~(QNX6_DIR_ENTRY_SIZE - 1);
        unsigned long npages = dir_pages(inode);
        unsigned long n = pos >> PAGE_CACHE_SHIFT;
        unsigned start = (pos & ~PAGE_CACHE_MASK) / QNX6_DIR_ENTRY_SIZE;