On Tue, Aug 16, 2022 at 05:11:31PM +0100, Al Viro wrote: > 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. > > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > --- > diff --git a/Documentation/filesystems/porting.rst b/Documentation/filesystems/porting.rst > index aee9aaf9f3df..60df72f6dd37 100644 > --- a/Documentation/filesystems/porting.rst > +++ b/Documentation/filesystems/porting.rst > @@ -922,3 +922,14 @@ is provided - file_open_root_mnt(). In-tree users adjusted. > no_llseek is gone; don't set .llseek to that - just leave it NULL instead. > Checks for "does that file have llseek(2), or should it fail with ESPIPE" > should be done by looking at FMODE_LSEEK in file->f_mode. > + > +--- > + > +*mandatory* > + > +filldir_t (readdir callbacks) calling conventions have changed. Instead of > +returning 0 or -E... it returns bool now. false means "no more" (as -E... used > +to to) and true - "keep going" (as 0 in old calling conventions). Rationale: s/to to/to/ ? otherwise looks good to me, Acked-by: Christian Brauner (Microsoft) <brauner@xxxxxxxxxx> > +callers never looked at specific -E... values anyway. ->iterate() and > +->iterate_shared() instance require no changes at all, all filldir_t ones in > +the tree converted. > diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c > index d257293401e2..097d42cbd540 100644 > --- a/arch/alpha/kernel/osf_sys.c > +++ b/arch/alpha/kernel/osf_sys.c > @@ -108,7 +108,7 @@ struct osf_dirent_callback { > int error; > }; > > -static int > +static bool > osf_filldir(struct dir_context *ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > @@ -120,11 +120,11 @@ osf_filldir(struct dir_context *ctx, const char *name, int namlen, > > buf->error = -EINVAL; /* only used if we fail */ > if (reclen > buf->count) > - return -EINVAL; > + return false; > d_ino = ino; > if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) { > buf->error = -EOVERFLOW; > - return -EOVERFLOW; > + return false; > } > if (buf->basep) { > if (put_user(offset, buf->basep)) > @@ -141,10 +141,10 @@ osf_filldir(struct dir_context *ctx, const char *name, int namlen, > dirent = (void __user *)dirent + reclen; > buf->dirent = dirent; > buf->count -= reclen; > - return 0; > + return true; > Efault: > buf->error = -EFAULT; > - return -EFAULT; > + return false; > } > > SYSCALL_DEFINE4(osf_getdirentries, unsigned int, fd, > diff --git a/fs/afs/dir.c b/fs/afs/dir.c > index 56ae5cd5184f..230c2d19116d 100644 > --- a/fs/afs/dir.c > +++ b/fs/afs/dir.c > @@ -24,9 +24,9 @@ static int afs_readdir(struct file *file, struct dir_context *ctx); > static int afs_d_revalidate(struct dentry *dentry, unsigned int flags); > static int afs_d_delete(const struct dentry *dentry); > static void afs_d_iput(struct dentry *dentry, struct inode *inode); > -static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen, > +static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen, > loff_t fpos, u64 ino, unsigned dtype); > -static int afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen, > +static bool afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen, > loff_t fpos, u64 ino, unsigned dtype); > static int afs_create(struct user_namespace *mnt_userns, struct inode *dir, > struct dentry *dentry, umode_t mode, bool excl); > @@ -568,7 +568,7 @@ static int afs_readdir(struct file *file, struct dir_context *ctx) > * - if afs_dir_iterate_block() spots this function, it'll pass the FID > * uniquifier through dtype > */ > -static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, > +static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name, > int nlen, loff_t fpos, u64 ino, unsigned dtype) > { > struct afs_lookup_one_cookie *cookie = > @@ -584,16 +584,16 @@ static int afs_lookup_one_filldir(struct dir_context *ctx, const char *name, > > if (cookie->name.len != nlen || > memcmp(cookie->name.name, name, nlen) != 0) { > - _leave(" = 0 [no]"); > - return 0; > + _leave(" = true [keep looking]"); > + return true; > } > > cookie->fid.vnode = ino; > cookie->fid.unique = dtype; > cookie->found = 1; > > - _leave(" = -1 [found]"); > - return -1; > + _leave(" = false [found]"); > + return false; > } > > /* > @@ -636,12 +636,11 @@ static int afs_do_lookup_one(struct inode *dir, struct dentry *dentry, > * - if afs_dir_iterate_block() spots this function, it'll pass the FID > * uniquifier through dtype > */ > -static int afs_lookup_filldir(struct dir_context *ctx, const char *name, > +static bool afs_lookup_filldir(struct dir_context *ctx, const char *name, > int nlen, loff_t fpos, u64 ino, unsigned dtype) > { > struct afs_lookup_cookie *cookie = > container_of(ctx, struct afs_lookup_cookie, ctx); > - int ret; > > _enter("{%s,%u},%s,%u,,%llu,%u", > cookie->name.name, cookie->name.len, name, nlen, > @@ -663,12 +662,10 @@ static int afs_lookup_filldir(struct dir_context *ctx, const char *name, > cookie->fids[1].unique = dtype; > cookie->found = 1; > if (cookie->one_only) > - return -1; > + return false; > } > > - ret = cookie->nr_fids >= 50 ? -1 : 0; > - _leave(" = %d", ret); > - return ret; > + return cookie->nr_fids < 50; > } > > /* > diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c > index 18d5b91cb573..c29814a66c5b 100644 > --- a/fs/ecryptfs/file.c > +++ b/fs/ecryptfs/file.c > @@ -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; > } > > diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c > index 3ef80d000e13..c648a493faf2 100644 > --- a/fs/exportfs/expfs.c > +++ b/fs/exportfs/expfs.c > @@ -248,21 +248,20 @@ struct getdents_callback { > * A rather strange filldir function to capture > * the name matching the specified inode number. > */ > -static int filldir_one(struct dir_context *ctx, const char *name, int len, > +static bool filldir_one(struct dir_context *ctx, const char *name, int len, > loff_t pos, u64 ino, unsigned int d_type) > { > struct getdents_callback *buf = > container_of(ctx, struct getdents_callback, ctx); > - int result = 0; > > buf->sequence++; > if (buf->ino == ino && len <= NAME_MAX) { > memcpy(buf->name, name, len); > buf->name[len] = '\0'; > buf->found = 1; > - result = -1; > + return false; // no more > } > - return result; > + return true; > } > > /** > diff --git a/fs/fat/dir.c b/fs/fat/dir.c > index 249825017da7..00235b8a1823 100644 > --- a/fs/fat/dir.c > +++ b/fs/fat/dir.c > @@ -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) > diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c > index 756d05779200..cf40895233f5 100644 > --- a/fs/gfs2/export.c > +++ b/fs/gfs2/export.c > @@ -66,7 +66,7 @@ struct get_name_filldir { > char *name; > }; > > -static int get_name_filldir(struct dir_context *ctx, const char *name, > +static bool get_name_filldir(struct dir_context *ctx, const char *name, > int length, loff_t offset, u64 inum, > unsigned int type) > { > @@ -74,12 +74,12 @@ static int get_name_filldir(struct dir_context *ctx, const char *name, > container_of(ctx, struct get_name_filldir, ctx); > > if (inum != gnfd->inum.no_addr) > - return 0; > + return true; > > memcpy(gnfd->name, name, length); > gnfd->name[length] = 0; > > - return 1; > + return false; > } > > static int gfs2_get_name(struct dentry *parent, char *name, > diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c > index 9751cc92c111..6785a9cc9ee1 100644 > --- a/fs/ksmbd/smb2pdu.c > +++ b/fs/ksmbd/smb2pdu.c > @@ -3779,7 +3779,7 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info, > return 0; > } > > -static int __query_dir(struct dir_context *ctx, const char *name, int namlen, > +static bool __query_dir(struct dir_context *ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > struct ksmbd_readdir_data *buf; > @@ -3793,22 +3793,20 @@ static int __query_dir(struct dir_context *ctx, const char *name, int namlen, > > /* dot and dotdot entries are already reserved */ > if (!strcmp(".", name) || !strcmp("..", name)) > - return 0; > + return true; > if (ksmbd_share_veto_filename(priv->work->tcon->share_conf, name)) > - return 0; > + return true; > if (!match_pattern(name, namlen, priv->search_pattern)) > - return 0; > + return true; > > d_info->name = name; > d_info->name_len = namlen; > rc = reserve_populate_dentry(d_info, priv->info_level); > if (rc) > - return rc; > - if (d_info->flags & SMB2_RETURN_SINGLE_ENTRY) { > + return false; > + if (d_info->flags & SMB2_RETURN_SINGLE_ENTRY) > d_info->out_buf_len = 0; > - return 0; > - } > - return 0; > + return true; > } > > static void restart_ctx(struct dir_context *ctx) > diff --git a/fs/ksmbd/vfs.c b/fs/ksmbd/vfs.c > index 78d01033604c..48b2b901f6e5 100644 > --- a/fs/ksmbd/vfs.c > +++ b/fs/ksmbd/vfs.c > @@ -1105,7 +1105,7 @@ int ksmbd_vfs_unlink(struct user_namespace *user_ns, > return err; > } > > -static int __dir_empty(struct dir_context *ctx, const char *name, int namlen, > +static bool __dir_empty(struct dir_context *ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > struct ksmbd_readdir_data *buf; > @@ -1113,9 +1113,7 @@ static int __dir_empty(struct dir_context *ctx, const char *name, int namlen, > buf = container_of(ctx, struct ksmbd_readdir_data, ctx); > buf->dirent_count++; > > - if (buf->dirent_count > 2) > - return -ENOTEMPTY; > - return 0; > + return buf->dirent_count <= 2; > } > > /** > @@ -1142,7 +1140,7 @@ int ksmbd_vfs_empty_dir(struct ksmbd_file *fp) > return err; > } > > -static int __caseless_lookup(struct dir_context *ctx, const char *name, > +static bool __caseless_lookup(struct dir_context *ctx, const char *name, > int namlen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -1151,13 +1149,13 @@ static int __caseless_lookup(struct dir_context *ctx, const char *name, > buf = container_of(ctx, struct ksmbd_readdir_data, ctx); > > if (buf->used != namlen) > - return 0; > + return true; > if (!strncasecmp((char *)buf->private, name, namlen)) { > memcpy((char *)buf->private, name, namlen); > buf->dirent_count = 1; > - return -EEXIST; > + return false; > } > - return 0; > + return true; > } > > /** > diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c > index c634483d85d2..b29d27eaa8a6 100644 > --- a/fs/nfsd/nfs4recover.c > +++ b/fs/nfsd/nfs4recover.c > @@ -266,7 +266,7 @@ struct nfs4_dir_ctx { > struct list_head names; > }; > > -static int > +static bool > nfsd4_build_namelist(struct dir_context *__ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > @@ -275,14 +275,14 @@ nfsd4_build_namelist(struct dir_context *__ctx, const char *name, int namlen, > struct name_list *entry; > > if (namlen != HEXDIR_LEN - 1) > - return 0; > + return true; > entry = kmalloc(sizeof(struct name_list), GFP_KERNEL); > if (entry == NULL) > - return -ENOMEM; > + return false; > memcpy(entry->name, name, HEXDIR_LEN - 1); > entry->name[HEXDIR_LEN - 1] = '\0'; > list_add(&entry->list, &ctx->names); > - return 0; > + return true; > } > > static int > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 9f486b788ed0..4b0015706e98 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -1811,7 +1811,7 @@ struct readdir_data { > int full; > }; > > -static int nfsd_buffered_filldir(struct dir_context *ctx, const char *name, > +static bool nfsd_buffered_filldir(struct dir_context *ctx, const char *name, > int namlen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -1823,7 +1823,7 @@ static int nfsd_buffered_filldir(struct dir_context *ctx, const char *name, > reclen = ALIGN(sizeof(struct buffered_dirent) + namlen, sizeof(u64)); > if (buf->used + reclen > PAGE_SIZE) { > buf->full = 1; > - return -EINVAL; > + return false; > } > > de->namlen = namlen; > @@ -1833,7 +1833,7 @@ static int nfsd_buffered_filldir(struct dir_context *ctx, const char *name, > memcpy(de->name, name, namlen); > buf->used += reclen; > > - return 0; > + return true; > } > > static __be32 nfsd_buffered_readdir(struct file *file, struct svc_fh *fhp, > diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c > index 81c3d65d68fe..694471fc46b8 100644 > --- a/fs/ocfs2/dir.c > +++ b/fs/ocfs2/dir.c > @@ -2032,7 +2032,7 @@ struct ocfs2_empty_dir_priv { > unsigned seen_other; > unsigned dx_dir; > }; > -static int ocfs2_empty_dir_filldir(struct dir_context *ctx, const char *name, > +static bool ocfs2_empty_dir_filldir(struct dir_context *ctx, const char *name, > int name_len, loff_t pos, u64 ino, > unsigned type) > { > @@ -2052,7 +2052,7 @@ static int ocfs2_empty_dir_filldir(struct dir_context *ctx, const char *name, > */ > if (name_len == 1 && !strncmp(".", name, 1) && pos == 0) { > p->seen_dot = 1; > - return 0; > + return true; > } > > if (name_len == 2 && !strncmp("..", name, 2) && > @@ -2060,13 +2060,13 @@ static int ocfs2_empty_dir_filldir(struct dir_context *ctx, const char *name, > p->seen_dot_dot = 1; > > if (p->dx_dir && p->seen_dot) > - return 1; > + return false; > > - return 0; > + return true; > } > > p->seen_other = 1; > - return 1; > + return false; > } > > static int ocfs2_empty_dir_dx(struct inode *inode, > diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c > index fa87d89cf754..126671e6caed 100644 > --- a/fs/ocfs2/journal.c > +++ b/fs/ocfs2/journal.c > @@ -2057,7 +2057,7 @@ struct ocfs2_orphan_filldir_priv { > enum ocfs2_orphan_reco_type orphan_reco_type; > }; > > -static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name, > +static bool ocfs2_orphan_filldir(struct dir_context *ctx, const char *name, > int name_len, loff_t pos, u64 ino, > unsigned type) > { > @@ -2066,21 +2066,21 @@ static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name, > struct inode *iter; > > if (name_len == 1 && !strncmp(".", name, 1)) > - return 0; > + return true; > if (name_len == 2 && !strncmp("..", name, 2)) > - return 0; > + return true; > > /* do not include dio entry in case of orphan scan */ > if ((p->orphan_reco_type == ORPHAN_NO_NEED_TRUNCATE) && > (!strncmp(name, OCFS2_DIO_ORPHAN_PREFIX, > OCFS2_DIO_ORPHAN_PREFIX_LEN))) > - return 0; > + return true; > > /* Skip bad inodes so that recovery can continue */ > iter = ocfs2_iget(p->osb, ino, > OCFS2_FI_FLAG_ORPHAN_RECOVERY, 0); > if (IS_ERR(iter)) > - return 0; > + return true; > > if (!strncmp(name, OCFS2_DIO_ORPHAN_PREFIX, > OCFS2_DIO_ORPHAN_PREFIX_LEN)) > @@ -2090,7 +2090,7 @@ static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name, > * happen concurrently with unlink/rename */ > if (OCFS2_I(iter)->ip_next_orphan) { > iput(iter); > - return 0; > + return true; > } > > trace_ocfs2_orphan_filldir((unsigned long long)OCFS2_I(iter)->ip_blkno); > @@ -2099,7 +2099,7 @@ static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name, > OCFS2_I(iter)->ip_next_orphan = p->head; > p->head = iter; > > - return 0; > + return true; > } > > static int ocfs2_queue_orphans(struct ocfs2_super *osb, > diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c > index 78f62cc1797b..8c25d185cdc0 100644 > --- a/fs/overlayfs/readdir.c > +++ b/fs/overlayfs/readdir.c > @@ -170,7 +170,7 @@ static struct ovl_cache_entry *ovl_cache_entry_new(struct ovl_readdir_data *rdd, > return p; > } > > -static int ovl_cache_entry_add_rb(struct ovl_readdir_data *rdd, > +static bool ovl_cache_entry_add_rb(struct ovl_readdir_data *rdd, > const char *name, int len, u64 ino, > unsigned int d_type) > { > @@ -179,22 +179,22 @@ static int ovl_cache_entry_add_rb(struct ovl_readdir_data *rdd, > struct ovl_cache_entry *p; > > if (ovl_cache_entry_find_link(name, len, &newp, &parent)) > - return 0; > + return true; > > p = ovl_cache_entry_new(rdd, name, len, ino, d_type); > if (p == NULL) { > rdd->err = -ENOMEM; > - return -ENOMEM; > + return false; > } > > list_add_tail(&p->l_node, rdd->list); > rb_link_node(&p->node, parent, newp); > rb_insert_color(&p->node, rdd->root); > > - return 0; > + return true; > } > > -static int ovl_fill_lowest(struct ovl_readdir_data *rdd, > +static bool ovl_fill_lowest(struct ovl_readdir_data *rdd, > const char *name, int namelen, > loff_t offset, u64 ino, unsigned int d_type) > { > @@ -211,7 +211,7 @@ static int ovl_fill_lowest(struct ovl_readdir_data *rdd, > list_add_tail(&p->l_node, &rdd->middle); > } > > - return rdd->err; > + return rdd->err == 0; > } > > void ovl_cache_free(struct list_head *list) > @@ -250,7 +250,7 @@ static void ovl_cache_put(struct ovl_dir_file *od, struct dentry *dentry) > } > } > > -static int ovl_fill_merge(struct dir_context *ctx, const char *name, > +static bool ovl_fill_merge(struct dir_context *ctx, const char *name, > int namelen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -528,7 +528,7 @@ static int ovl_cache_update_ino(struct path *path, struct ovl_cache_entry *p) > goto out; > } > > -static int ovl_fill_plain(struct dir_context *ctx, const char *name, > +static bool ovl_fill_plain(struct dir_context *ctx, const char *name, > int namelen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -540,11 +540,11 @@ static int ovl_fill_plain(struct dir_context *ctx, const char *name, > p = ovl_cache_entry_new(rdd, name, namelen, ino, d_type); > if (p == NULL) { > rdd->err = -ENOMEM; > - return -ENOMEM; > + return false; > } > list_add_tail(&p->l_node, rdd->list); > > - return 0; > + return true; > } > > static int ovl_dir_read_impure(struct path *path, struct list_head *list, > @@ -648,7 +648,7 @@ struct ovl_readdir_translate { > bool xinowarn; > }; > > -static int ovl_fill_real(struct dir_context *ctx, const char *name, > +static bool ovl_fill_real(struct dir_context *ctx, const char *name, > int namelen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -1027,7 +1027,7 @@ void ovl_cleanup_whiteouts(struct ovl_fs *ofs, struct dentry *upper, > inode_unlock(upper->d_inode); > } > > -static int ovl_check_d_type(struct dir_context *ctx, const char *name, > +static bool ovl_check_d_type(struct dir_context *ctx, const char *name, > int namelen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -1036,12 +1036,12 @@ static int ovl_check_d_type(struct dir_context *ctx, const char *name, > > /* Even if d_type is not supported, DT_DIR is returned for . and .. */ > if (!strncmp(name, ".", namelen) || !strncmp(name, "..", namelen)) > - return 0; > + return true; > > if (d_type != DT_UNKNOWN) > rdd->d_type_supported = true; > > - return 0; > + return true; > } > > /* > diff --git a/fs/readdir.c b/fs/readdir.c > index 09e8ed7d4161..9c53edb60c03 100644 > --- a/fs/readdir.c > +++ b/fs/readdir.c > @@ -140,7 +140,7 @@ struct readdir_callback { > int result; > }; > > -static int fillonedir(struct dir_context *ctx, const char *name, int namlen, > +static bool fillonedir(struct dir_context *ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > struct readdir_callback *buf = > @@ -149,14 +149,14 @@ static int fillonedir(struct dir_context *ctx, const char *name, int namlen, > unsigned long d_ino; > > if (buf->result) > - return -EINVAL; > + return false; > buf->result = verify_dirent_name(name, namlen); > - if (buf->result < 0) > - return buf->result; > + if (buf->result) > + return false; Probably pretty obvious but just to make sure buf->result being 0 is supposed to return false in the two locations in this patch? > d_ino = ino; > if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) { > buf->result = -EOVERFLOW; > - return -EOVERFLOW; > + return false; > } > buf->result++; > dirent = buf->dirent; > @@ -169,12 +169,12 @@ static int fillonedir(struct dir_context *ctx, const char *name, int namlen, > unsafe_put_user(namlen, &dirent->d_namlen, efault_end); > unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end); > user_write_access_end(); > - return 0; > + return true; > efault_end: > user_write_access_end(); > efault: > buf->result = -EFAULT; > - return -EFAULT; > + return false; > } > > SYSCALL_DEFINE3(old_readdir, unsigned int, fd, > @@ -219,7 +219,7 @@ struct getdents_callback { > int error; > }; > > -static int filldir(struct dir_context *ctx, const char *name, int namlen, > +static bool filldir(struct dir_context *ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > struct linux_dirent __user *dirent, *prev; > @@ -232,18 +232,18 @@ static int filldir(struct dir_context *ctx, const char *name, int namlen, > > buf->error = verify_dirent_name(name, namlen); > if (unlikely(buf->error)) > - return buf->error; > + return false; > buf->error = -EINVAL; /* only used if we fail.. */ > if (reclen > buf->count) > - return -EINVAL; > + return false; > d_ino = ino; > if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) { > buf->error = -EOVERFLOW; > - return -EOVERFLOW; > + return false; > } > prev_reclen = buf->prev_reclen; > if (prev_reclen && signal_pending(current)) > - return -EINTR; > + return false; > dirent = buf->current_dir; > prev = (void __user *) dirent - prev_reclen; > if (!user_write_access_begin(prev, reclen + prev_reclen)) > @@ -260,12 +260,12 @@ static int filldir(struct dir_context *ctx, const char *name, int namlen, > buf->current_dir = (void __user *)dirent + reclen; > buf->prev_reclen = reclen; > buf->count -= reclen; > - return 0; > + return true; > efault_end: > user_write_access_end(); > efault: > buf->error = -EFAULT; > - return -EFAULT; > + return false; > } > > SYSCALL_DEFINE3(getdents, unsigned int, fd, > @@ -307,7 +307,7 @@ struct getdents_callback64 { > int error; > }; > > -static int filldir64(struct dir_context *ctx, const char *name, int namlen, > +static bool filldir64(struct dir_context *ctx, const char *name, int namlen, > loff_t offset, u64 ino, unsigned int d_type) > { > struct linux_dirent64 __user *dirent, *prev; > @@ -319,13 +319,13 @@ static int filldir64(struct dir_context *ctx, const char *name, int namlen, > > buf->error = verify_dirent_name(name, namlen); > if (unlikely(buf->error)) > - return buf->error; > + return false; > buf->error = -EINVAL; /* only used if we fail.. */ > if (reclen > buf->count) > - return -EINVAL; > + return false; > prev_reclen = buf->prev_reclen; > if (prev_reclen && signal_pending(current)) > - return -EINTR; > + return false; > dirent = buf->current_dir; > prev = (void __user *)dirent - prev_reclen; > if (!user_write_access_begin(prev, reclen + prev_reclen)) > @@ -342,13 +342,13 @@ static int filldir64(struct dir_context *ctx, const char *name, int namlen, > buf->prev_reclen = reclen; > buf->current_dir = (void __user *)dirent + reclen; > buf->count -= reclen; > - return 0; > + return true; > > efault_end: > user_write_access_end(); > efault: > buf->error = -EFAULT; > - return -EFAULT; > + return false; > } > > SYSCALL_DEFINE3(getdents64, unsigned int, fd, > @@ -397,7 +397,7 @@ struct compat_readdir_callback { > int result; > }; > > -static int compat_fillonedir(struct dir_context *ctx, const char *name, > +static bool compat_fillonedir(struct dir_context *ctx, const char *name, > int namlen, loff_t offset, u64 ino, > unsigned int d_type) > { > @@ -407,14 +407,14 @@ static int compat_fillonedir(struct dir_context *ctx, const char *name, > compat_ulong_t d_ino; > > if (buf->result) > - return -EINVAL; > + return false; > buf->result = verify_dirent_name(name, namlen); > - if (buf->result < 0) > - return buf->result; > + if (buf->result) > + return false;