|
@@ -71,12 +71,11 @@ struct ecryptfs_getdents_callback {
|
|
|
void *dirent;
|
|
|
struct dentry *dentry;
|
|
|
filldir_t filldir;
|
|
|
- int err;
|
|
|
int filldir_called;
|
|
|
int entries_written;
|
|
|
};
|
|
|
|
|
|
-/* Inspired by generic filldir in fs/readir.c */
|
|
|
+/* Inspired by generic filldir in fs/readdir.c */
|
|
|
static int
|
|
|
ecryptfs_filldir(void *dirent, const char *name, int namelen, loff_t offset,
|
|
|
u64 ino, unsigned int d_type)
|
|
@@ -125,18 +124,18 @@ static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)
|
|
|
buf.dirent = dirent;
|
|
|
buf.dentry = file->f_path.dentry;
|
|
|
buf.filldir = filldir;
|
|
|
-retry:
|
|
|
buf.filldir_called = 0;
|
|
|
buf.entries_written = 0;
|
|
|
- buf.err = 0;
|
|
|
rc = vfs_readdir(lower_file, ecryptfs_filldir, (void *)&buf);
|
|
|
- if (buf.err)
|
|
|
- rc = buf.err;
|
|
|
- if (buf.filldir_called && !buf.entries_written)
|
|
|
- goto retry;
|
|
|
file->f_pos = lower_file->f_pos;
|
|
|
+ if (rc < 0)
|
|
|
+ goto out;
|
|
|
+ if (buf.filldir_called && !buf.entries_written)
|
|
|
+ goto out;
|
|
|
if (rc >= 0)
|
|
|
- fsstack_copy_attr_atime(inode, lower_file->f_path.dentry->d_inode);
|
|
|
+ fsstack_copy_attr_atime(inode,
|
|
|
+ lower_file->f_path.dentry->d_inode);
|
|
|
+out:
|
|
|
return rc;
|
|
|
}
|
|
|
|