From patchwork Mon Nov 9 13:06:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Margaine X-Patchwork-Id: 7583811 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 234F29F1AF for ; Mon, 9 Nov 2015 13:06:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 71DCD20639 for ; Mon, 9 Nov 2015 13:06:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AD5C520619 for ; Mon, 9 Nov 2015 13:06:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751645AbbKINGd (ORCPT ); Mon, 9 Nov 2015 08:06:33 -0500 Received: from mail-wm0-f42.google.com ([74.125.82.42]:34071 "EHLO mail-wm0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751096AbbKINGc (ORCPT ); Mon, 9 Nov 2015 08:06:32 -0500 Received: by wmnn186 with SMTP id n186so102393501wmn.1 for ; Mon, 09 Nov 2015 05:06:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=commerceguys.com; s=2012; h=to:from:subject:message-id:date:user-agent:mime-version :content-type; bh=AeHMxWQJUT3ec/aUsnQJ8AWbGajZ9cbxLcPm4UplBfM=; b=EdEmPwr/0Xhctqr1kTrMdJg+7xoU2g7RJWLWXTrceLffKHJs3wenBejD3iAW+c9DJ+ piV1gW45xtGiU0/7Tio7HSjONpIlr0VD/PAklaCjZ2ZHNi4aA3DKWUBQH9SsJg3d55Kw SxBhMY2Uu1xm7mskChuafvEzm9MTUFzLebdYg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-type; bh=AeHMxWQJUT3ec/aUsnQJ8AWbGajZ9cbxLcPm4UplBfM=; b=a5vGdFTmSqH/L9EJRDB8zUWtC2gBH7Vmw/VDTDWMsBzEhr/cdtcX+QPWRSXo51ZRt6 lWSxH5XO3prVU9A0qpOtxYcoZd3Sj1QmzzPRcihfVam/0QZJvxwvX3YrH35DyaNnvltx 3t/q06vdNGw+8EvDbgNWyEcHKmmZuheItp3oWIjvS0lZO61uJfzfRpCcgOX68mO387lO poKbhRAWizcgIwxJbX8JV/PbwGCoi0mleMiqUZb5FGCl3uTqVfBOq0JFv1tKocLIP8s4 jchYE+x3JAPU8X8GFSGLuB4ZW6+6gFopT6m9kJfX1ASvyyWE2W/mOSgdSVpR/oWXZWIw u06Q== X-Gm-Message-State: ALoCoQk2F/mHqJF9qkV4x8PCrq8zlss+2o5kHXn8OL3gnzkX6tN9qqTXw7ISYgqXCzoN2u7lpaTZ X-Received: by 10.28.128.5 with SMTP id b5mr8405692wmd.25.1447074391013; Mon, 09 Nov 2015 05:06:31 -0800 (PST) Received: from [192.168.1.70] (238.32.12.93.rev.sfr.net. [93.12.32.238]) by smtp.gmail.com with ESMTPSA id d10sm15364219wje.14.2015.11.09.05.06.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 09 Nov 2015 05:06:30 -0800 (PST) To: linux-btrfs@vger.kernel.org From: Florian Margaine Subject: [PATCH] btrfs-progs: Fix partitioned loop devices resolve. Message-ID: <56409A52.2000708@commerceguys.com> Date: Mon, 9 Nov 2015 14:06:26 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.3.0 MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,T_TVD_MIME_EPI, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When using partitions on a loop device, the device's name can be e.g. /dev/loop0p1 or similar, and no relevant entry exists in the /sys filesystem, so the current resolve_loop_device function fails. Instead of using string functions to extract the device name and reading this file, this patch uses the loop device API through ioctl to get the correct backing file. Signed-off-by: Florian Margaine --- utils.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) return 0; diff --git a/utils.c b/utils.c index d546bea..73a05e1 100644 --- a/utils.c +++ b/utils.c @@ -1176,22 +1176,16 @@ static int is_loop_device (const char* device) { static int resolve_loop_device(const char* loop_dev, char* loop_file, int max_len) { - int ret; - FILE *f; - char fmt[20]; - char p[PATH_MAX]; - char real_loop_dev[PATH_MAX]; + int fd; + struct loop_info64 lo64; - if (!realpath(loop_dev, real_loop_dev)) + if (!(fd = open(loop_dev, O_RDONLY))) return -errno; - snprintf(p, PATH_MAX, "/sys/block/%s/loop/backing_file", strrchr(real_loop_dev, '/')); - if (!(f = fopen(p, "r"))) + if (ioctl(fd, LOOP_GET_STATUS64, &lo64) != 0) return -errno; - snprintf(fmt, 20, "%%%i[^\n]", max_len-1); - ret = fscanf(f, fmt, loop_file); - fclose(f); - if (ret == EOF) + memcpy(loop_file, lo64.lo_file_name, strlen(lo64.lo_file_name) + 1); + if (close(fd) != 0) return -errno;