mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-05-02 18:17:50 -04:00
Change calling conventions for filldir_t
filldir_t instances (directory iterators callbacks) used to return 0 for
"OK, keep going" or -E... for "stop". Note that it's *NOT* how the
error values are reported - the rules for those are callback-dependent
and ->iterate{,_shared}() instances only care about zero vs. non-zero
(look at emit_dir() and friends).
So let's just return bool ("should we keep going?") - it's less confusing
that way. The choice between "true means keep going" and "true means
stop" is bikesheddable; we have two groups of callbacks -
do something for everything in directory, until we run into problem
and
find an entry in directory and do something to it.
The former tended to use 0/-E... conventions - -E<something> on failure.
The latter tended to use 0/1, 1 being "stop, we are done".
The callers treated anything non-zero as "stop", ignoring which
non-zero value did they get.
"true means stop" would be more natural for the second group; "true
means keep going" - for the first one. I tried both variants and
the things like
if allocation failed
something = -ENOMEM;
return true;
just looked unnatural and asking for trouble.
[folded suggestion from Matthew Wilcox <willy@infradead.org>]
Acked-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user