Merge tag 'pull-path' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-block.git] / fs / ecryptfs / file.c
index 195f7c2a16e801772279803a80c2a4fce7665ca0..268b74499c28c7c76f8e3230b66d86fec2394ee6 100644 (file)
@@ -53,7 +53,7 @@ struct ecryptfs_getdents_callback {
 };
 
 /* Inspired by generic filldir in fs/readdir.c */
-static int
+static bool
 ecryptfs_filldir(struct dir_context *ctx, const char *lower_name,
                 int lower_namelen, loff_t offset, u64 ino, unsigned int d_type)
 {
@@ -61,18 +61,19 @@ ecryptfs_filldir(struct dir_context *ctx, const char *lower_name,
                container_of(ctx, struct ecryptfs_getdents_callback, ctx);
        size_t name_size;
        char *name;
-       int rc;
+       int err;
+       bool res;
 
        buf->filldir_called++;
-       rc = ecryptfs_decode_and_decrypt_filename(&name, &name_size,
-                                                 buf->sb, lower_name,
-                                                 lower_namelen);
-       if (rc) {
-               if (rc != -EINVAL) {
+       err = ecryptfs_decode_and_decrypt_filename(&name, &name_size,
+                                                  buf->sb, lower_name,
+                                                  lower_namelen);
+       if (err) {
+               if (err != -EINVAL) {
                        ecryptfs_printk(KERN_DEBUG,
                                        "%s: Error attempting to decode and decrypt filename [%s]; rc = [%d]\n",
-                                       __func__, lower_name, rc);
-                       return rc;
+                                       __func__, lower_name, err);
+                       return false;
                }
 
                /* Mask -EINVAL errors as these are most likely due a plaintext
@@ -81,16 +82,15 @@ ecryptfs_filldir(struct dir_context *ctx, const char *lower_name,
                 * the "lost+found" dentry in the root directory of an Ext4
                 * filesystem.
                 */
-               return 0;
+               return true;
        }
 
        buf->caller->pos = buf->ctx.pos;
-       rc = !dir_emit(buf->caller, name, name_size, ino, d_type);
+       res = dir_emit(buf->caller, name, name_size, ino, d_type);
        kfree(name);
-       if (!rc)
+       if (res)
                buf->entries_written++;
-
-       return rc;
+       return res;
 }
 
 /**
@@ -111,14 +111,8 @@ static int ecryptfs_readdir(struct file *file, struct dir_context *ctx)
        lower_file = ecryptfs_file_to_lower(file);
        rc = iterate_dir(lower_file, &buf.ctx);
        ctx->pos = buf.ctx.pos;
-       if (rc < 0)
-               goto out;
-       if (buf.filldir_called && !buf.entries_written)
-               goto out;
-       if (rc >= 0)
-               fsstack_copy_attr_atime(inode,
-                                       file_inode(lower_file));
-out:
+       if (rc >= 0 && (buf.entries_written || !buf.filldir_called))
+               fsstack_copy_attr_atime(inode, file_inode(lower_file));
        return rc;
 }