From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964993AbbJVRpf (ORCPT ); Thu, 22 Oct 2015 13:45:35 -0400 Received: from mail-bn1on0074.outbound.protection.outlook.com ([157.56.110.74]:63213 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1757356AbbJVRpc (ORCPT ); Thu, 22 Oct 2015 13:45:32 -0400 Authentication-Results: spf=fail (sender IP is 66.35.236.227) smtp.mailfrom=opensource.altera.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=opensource.altera.com; Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=atull@opensource.altera.com; From: To: CC: Josh Cartwright , Moritz Fischer , , , , Alan Tull Subject: [PATCH 1/2] fpga manager: ensure lifetime with of_fpga_mgr_get Date: Thu, 22 Oct 2015 12:38:37 -0500 Message-ID: <1445535518-13406-2-git-send-email-atull@opensource.altera.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1445535518-13406-1-git-send-email-atull@opensource.altera.com> References: <1445535518-13406-1-git-send-email-atull@opensource.altera.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [64.129.157.38] X-ClientProxiedBy: BY1PR0501CA0005.namprd05.prod.outlook.com (25.162.139.15) To CY1PR03MB1517.namprd03.prod.outlook.com (25.163.17.23) X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1517;2:6qKhiPiHJW5t2wGD7afhJ9LOwFZRA4+KHP1maYBQ4Jm8sr2CPRxpSQVswIWbDXmVY0L2rjy3ZUw3aQV+bbDrjrhv35my+fU6DIimlQ2rv6TAVja6S9JJQ4Z04jvLJMt8WrF2EvDaoMmPbW82pUCsl8dht6wpq+vhaKwbcvuThLg=;3:1P9rQCRg7ILufHW4k9ZrM5YqdQCx1A4hU0L+70moDR5h2pv14odvLHsi3AtF3IuttTFZAWUY6IWqGHHTG57rci8mPgXAvGZsyGCILFDXIwbgYxrbUetI9V37hrq0X+ee2EeUdTyzIjgwHYj1uWDGAw==;25:BqnRT+SVNPegmut+0LBKd0eS3F/pWTgb7f+XcZ8HC+Z1ML9HQF49jOXoaaGa2y8PGJgPa38GB6D8VnQX9QJ+jCSCQsXeC+5zGSGsLpvY4cC4eL7dKL5b0HzWSlBZH7zUZ6aaDUGmF6DLkFmpryfdxWr3RKxXaM4E69zn9OmjZaTO/ODoWNkHX0ETdZ6VRtMDWlhe0XUuA9vlayhnSy0JCBituB474urHrWnXo4VpBJRyjbMXGnlYqwkkyD+3W9nggVN4ty9wNLnq8xHklQy8vg==;20:vOV/x9JCxTmi3FIO2buGsRDGqRE5SD1kqMOPRx07pDQT9xk4F6T/TTf4GW1kkQqYcex8DUo1ZX55cQ1cob27IVMM1m7F+p2eN7REpuhZVzJMtrLMCm4RrhmFNnVt62au7Yb9e7l79gtXQXEWA7ZrBiiyeI5+9oWEIbYW5Cl3/Es= X-Microsoft-Antispam-Untrusted: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1517; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(80048183373757)(204874498639787);UriScan:(80048183373757)(204874498639787); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(3002001)(102215026);SRVR:CY1PR03MB1517;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1517;BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(102215026);SRVR:BL2PR03MB306;BCL:0;PCL:0;RULEID:;SRVR:BL2PR03MB306; X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1517;4:da6OfP96OJwbc8P1rYNqmklj1l43VrFLQtSWYCVEimjFi0aoJ+xu2HOaESIv7To0VdLl/c4edPSShzZdg6ez0XBxyzhcHWZmyUMUQ36H27XTpzKsipMpKHmR41riLf9Ciukrv7m74ti8bFfrZHcvYhV9BYE5CyRm90eDCQ5dL0g7AHnG/EDMjkHV/No3kLr34nn2/LLA/q8uGG5aeMl7YEpKrFF20Qn+k5B3tgVrFXdepDug187nsJTu2RuJcPo5UkNgYxP1xgvDeChZzj8vzbC0p+HsNunxuGT4Qyk+yCNT6pXIogecvxumD4JGtesffB/G354VtkkQgurmFsWn+dSb534FuUy34kbvua15mu1RFL7rld3runAAhfZDkvfS X-Forefront-PRVS: 0737B96801 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(6009001)(199003)(189002)(69596002)(50226001)(5003940100001)(19580405001)(19580395003)(87976001)(122386002)(189998001)(5001960100002)(110136002)(107886002)(50986999)(86362001)(76176999)(46102003)(106356001)(40100003)(2351001)(229853001)(105586002)(86152002)(101416001)(33646002)(64706001)(47776003)(5007970100001)(97736004)(5004730100002)(92566002)(81156007)(53416004)(66066001)(42186005)(2950100001)(5008740100001)(48376002)(50466002)(77096005)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR03MB1517;H:linuxheads99.altera.com;FPR:;SPF:None;PTR:InfoNoRecords;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics-untrusted: =?us-ascii?Q?1;CY1PR03MB1517;23:/7BM/EeFtDAriENhtV6vad0j2nYz2UCKCXsT/i49j?= =?us-ascii?Q?roSA1I/T/QVZOfvp9YQNaSDuU5Akb4pM2Xb1y3fLoMFLpoKf/H72MsFqeDMc?= =?us-ascii?Q?YKJlfMN/y57zKZANFxMirINTh7dbXHrxiVhvREkFrgKk+JMN/Br0qfU9VkbD?= =?us-ascii?Q?aG2TEOV7CnD5KvQExSF2TmjNYw7ihrNWDFfxsi4b4ronONM/6580z0I3tlDs?= =?us-ascii?Q?sudksQpH1NcrtEONs7409AvvX5T75yGJhfO7jfvCUQP/9+pUoS00Zup6Uamd?= =?us-ascii?Q?71TyoEoSnHjLvM6ipcdwKWat5xqPsZFGt8ljjQyaFOD60nG8hoG//UvMoyQE?= =?us-ascii?Q?6Rmbrk/xCAYzwYegRRSrsroSPk0kFlZU7Ro7/J85A2IeoSMvtfWz/eCmqckg?= =?us-ascii?Q?N91sVY7Igt80BWCZ3wNJCN+JlbMEvKfdZJj8fq+xe4MivZTn3UcHWx8EvWmG?= =?us-ascii?Q?CDBHJIPoE6Hb0J4ngsz4qPCGN2eF7Ik4+qorLaW3H+ecW2AtIeoKbULWnVGf?= =?us-ascii?Q?H2ojauHJ2gq4CX6n13E/PKvNiD82qf2wYqGqjC/EU82nBj8j/5Tb3o7+R1Eg?= =?us-ascii?Q?T6vTT5/tjrqlMmcWqQ8lFPlOImiV/ajP9RMRuvCfGYHK3bTelrfIJmyiWCFy?= =?us-ascii?Q?XEimIw7pYFowQsdpIA284u2GA5P4wph8SYwaLLS1AYl536wE5Ax00wKn6RxW?= =?us-ascii?Q?RLZLco3NKnccrU8u+sZjmYcKa0i1kBmD6jmgQaL1fgC0WTim0LlK23R4FFrX?= =?us-ascii?Q?saC1CeOhJYGTAgKPX0cfRBSKfoI05lQ7VaEoOPuHpZ7K0LhziLMv+UqsH9KU?= =?us-ascii?Q?aagM1GeC0N1RUv6zw4SG/Buoz7aj6wskp2SjZpiZHB+zP/1YLpRJaLBFNlZ5?= =?us-ascii?Q?hUsNPDcyhjKJ0zwyoJyUXanrJYpRmSVMPz4PuE+Vq+ncG1j4mXei0qbpkbfD?= =?us-ascii?Q?uWe9yA4WTJrhL3teuw18UMsPcQZveF5kDhxE8HMENPXYEuTBurVqXubumcVN?= =?us-ascii?Q?sZplwhWDkP3iL7AI2YqrWqhVfq6JlW3lIb6XCnBPM1IYuCKNgNQnrzz4BfGI?= =?us-ascii?Q?JEY1RGErmf3Mydo4Evba7EWrOcTy1lNWOZeCltsMfl206nxbsotaU70PFtg3?= =?us-ascii?Q?OX+PbTUaCp6+VE4HCg0eCr1CNUAlPMd?= X-Microsoft-Exchange-Diagnostics-untrusted: 1;CY1PR03MB1517;5:PYJ1y8DssyQxCwDsdPP3Ybvb3tnU4xnczwNZxVA0bI+jYmk4b8I3Mf0+v14XF7Ays1gU536mu2V/6j7rZTUYCbZmC/+/ldj2qQ2mm1RdXg3lReOYgeh0JIIhCSTmtdLcujH1xlgKCTRIHudSt6U+EQ==;24:yOYBLJPvqMwwElvAVJCwEMB+SSebjmdgOM0SVMGhVTStYXDqRoX4p6ar0vpqZhvbo7FPnSHeL2UCCPNNkwXVoCDD2bh4z8AE2BmPBnKoy+k=;20:Y5nX/hGPGg5Y6hck1Sk7t8ARzpDW+PkFcBYhIcDdBx5I3LNuKM4RdbaMi7CRiJDTAgQfEKmBosYOP0oDY3vbqw0h7+MO/tNX52VVkDZbj7iMpKkwm/N8KBqipsKKTNkm8DFUSE1pnTDocNFKdAU3F1u8BaOlXmlQVRC42u5a9Gg= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1517 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: BN1AFFO11OLC001.protection.gbl X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11OLC001;1:Mwxz3PCFY8H1GowR6UiwDERPaUH1IwNceogqfdgA/gBuNzq/ChsIGhXbU2vCYm2SsPCqgQzSRMfJEb3UoMae1ExM1nDF3dPUPnbsfwAqXieLcmKSkRDr/M/DjypEWHrLIbtL8IjERiQ5afQ4ExP1wiuZehRw3fLUZpV9IiSCGnliKphANjZmJR8PPK5nNIbo3Tfz1xTlWL06CU2lraO4i01l3udng7/z7JBcOayA/H0jdDQenlaJIMqxGqmEkQolcG6mPS7TLmLsUtPGJdys3/GaE2l/8c9819V5KG1SPh15BEfzPw2zwwvCxt4L5WKpKHCoLGYRf+66VKcWlsIxDsV9bYVuRdxepJaQELCPumqWmy+YmdKJBeraSow7+0B5 X-Forefront-Antispam-Report: CIP:66.35.236.227;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(21840400001)(50226001)(5004730100002)(81156007)(105606002)(5007970100001)(97736004)(50986999)(106466001)(6070500001)(76176999)(86152002)(5008740100001)(189998001)(2351001)(110136002)(6806005)(107886002)(5001960100002)(86362001)(5001920100001)(40100003)(47776003)(2950100001)(85426001)(64706001)(87936001)(92566002)(66066001)(53416004)(19580405001)(5003940100001)(50466002)(48376002)(229853001)(46102003)(122386002)(19580395003)(77096005)(16796002)(33646002)(7099028)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:BL2PR03MB306;H:sj-itexedge03.altera.priv.altera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:0;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2PR03MB306;2:eywU4SarN228lo4+h8balvAR1Znn+l65fWDgBb6R277uZWpzYVMbtlGJBrJSqBL6BL+bg3wUpn18bMhnuLtq7EuFtOG4jTJ2YoMuJxQppeYSBS3jbfrJXsjcXQADQsDk0HXZOLtIfl43vf8uo10M/j9Y4hbuD2h5XwzSCD01vNg=;3:P1Dd1VU9+/M0/qiqMA/5Il/oZrSQsTTd2qrGlLK7ahjJTevDDau9CdcWGEc2LspdVLN3bAiI+AUDgDbrG97KPnq6CIkd50m6x3fBh2K9KtOmO9IepljMPgGbS8h2X33x9nN9CfX/EWFSJOFEqZmsGS6TXCyMLbiNXnwX1BeVXG43yYZT4NfVm/i7P0/NAvmwfgzKiJNuTAKiexQEsglYuy9lM4ZrGO++vnoME7J2+QE=;25:sRkPfnqMZjBNbY+A5OVOTmUIADzRMWBvtVxoqTP7PRdZyqaCrO21eITuUzNl7OJBM04aR1bCndwKj6zCxoiOJ6S8hfYiepJM1X75Md/EXivjLojNB6pgNwPh4+o/0p+4MrNPcWNEVgrvfcrCTA3FA2c19PDeUv77MP5YZhmlhYXK/3hMRJsBjnvTDya6ywQ8iA3FPNiSu4WItIo3Lt6h7p3Yuld5SNhzgAG+iVE+5vppkajm+eVzV5HPWGuVmTEWugoRudgvhahxd42QXvAz5g==;20:pEdnbg9eyrJI63phslJl0pu43fVS9yaORtywPDUvKmy9nMZoNsNZYUI/X2c7YWVwopxhXvv/8ykt4Sz6yxTrlLgIOurrijN9rSFV+TsceFEDYsshK3PDgywgdulTWRQSCGcj1MGMnGg3IyjpdIZ0f0bXBQMFdtLIwdYBlFQUJmk= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BL2PR03MB306; X-Microsoft-Exchange-Diagnostics: 1;BL2PR03MB306;4:/WlNveUKCEVbfxHOnKp9CGMOqlE2Xm/TId+4xaG2cHGcue5/f41bfOI1Ym2CNHRUAmc7hHcFy/vzfRv4HM61mlI9yxG29HJ2YXkv84aIh7ntd5GT5y41cMuZF/fZ3fLBzdSYTlLNOLkqerM2oXfcP6H2fXbZWfDPq7M2qyPIq+w/uQZsW9TNNfuICIHdgUi0HbC51usQR85Z0HGmKvSGbpucuSHMMPtTIMJrAV1Sve00386RjTJZYFE7o2wRgxoUjT/fLx+NwkpXBt/O2UI6oq0Od+SddfygYnP2Blf1wm8brOddT8BEezYgOTqzBdwHai0/BJR+o3DbSajrQbou0iYHjzJRYKQ4z0KG9RXPXtPyE4x3RNRoFMWUkxH974Tf X-Forefront-PRVS: 0737B96801 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BL2PR03MB306;23:/4K2Mxhpg1PaKIOlDltnzAT2V5Oe5LIBYdqpxVll05?= =?us-ascii?Q?bnYBlzyKEulNd122xGwht06N5gh3TKY7yEjkK3yDu0g/MZqcnHAQgobbel9Q?= =?us-ascii?Q?H/mM0Xx6eTxkqxFvU+SN0jVX0b0nmFCOCQHYsOcTv+FH4GDTevEIHxgbpF7F?= =?us-ascii?Q?dxjIVH0UN15v/RXWjpBN7NANBo0ijnnTXi/MVaVLQh5ABfXq35B8Ti4NQUTB?= =?us-ascii?Q?BvNUevSPMXDr1j/3fT2kCGQ8tvLYEekUQxJu61r8zB/yqezHd75/XwwieU4r?= =?us-ascii?Q?1e0MjksDoqJ/0jagQn/+1KhTfTuUwFAyQN4iLKZgOroFYgF7g/GFnwF+LDE2?= =?us-ascii?Q?sRjIQtvuUKxpzB+lmWf1iJZtujiGQ3pDDgljwLV0YZHZZtp0zs+puDbjpbG0?= =?us-ascii?Q?B2pPumFc8/WL8QqRhE2AW9bugQVJi1rsCbCtJBUZt0iaITcRS2Gizud9roaF?= =?us-ascii?Q?svwBLgARxh5vauV5JrCuSIZA+vl5FyFXxD+Zvs4OnKcadOXRbPtMfxuEQBk8?= =?us-ascii?Q?aNhyovnWGe1LD4GVA2tfMghG0MuIXASo2i0SmWlG2f7XkAjXQAbQhXWT0bsC?= =?us-ascii?Q?9U12upccCICMQvOXfqls/rYkKeAjqNhCkihULAlpKBjn/KHZMp+2w68I8B37?= =?us-ascii?Q?9w6ZRj9bnbSXn4BY4q9ZKmobcFY4CYxTEjHSsuCiwHzP1eMDPgkZowFCV5aj?= =?us-ascii?Q?83nwd9KR57QLN0xjJE4o+i249WGzrK4px7VSkEHqYEHjjoLz4kzr3UFNdv+o?= =?us-ascii?Q?nrnTB4v3/hUcL0X9rbRhLfVEf+qo4epcbV+scSnGJow2bOkYqpCy9wzWB2ib?= =?us-ascii?Q?mO6yHox0uIZUz52c9u4PF/XJV842R8TepQ0VfykFxWsqu1U5vywaNcEmhtFH?= =?us-ascii?Q?JUq9xT1bLlR8oD/Far9mhTFHXRWDVYte18+rTUF/g1W5+HjVCKZMLEx0Ffpa?= =?us-ascii?Q?XCBexmM/H23g+9Ccw93BhBYMO1+p4sNuSVLUcTD5EPOaYlABLoXgEu7gqyPI?= =?us-ascii?Q?bNXPiem0FR4bT87+Aaells+j9dDVcJ/M6w6O4I7w3CEbiotD8EbtilkwdSS9?= =?us-ascii?Q?8TeIoaCeMEnzpFucgisRm/i4ug76dV7Bj1Yh+x4QLKGM54qCnUl8p70IFSRO?= =?us-ascii?Q?2wp2wtiZhXwnv/ZwoJcEthITohNnIY1pZ5K/js8AhgcdxoOZabzGconqg8Ew?= =?us-ascii?Q?Fi0rYqD/Osw+bMzZcJT7CVMjRBi0QfLRSkqBRBYS4DB0KEeD9SLpPYpgScc1?= =?us-ascii?Q?XZKKOOkf2G+SMdHR4SBexsM+JvVrE0o/KRxwHeyXRpKjj344AtOhs2Vf2mzt?= =?us-ascii?Q?8O0lKDeCFd584wqwNAR44tD1ciml1WTccz3XuAYaq4?= X-Microsoft-Exchange-Diagnostics: 1;BL2PR03MB306;5:pw3Mah4EQUTxTotf0tok8lX+J4C3rgw7sDJLSxwhImOCgrCBnJ991fRwPWpzST1uu4DTODeTxIsL79rRiMS+muJJu8UYj705AGanKEO38pKxUdn9SWmzyADU0UBIKMfKfGU96j/X0/UGbtjKRBQECA==;24:DgomLcnoZW0LwLWR4G3pF9ZgYjYE2zzf4Jw0/R4Ehh1NVymxW4n7JufhpAisUZuqA0QtbMIau8nprMxr1/sSj76alNpnjUK1nQdb0eqNmu4=;20:kXd+rEyuH7q4ma9IxlgmTXbtMBUUyTGrdmQCt19IbfwTe54RVM9YExm38d32j9L5/V4XHdlRZjUGL54l1xEUXwDaVl8A2snKLv3JoChQ/hC5G0hh/OUXlt7FrukqSGWzddJ8YGckFbvzJCJPboj+IMc+8SL7Lsimii3i2/9TVVE= X-OriginatorOrg: opensource.altera.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Oct 2015 17:45:28.6728 (UTC) X-MS-Exchange-CrossTenant-Id: fbd72e03-d4a5-4110-adce-614d51f2077a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fbd72e03-d4a5-4110-adce-614d51f2077a;Ip=[66.35.236.227];Helo=[sj-itexedge03.altera.priv.altera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL2PR03MB306 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alan Tull Ensure device and driver lifetime from of_fpga_mgr_get() to fpga_mgr_put(). * Don't put_device() in of_fpga_mgr_get, do it in fpga_mgr_put(). (still do put_device if there is an error). * Do module_get on the low level driver. * Don't need to module_get(THIS_MODULE) since we won't be allowed to unload the fpga manager core without unloading low level driver first. * Remove unnedessary null check for node pointer. Signed-off-by: Alan Tull --- drivers/fpga/fpga-mgr.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c index 2526163..68d7b41 100644 --- a/drivers/fpga/fpga-mgr.c +++ b/drivers/fpga/fpga-mgr.c @@ -204,9 +204,7 @@ struct fpga_manager *of_fpga_mgr_get(struct device_node *node) { struct fpga_manager *mgr; struct device *dev; - - if (!node) - return ERR_PTR(-EINVAL); + int ret = -ENODEV; dev = class_find_device(fpga_mgr_class, NULL, node, fpga_mgr_of_node_match); @@ -214,20 +212,25 @@ struct fpga_manager *of_fpga_mgr_get(struct device_node *node) return ERR_PTR(-ENODEV); mgr = to_fpga_manager(dev); - put_device(dev); if (!mgr) - return ERR_PTR(-ENODEV); + goto err_dev; /* Get exclusive use of fpga manager */ - if (!mutex_trylock(&mgr->ref_mutex)) - return ERR_PTR(-EBUSY); - - if (!try_module_get(THIS_MODULE)) { - mutex_unlock(&mgr->ref_mutex); - return ERR_PTR(-ENODEV); + if (!mutex_trylock(&mgr->ref_mutex)) { + ret = -EBUSY; + goto err_dev; } + if (!try_module_get(dev->parent->driver->owner)) + goto err_ll_mod; + return mgr; + +err_ll_mod: + mutex_unlock(&mgr->ref_mutex); +err_dev: + put_device(dev); + return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(of_fpga_mgr_get); @@ -237,10 +240,9 @@ EXPORT_SYMBOL_GPL(of_fpga_mgr_get); */ void fpga_mgr_put(struct fpga_manager *mgr) { - if (mgr) { - module_put(THIS_MODULE); - mutex_unlock(&mgr->ref_mutex); - } + module_put(mgr->dev.parent->driver->owner); + mutex_unlock(&mgr->ref_mutex); + put_device(&mgr->dev); } EXPORT_SYMBOL_GPL(fpga_mgr_put); -- 1.7.9.5