fuse_add_dirent_to_cache(file, dirent, ctx->pos);
 
        return dir_emit(ctx, dirent->name, dirent->namelen, dirent->ino,
-                       dirent->type);
+                       dirent->type | FILLDIR_FLAG_NOINTR);
 }
 
 static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
                if (ff->readdir.pos == ctx->pos) {
                        res = FOUND_SOME;
                        if (!dir_emit(ctx, dirent->name, dirent->namelen,
-                                     dirent->ino, dirent->type))
+                                     dirent->ino, dirent->type | FILLDIR_FLAG_NOINTR))
                                return FOUND_ALL;
                        ctx->pos = dirent->off;
                }
 
        int reclen = ALIGN(offsetof(struct linux_dirent, d_name) + namlen + 2,
                sizeof(long));
        int prev_reclen;
+       unsigned int flags = d_type;
+
+       BUILD_BUG_ON(FILLDIR_FLAG_NOINTR & S_DT_MASK);
+       d_type &= S_DT_MASK;
 
        buf->error = verify_dirent_name(name, namlen);
        if (unlikely(buf->error))
                return false;
        }
        prev_reclen = buf->prev_reclen;
-       if (prev_reclen && signal_pending(current))
+       if (!(flags & FILLDIR_FLAG_NOINTR) && prev_reclen && signal_pending(current))
                return false;
        dirent = buf->current_dir;
        prev = (void __user *) dirent - prev_reclen;
        int reclen = ALIGN(offsetof(struct linux_dirent64, d_name) + namlen + 1,
                sizeof(u64));
        int prev_reclen;
+       unsigned int flags = d_type;
+
+       BUILD_BUG_ON(FILLDIR_FLAG_NOINTR & S_DT_MASK);
+       d_type &= S_DT_MASK;
 
        buf->error = verify_dirent_name(name, namlen);
        if (unlikely(buf->error))
        if (reclen > buf->count)
                return false;
        prev_reclen = buf->prev_reclen;
-       if (prev_reclen && signal_pending(current))
+       if (!(flags & FILLDIR_FLAG_NOINTR) && prev_reclen && signal_pending(current))
                return false;
        dirent = buf->current_dir;
        prev = (void __user *)dirent - prev_reclen;
        int reclen = ALIGN(offsetof(struct compat_linux_dirent, d_name) +
                namlen + 2, sizeof(compat_long_t));
        int prev_reclen;
+       unsigned int flags = d_type;
+
+       BUILD_BUG_ON(FILLDIR_FLAG_NOINTR & S_DT_MASK);
+       d_type &= S_DT_MASK;
 
        buf->error = verify_dirent_name(name, namlen);
        if (unlikely(buf->error))
                return false;
        }
        prev_reclen = buf->prev_reclen;
-       if (prev_reclen && signal_pending(current))
+       if (!(flags & FILLDIR_FLAG_NOINTR) && prev_reclen && signal_pending(current))
                return false;
        dirent = buf->current_dir;
        prev = (void __user *) dirent - prev_reclen;