// INFO: rcu detected stall in blkdev_ioctl
// https://syzkaller.appspot.com/bug?id=1f7b710f4110f225aed1f4263ec2b98b8dbd472e
// status:fixed
// autogenerated by syzkaller (http://github.com/google/syzkaller)

#define _GNU_SOURCE
#include <endian.h>
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>

static uintptr_t syz_open_dev(uintptr_t a0, uintptr_t a1, uintptr_t a2)
{
  if (a0 == 0xc || a0 == 0xb) {
    char buf[128];
    sprintf(buf, "/dev/%s/%d:%d", a0 == 0xc ? "char" : "block", (uint8_t)a1,
            (uint8_t)a2);
    return open(buf, O_RDWR, 0);
  } else {
    char buf[1024];
    char* hash;
    strncpy(buf, (char*)a0, sizeof(buf));
    buf[sizeof(buf) - 1] = 0;
    while ((hash = strchr(buf, '#'))) {
      *hash = '0' + (char)(a1 % 10);
      a1 /= 10;
    }
    return open(buf, a2, 0);
  }
}

static void execute_one();
extern unsigned long long procid;

void loop()
{
  while (1) {
    execute_one();
  }
}

uint64_t r[4] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff,
                 0xffffffffffffffff};
void execute_one()
{
  long res = 0;
  memcpy((void*)0x20000300, "/dev/loop#", 11);
  res = syz_open_dev(0x20000300, 0, 0);
  if (res != -1)
    r[0] = res;
  memcpy((void*)0x200001c0, "/dev/loop#", 11);
  res = syz_open_dev(0x200001c0, 0x400, 0);
  if (res != -1)
    r[1] = res;
  syscall(__NR_ioctl, r[1], 0x4c00, r[0]);
  memcpy((void*)0x20000000, "/proc/self/net/pfkey", 21);
  res = syscall(__NR_openat, 0xffffffffffffff9c, 0x20000000, 0, 0);
  if (res != -1)
    r[2] = res;
  memcpy((void*)0x20000100, "/dev/loop#", 11);
  res = syz_open_dev(0x20000100, 0, 0x101906);
  if (res != -1)
    r[3] = res;
  syscall(__NR_ioctl, r[3], 0x4c00, r[2]);
  syscall(__NR_ioctl, r[3], 0x4c06, r[3]);
}

int main()
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  for (;;) {
    loop();
  }
}
