From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 06A543596FC for ; Mon, 12 Jan 2026 13:38:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768225141; cv=none; b=QhglhUQoeUpmzTuhQpolbZTRniu49rP575Zv4YoI/9JTg4TeEKkNKKDPf5YiNwkxqu9A+yCEGlb6WJRAf2fQaqFpUOQHLlpgubV94pv0W1YKkx8PDLQ2pTNrq2uXoIV4FnNwQcbP8r9Nskw/bee61N7ppqsI34WbrHzOqYmaVLs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768225141; c=relaxed/simple; bh=BEKOAgfZdvF9H0+sfavBzNkkUjeKE9wyzY5Z2TiciTg=; h=Message-ID:Date:MIME-Version:Subject:To:References:Cc:From: In-Reply-To:Content-Type; b=SPpczsZZsquUdCzVsWFz1DdpDaNzUQhraG7133noz95Jz14+wE4JTSvcZWjTthfBCbEvMwFVM/vELUKGPJDyxa8F5PZjCA/7ESGtvPV1OFYEVBLFvc/2L1+v7X4h24fW8mYniKlxYt/Ou5qAQSuH18685r17Fj4S+4hueZ0XrHw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=S5iK3xu9; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="S5iK3xu9" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-29f3018dfc3so16848505ad.0 for ; Mon, 12 Jan 2026 05:38:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768225139; x=1768829939; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:cc:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=swUSC8SebLSD19Jg7UA9pgyRWCV7Jh/P7a2meW6Eekc=; b=S5iK3xu93l0wLY2tg70Jlw9ufr5yFecGvbS+h4bIQDP7VOjBnBV4p0RjIWODtJMuhb hensCTz4js4n+AefRp372OrfxT5T/b+sLaQu36aM33b4esIBTQT+sr39Y9j98Z5GlhTm Sj7+Fi1OVvZHvwX2GB74F7Zvzv3nx28O0hnpeLcDVonambn5usNaDlYcPWp2Rp/Qya4W HtoOqq0CrseTVj7h3BIdlM2GK3t36Pq7VAFc0ohNXbBjV6Lo+7jRzWhI1whKGznjWiAc DD8QRT26K7T1sJmv+jWng7qtDv+ASAbn47J+20laP4F7fhJJ/BxpcN8GMNsxdD+4Ojl7 d8Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768225139; x=1768829939; h=content-transfer-encoding:in-reply-to:from:cc:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=swUSC8SebLSD19Jg7UA9pgyRWCV7Jh/P7a2meW6Eekc=; b=adgGfZnvlGyZMT8tm7Bzf9WX2Kjdi+9ctT6YkHvkLFl1ngKUDeufzcz6nZChRtLmCZ Vg9U8RdP289MllZqEWP7J5jdLOS9lRF0APhi9QNQapS7Bowl7StRHtOqeN0zA8PJzCc4 8Qki+Pm2a83iCKuHC79cNujKuz4TkIzTVpwr+eZ4JYOe5QSV1FC1WODmktfXWVSJenDv YT8Ww+bFxjUDeyBy17N93Ik1ZPb4HoR4N8Z1xnziW4JpKlLODsHNNa8deh5Svm9tfGOY vtiGETAtRvn7bRz58bd5eKpwD8C6qwlKONSx826RuTKAO6JVyMlWDEqbJ3BVfZsuSx4n hqZQ== X-Gm-Message-State: AOJu0YyUEiZAVqwXTST0RhQ51sj1kZE09IzFyX/KQf6zJMiTIizO49Ws SeO/OhjQl0YQXR5nJdFdALFlhVmuGmQqDGolWc/YhPUJyYBiCzqiaB3v X-Gm-Gg: AY/fxX7EUADHvj+T80ydOQNuyprNta5nCJsKpjqUF7xkLpmmbNQ5cNmAHITujtOqFVp ae5cOTaA7rK24KOE8DxiKFBJphvYkP9Ptr4gkITh4PFqsB3iBZ8G2RPhnU7pfb7ondAs8OFa3+m b6AdeSejquS2OlollSXXcOVouqO3DXymD6fnqlX+5cJWJTy+szL0exkwwnxzC0PQSLiGjnMQngw L0o63vN98OT1aZcUOi60wlhLk7bukDwro+jWORR3C1K03clsH7nzJNcARrAPWjcV5f25yZ4GZJK dTvHfMr9pf02AbsiZ+4LMw6k+kwddD3f/hES5BgVfUtTaXAA26y3OGiFhX1yMc2iFQjqxTLANNB qPWGgVcG8gm342z1uwoG6e8/cslxucaypp8FLmGd5EzsU6bTJP0s8qTKLY50TkQS2lLEVNcUCb2 zTUXEkw3eCjPZLNrzneA== X-Google-Smtp-Source: AGHT+IGN5nT6g76E98AHmHhpKIZ4WXd9Pph9NcnSci9vGNp6nnXs7ptUMXMojBjq8Wx4aRZs5RbayQ== X-Received: by 2002:a17:903:90d:b0:29f:6ca:a35b with SMTP id d9443c01a7336-2a3ee425ac0mr138296845ad.1.1768225138972; Mon, 12 Jan 2026 05:38:58 -0800 (PST) Received: from [172.20.48.71] ([47.246.98.222]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a3e3c3a2a3sm179108345ad.13.2026.01.12.05.38.57 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 12 Jan 2026 05:38:58 -0800 (PST) Message-ID: <1d3ebfdb-2c12-4388-99bc-3cbcc11eea79@gmail.com> Date: Mon, 12 Jan 2026 21:38:55 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [syzbot] [usb?] INFO: task hung in i2c_tiny_usb_disconnect To: syzbot References: <6963d09e.050a0220.eaf7.0070.GAE@google.com> Content-Language: en-US Cc: linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org From: Wei Peng In-Reply-To: <6963d09e.050a0220.eaf7.0070.GAE@google.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit #syz test diff --git a/drivers/i2c/busses/i2c-tiny-usb.c b/drivers/i2c/busses/i2c-tiny-usb.c index 57dfe5f1a7d9..79b7c97514c9 100644 --- a/drivers/i2c/busses/i2c-tiny-usb.c +++ b/drivers/i2c/busses/i2c-tiny-usb.c @@ -12,6 +12,7 @@  #include  #include  #include +#include  /* include interfaces to usb layer */  #include @@ -172,6 +173,8 @@ struct i2c_tiny_usb {      struct usb_device *usb_dev; /* the usb device for this device */      struct usb_interface *interface; /* the interface for this device */      struct i2c_adapter adapter; /* i2c related things */ +    bool disconnected; /* set to true on disconnect */ +    struct work_struct release_work; /* work struct to release the adapter */  };  static int usb_read(struct i2c_adapter *adapter, int cmd, @@ -184,6 +187,11 @@ static int usb_read(struct i2c_adapter *adapter, int cmd,      if (!dmadata)          return -ENOMEM; +    if (READ_ONCE(dev->disconnected)) { +        kfree(dmadata); +        return -ENODEV; +    } +      /* do control transfer */      ret = usb_control_msg(dev->usb_dev, usb_rcvctrlpipe(dev->usb_dev, 0),                     cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE | @@ -204,6 +212,11 @@ static int usb_write(struct i2c_adapter *adapter, int cmd,      if (!dmadata)          return -ENOMEM; +    if (READ_ONCE(dev->disconnected)) { +        kfree(dmadata); +        return -ENODEV; +    } +      /* do control transfer */      ret = usb_control_msg(dev->usb_dev, usb_sndctrlpipe(dev->usb_dev, 0),                     cmd, USB_TYPE_VENDOR | USB_RECIP_INTERFACE, @@ -219,6 +232,15 @@ static void i2c_tiny_usb_free(struct i2c_tiny_usb *dev)      kfree(dev);  } +static void i2c_tiny_usb_release(struct work_struct *work) +{ +    struct i2c_tiny_usb *dev = container_of(work, struct i2c_tiny_usb, +                           release_work); + +    i2c_del_adapter(&dev->adapter); +    i2c_tiny_usb_free(dev); +} +  static int i2c_tiny_usb_probe(struct usb_interface *interface,                    const struct usb_device_id *id)  { @@ -268,6 +290,8 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface,      dev->adapter.dev.parent = &dev->interface->dev; +    INIT_WORK(&dev->release_work, i2c_tiny_usb_release); +      /* and finally attach to i2c layer */      i2c_add_adapter(&dev->adapter); @@ -287,9 +311,9 @@ static void i2c_tiny_usb_disconnect(struct usb_interface *interface)  {      struct i2c_tiny_usb *dev = usb_get_intfdata(interface); -    i2c_del_adapter(&dev->adapter);      usb_set_intfdata(interface, NULL); -    i2c_tiny_usb_free(dev); +    WRITE_ONCE(dev->disconnected, true); +    queue_work(system_long_wq, &dev->release_work);      dev_dbg(&interface->dev, "disconnected\n");  }