mirror of
https://gitee.com/bianbu-linux/linux-6.6-fh
synced 2025-04-24 20:27:07 -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:
parent
d6da19c9ca
commit
25885a35a7
19 changed files with 153 additions and 155 deletions
|
@ -705,7 +705,7 @@ static int fat_readdir(struct file *file, struct dir_context *ctx)
|
|||
}
|
||||
|
||||
#define FAT_IOCTL_FILLDIR_FUNC(func, dirent_type) \
|
||||
static int func(struct dir_context *ctx, const char *name, int name_len, \
|
||||
static bool func(struct dir_context *ctx, const char *name, int name_len, \
|
||||
loff_t offset, u64 ino, unsigned int d_type) \
|
||||
{ \
|
||||
struct fat_ioctl_filldir_callback *buf = \
|
||||
|
@ -714,7 +714,7 @@ static int func(struct dir_context *ctx, const char *name, int name_len, \
|
|||
struct dirent_type __user *d2 = d1 + 1; \
|
||||
\
|
||||
if (buf->result) \
|
||||
return -EINVAL; \
|
||||
return false; \
|
||||
buf->result++; \
|
||||
\
|
||||
if (name != NULL) { \
|
||||
|
@ -750,10 +750,10 @@ static int func(struct dir_context *ctx, const char *name, int name_len, \
|
|||
put_user(short_len, &d1->d_reclen)) \
|
||||
goto efault; \
|
||||
} \
|
||||
return 0; \
|
||||
return true; \
|
||||
efault: \
|
||||
buf->result = -EFAULT; \
|
||||
return -EFAULT; \
|
||||
return false; \
|
||||
}
|
||||
|
||||
FAT_IOCTL_FILLDIR_FUNC(fat_ioctl_filldir, __fat_dirent)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue