#include "io_uring.h"
 #include "openclose.h"
 #include "rsrc.h"
+#include "notif.h"
 
 struct io_rsrc_update {
        struct file                     *file;
        return IOU_OK;
 }
 
+static int io_notif_update(struct io_kiocb *req, unsigned int issue_flags)
+{
+       struct io_rsrc_update *up = io_kiocb_to_cmd(req);
+       struct io_ring_ctx *ctx = req->ctx;
+       unsigned len = up->nr_args;
+       unsigned idx_end, idx = up->offset;
+       int ret = 0;
+
+       io_ring_submit_lock(ctx, issue_flags);
+       if (unlikely(check_add_overflow(idx, len, &idx_end))) {
+               ret = -EOVERFLOW;
+               goto out;
+       }
+       if (unlikely(idx_end > ctx->nr_notif_slots)) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       for (; idx < idx_end; idx++) {
+               struct io_notif_slot *slot = &ctx->notif_slots[idx];
+
+               if (!slot->notif)
+                       continue;
+               if (up->arg)
+                       slot->tag = up->arg;
+               io_notif_slot_flush_submit(slot, issue_flags);
+       }
+out:
+       io_ring_submit_unlock(ctx, issue_flags);
+       if (ret < 0)
+               req_set_fail(req);
+       io_req_set_res(req, ret, 0);
+       return IOU_OK;
+}
+
 int io_rsrc_update(struct io_kiocb *req, unsigned int issue_flags)
 {
        struct io_rsrc_update *up = io_kiocb_to_cmd(req);
        switch (up->type) {
        case IORING_RSRC_UPDATE_FILES:
                return io_files_update(req, issue_flags);
+       case IORING_RSRC_UPDATE_NOTIF:
+               return io_notif_update(req, issue_flags);
        }
        return -EINVAL;
 }