ocfs2: fix the end cluster offset of FIEMAP
[linux-3.10.git] / fs / readdir.c
index cc0a822..fee38e0 100644 (file)
@@ -22,7 +22,7 @@
 
 int vfs_readdir(struct file *file, filldir_t filler, void *buf)
 {
-       struct inode *inode = file->f_path.dentry->d_inode;
+       struct inode *inode = file_inode(file);
        int res = -ENOTDIR;
        if (!file->f_op || !file->f_op->readdir)
                goto out;
@@ -106,23 +106,20 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd,
                struct old_linux_dirent __user *, dirent, unsigned int, count)
 {
        int error;
-       struct file * file;
+       struct fd f = fdget(fd);
        struct readdir_callback buf;
 
-       error = -EBADF;
-       file = fget(fd);
-       if (!file)
-               goto out;
+       if (!f.file)
+               return -EBADF;
 
        buf.result = 0;
        buf.dirent = dirent;
 
-       error = vfs_readdir(file, fillonedir, &buf);
+       error = vfs_readdir(f.file, fillonedir, &buf);
        if (buf.result)
                error = buf.result;
 
-       fput(file);
-out:
+       fdput(f);
        return error;
 }
 
@@ -192,37 +189,34 @@ efault:
 SYSCALL_DEFINE3(getdents, unsigned int, fd,
                struct linux_dirent __user *, dirent, unsigned int, count)
 {
-       struct file * file;
+       struct fd f;
        struct linux_dirent __user * lastdirent;
        struct getdents_callback buf;
        int error;
 
-       error = -EFAULT;
        if (!access_ok(VERIFY_WRITE, dirent, count))
-               goto out;
+               return -EFAULT;
 
-       error = -EBADF;
-       file = fget(fd);
-       if (!file)
-               goto out;
+       f = fdget(fd);
+       if (!f.file)
+               return -EBADF;
 
        buf.current_dir = dirent;
        buf.previous = NULL;
        buf.count = count;
        buf.error = 0;
 
-       error = vfs_readdir(file, filldir, &buf);
+       error = vfs_readdir(f.file, filldir, &buf);
        if (error >= 0)
                error = buf.error;
        lastdirent = buf.previous;
        if (lastdirent) {
-               if (put_user(file->f_pos, &lastdirent->d_off))
+               if (put_user(f.file->f_pos, &lastdirent->d_off))
                        error = -EFAULT;
                else
                        error = count - buf.count;
        }
-       fput(file);
-out:
+       fdput(f);
        return error;
 }
 
@@ -275,37 +269,34 @@ efault:
 SYSCALL_DEFINE3(getdents64, unsigned int, fd,
                struct linux_dirent64 __user *, dirent, unsigned int, count)
 {
-       struct file * file;
+       struct fd f;
        struct linux_dirent64 __user * lastdirent;
        struct getdents_callback64 buf;
        int error;
 
-       error = -EFAULT;
        if (!access_ok(VERIFY_WRITE, dirent, count))
-               goto out;
+               return -EFAULT;
 
-       error = -EBADF;
-       file = fget(fd);
-       if (!file)
-               goto out;
+       f = fdget(fd);
+       if (!f.file)
+               return -EBADF;
 
        buf.current_dir = dirent;
        buf.previous = NULL;
        buf.count = count;
        buf.error = 0;
 
-       error = vfs_readdir(file, filldir64, &buf);
+       error = vfs_readdir(f.file, filldir64, &buf);
        if (error >= 0)
                error = buf.error;
        lastdirent = buf.previous;
        if (lastdirent) {
-               typeof(lastdirent->d_off) d_off = file->f_pos;
+               typeof(lastdirent->d_off) d_off = f.file->f_pos;
                if (__put_user(d_off, &lastdirent->d_off))
                        error = -EFAULT;
                else
                        error = count - buf.count;
        }
-       fput(file);
-out:
+       fdput(f);
        return error;
 }