extern const struct file_operations bpf_map_fops;
 extern const struct file_operations bpf_prog_fops;
+extern const struct file_operations bpf_iter_fops;
 
 #define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) \
        extern const struct bpf_prog_ops _name ## _prog_ops; \
 bool bpf_iter_prog_supported(struct bpf_prog *prog);
 int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog);
 int bpf_iter_new_fd(struct bpf_link *link);
+bool bpf_link_is_iter(struct bpf_link *link);
 
 int bpf_percpu_hash_copy(struct bpf_map *map, void *key, void *value);
 int bpf_percpu_array_copy(struct bpf_map *map, void *key, void *value);
 
 /* incremented on every opened seq_file */
 static atomic64_t session_id;
 
+static int prepare_seq_file(struct file *file, struct bpf_iter_link *link);
+
 /* bpf_seq_read, a customized and simpler version for bpf iterator.
  * no_llseek is assumed for this file.
  * The following are differences from seq_read():
        return copied;
 }
 
+static int iter_open(struct inode *inode, struct file *file)
+{
+       struct bpf_iter_link *link = inode->i_private;
+
+       return prepare_seq_file(file, link);
+}
+
 static int iter_release(struct inode *inode, struct file *file)
 {
        struct bpf_iter_priv_data *iter_priv;
        return seq_release_private(inode, file);
 }
 
-static const struct file_operations bpf_iter_fops = {
+const struct file_operations bpf_iter_fops = {
+       .open           = iter_open,
        .llseek         = no_llseek,
        .read           = bpf_seq_read,
        .release        = iter_release,
        .update_prog = bpf_iter_link_replace,
 };
 
+bool bpf_link_is_iter(struct bpf_link *link)
+{
+       return link->ops == &bpf_iter_link_lops;
+}
+
 int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
 {
        struct bpf_link_primer link_primer;
 
 
 static int bpf_mklink(struct dentry *dentry, umode_t mode, void *arg)
 {
+       struct bpf_link *link = arg;
+
        return bpf_mkobj_ops(dentry, mode, arg, &bpf_link_iops,
-                            &bpffs_obj_fops);
+                            bpf_link_is_iter(link) ?
+                            &bpf_iter_fops : &bpffs_obj_fops);
 }
 
 static struct dentry *