ext4: don't save the error information if the block device is read-only
[firefly-linux-kernel-4.4.55.git] / fs / readdir.c
index 5d6578affbbf91b6d2e80b32398e8f0a53bc08ae..d46eca8567a413a8f081b4c8a5272a60a2039437 100644 (file)
@@ -114,15 +114,14 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd,
 {
        int error;
        struct fd f = fdget(fd);
-       struct readdir_callback buf;
+       struct readdir_callback buf = {
+               .ctx.actor = fillonedir,
+               .dirent = dirent
+       };
 
        if (!f.file)
                return -EBADF;
 
-       buf.ctx.actor = fillonedir;
-       buf.result = 0;
-       buf.dirent = dirent;
-
        error = iterate_dir(f.file, &buf.ctx);
        if (buf.result)
                error = buf.result;
@@ -200,7 +199,11 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,
 {
        struct fd f;
        struct linux_dirent __user * lastdirent;
-       struct getdents_callback buf;
+       struct getdents_callback buf = {
+               .ctx.actor = filldir,
+               .count = count,
+               .current_dir = dirent
+       };
        int error;
 
        if (!access_ok(VERIFY_WRITE, dirent, count))
@@ -210,12 +213,6 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       buf.current_dir = dirent;
-       buf.previous = NULL;
-       buf.count = count;
-       buf.error = 0;
-       buf.ctx.actor = filldir;
-
        error = iterate_dir(f.file, &buf.ctx);
        if (error >= 0)
                error = buf.error;
@@ -282,7 +279,11 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
 {
        struct fd f;
        struct linux_dirent64 __user * lastdirent;
-       struct getdents_callback64 buf;
+       struct getdents_callback64 buf = {
+               .ctx.actor = filldir64,
+               .count = count,
+               .current_dir = dirent
+       };
        int error;
 
        if (!access_ok(VERIFY_WRITE, dirent, count))
@@ -292,12 +293,6 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
        if (!f.file)
                return -EBADF;
 
-       buf.current_dir = dirent;
-       buf.previous = NULL;
-       buf.count = count;
-       buf.error = 0;
-       buf.ctx.actor = filldir64;
-
        error = iterate_dir(f.file, &buf.ctx);
        if (error >= 0)
                error = buf.error;