Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp14072633ybl; Mon, 30 Dec 2019 03:34:38 -0800 (PST) X-Google-Smtp-Source: APXvYqwPei8rxalVY6CyugOmSNCEbWmbyDHOAmYyUmomUpXbS7JEAx34o1fdwMBFLIYGaSBjua+L X-Received: by 2002:a05:6830:4ca:: with SMTP id s10mr34806585otd.268.1577705678623; Mon, 30 Dec 2019 03:34:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577705678; cv=none; d=google.com; s=arc-20160816; b=j+taB9ZDpd0UIIKCpRQs2dn0Gwz2w9dWazyJRumqPR3o8EQ8MCcnQAbBsOtIbpi0l+ dRG8Uao0FY9kswGJdWfAjmDeYoMbiX0eHZtV/vLcddrmwGEi+63b5zAhPA8gI7BZh0W6 p5YuvuoXlhsGuuJbN6TnD5GfBZ+oo60yeWr9niuWbi3An4CaZNiX8dKjwaUm11a3HlCc AqpH+5jtH+aI2IVHvIjadtI3IUXe8hHFtQaN05J3uVP0NTuTMdW3TYNzUcAuTSe9FxbB nZl9PJjCLCfzQAgXYjd4AL9Ul+Ot7ntkoqGpVj4hH2emnqLLSkqWEbz5oU/z1mnKrgWo tPKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=Iob/hlUn2QCCh378BWskZvI0mfeUwZZM+IJ1tulZqj8=; b=OSOb/0KxV1bhtHnkKpIlnLKpDqXrA3xDb0Sv2zND7EJVDcsM3sQdsnLPqbG2yeIAja NDZzyVz+gkiWCGYNXm+9HheJx8n5J0OR4Lwp2Z7Y/YVr0+Wut82kw7fbb5EuO0TZj58D wYpwe3uZyGv1yEOdzE64XZTByzVhzpzZfwx/YV2PmKt9A9wzlvgb6HPoKavgDovynQkX PJ3An5DGVxk6W8m5CSlKz3mkAlhUFhe/FP6eElNZAK2e4xZOySe73+0bQ5flxraGdGcm GFON7q9ORLjpstgp7VQMpuikEIfCVrJJZvHP5v9iYlSyHXGlgJBYTJxZK8geMdWtt7tE nyog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=LZollxCM; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g4si15633642oia.179.2019.12.30.03.34.15; Mon, 30 Dec 2019 03:34:38 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=LZollxCM; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727401AbfL3LeN (ORCPT + 99 others); Mon, 30 Dec 2019 06:34:13 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:43335 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727360AbfL3LeN (ORCPT ); Mon, 30 Dec 2019 06:34:13 -0500 Received: by mail-pf1-f194.google.com with SMTP id x6so17030861pfo.10 for ; Mon, 30 Dec 2019 03:34:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Iob/hlUn2QCCh378BWskZvI0mfeUwZZM+IJ1tulZqj8=; b=LZollxCMVLE3m2O1vO3vscBmRyWQoQVB5wbu2hsDWxah4CCroeN7BIlJ79tdlFEJOP IklNy83km5ZjvdgarSb8nUyTlRAgF9wBmB+DnuJ+ugstE4dxBKgjznYF7WKJyUI+0pL3 ix/eA5ZjJ0Ym/bhXyGsnYAWmRtq20y2dssibfPIoEhlPw2xT1HDbOgDJEYy1mo9ub6qW vHZCjdW9mtIqs74Pyv9AUXRk3uSVsb6tpxxdRTZMTlzIGwsx5s1mbUjjN7Zq/jXC01nh KvutoWFm3FK8QtBe2+10UK9z/1DoOExk9YnzJaTrduhoePMfk7rLlqk/WEAQy2Jx07Mq VCEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Iob/hlUn2QCCh378BWskZvI0mfeUwZZM+IJ1tulZqj8=; b=NUYS0P9lM0eLWwMtGXgUyI7gW+ylEiClBlPHh3prvzGHjo8LrSiICoXrISA9e10v/r aO9abclB9rGB/0oXc/5ouB6Nu3G7K8s0oqT5lSqi8n5z8fAOgyG452f4vBNBZHcWEsob vQFvAsrx64YUAHxgMwE589ZZ/phH4WXtJ1IgnsIK/r1hx2LpLvvZ18GLtG1yaAeuSIQ2 Gwjap91jVrU6+9tb9C5OHBBl/QDeAoAZa8f428UpHYmtTp1fzjPmHYwhV2XbQc4yjd54 XeQZdJ50kgUnBuLbfKRzq46afZ3Pyj8BQClXYSGUUPaChgfEL9P0KF31FiI8JlQ/Dowx k4RQ== X-Gm-Message-State: APjAAAVjFmzW3FAWvfJCt8IQKvFpgZ75JMJiH4Vnq6RVf2ZkADAkFxRw f1jQMliPFoNZhc6KWny3yJe1QNQPLik= X-Received: by 2002:a65:620d:: with SMTP id d13mr53506678pgv.252.1577705651951; Mon, 30 Dec 2019 03:34:11 -0800 (PST) Received: from ddnmon.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id c14sm24097187pjr.24.2019.12.30.03.34.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Dec 2019 03:34:11 -0800 (PST) From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: lixi@ddn.com, adilger@dilger.ca, dongyangli@ddn.com, Wang Shilong Subject: [PATCH] e2fsprogs: fix to use inode i_blocks correctly Date: Mon, 30 Dec 2019 20:36:06 +0900 Message-Id: <1577705766-20736-1-git-send-email-wangshilong1991@gmail.com> X-Mailer: git-send-email 1.8.3.1 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Wang Shilong According to following logic: "If the huge_file feature flag is not set on the filesystem, the file consumes i_blocks_lo 512-byte blocks on disk. If huge_file is set and EXT4_HUGE_FILE_FL is NOT set in inode.i_flags, then the file consumes i_blocks_lo + (i_blocks_hi << 32) 512-byte blocks on disk. If huge_file is set and EXT4_HUGE_FILE_FL IS set in inode.i_flags, then this file consumes (i_blocks_lo + i_blocks_hi << 32) filesystem blocks on disk." blocks_from_inode() did not return wrong inode blocks, and ext2fs_inode_i_blocks() is not taking EXT4_HUGE_FILE_FL into account at all, while the some callers deal it correctly, some not. This patch try to unify to handle it in ext2fs_inode_i_blocks() to return. blocks(based on 512 bytes) Signed-off-by: Wang Shilong --- debugfs/filefrag.c | 4 ---- e2fsck/extents.c | 6 +----- lib/ext2fs/blknum.c | 13 ++++++++++--- lib/support/mkquota.c | 3 ++- misc/fuse2fs.c | 19 +------------------ 5 files changed, 14 insertions(+), 31 deletions(-) diff --git a/debugfs/filefrag.c b/debugfs/filefrag.c index 961b6962..3e818b19 100644 --- a/debugfs/filefrag.c +++ b/debugfs/filefrag.c @@ -145,10 +145,6 @@ static void filefrag(ext2_ino_t ino, struct ext2_inode *inode, if (fs->options & VERBOSE_OPT) { blk64_t num_blocks = ext2fs_inode_i_blocks(current_fs, inode); - if (!ext2fs_has_feature_huge_file(current_fs->super) || - !(inode->i_flags & EXT4_HUGE_FILE_FL)) - num_blocks /= current_fs->blocksize / 512; - fprintf(fs->f, "\n%s has %llu block(s), i_size is %llu\n", fs->name, num_blocks, EXT2_I_SIZE(inode)); } diff --git a/e2fsck/extents.c b/e2fsck/extents.c index 3073725a..d9509297 100644 --- a/e2fsck/extents.c +++ b/e2fsck/extents.c @@ -304,11 +304,7 @@ extents_loaded: delta = ext2fs_inode_i_blocks(ctx->fs, EXT2_INODE(&inode)) - start_val; if (delta) { - if (!ext2fs_has_feature_huge_file(ctx->fs->super) || - !(inode.i_flags & EXT4_HUGE_FILE_FL)) - delta <<= 9; - else - delta *= ctx->fs->blocksize; + delta *= 512; quota_data_add(ctx->qctx, &inode, ino, delta); } diff --git a/lib/ext2fs/blknum.c b/lib/ext2fs/blknum.c index 18af3408..6ab843c4 100644 --- a/lib/ext2fs/blknum.c +++ b/lib/ext2fs/blknum.c @@ -80,9 +80,16 @@ blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs, blk64_t ext2fs_inode_i_blocks(ext2_filsys fs, struct ext2_inode *inode) { - return (inode->i_blocks | - (ext2fs_has_feature_huge_file(fs->super) ? - (__u64)inode->osd2.linux2.l_i_blocks_hi << 32 : 0)); + blkcnt_t i_blocks = inode->i_blocks; + + if (ext2fs_has_feature_huge_file(fs->super)) { + i_blocks += ((long long) inode->osd2.linux2.l_i_blocks_hi) << 32; + if (inode->i_flags & EXT4_HUGE_FILE_FL) + i_blocks *= (fs->blocksize / 512); + + } + + return i_blocks; } /* diff --git a/lib/support/mkquota.c b/lib/support/mkquota.c index ddb53124..2b0c6fb5 100644 --- a/lib/support/mkquota.c +++ b/lib/support/mkquota.c @@ -504,7 +504,8 @@ errcode_t quota_compute_usage(quota_ctx_t qctx) (ino == EXT2_ROOT_INO || ino >= EXT2_FIRST_INODE(fs->super))) { space = ext2fs_inode_i_blocks(fs, - EXT2_INODE(inode)) << 9; + EXT2_INODE(inode)); + space *= 512;; quota_data_add(qctx, inode, ino, space); quota_data_inodes(qctx, inode, ino, +1); } diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c index dc7a0392..748e3f7c 100644 --- a/misc/fuse2fs.c +++ b/misc/fuse2fs.c @@ -755,23 +755,6 @@ static void *op_init(struct fuse_conn_info *conn) return ff; } -static blkcnt_t blocks_from_inode(ext2_filsys fs, - struct ext2_inode_large *inode) -{ - blkcnt_t b; - - b = inode->i_blocks; - if (ext2fs_has_feature_huge_file(fs->super)) - b += ((long long) inode->osd2.linux2.l_i_blocks_hi) << 32; - - if (!ext2fs_has_feature_huge_file(fs->super) || - !(inode->i_flags & EXT4_HUGE_FILE_FL)) - b *= fs->blocksize / 512; - b *= EXT2FS_CLUSTER_RATIO(fs); - - return b; -} - static int stat_inode(ext2_filsys fs, ext2_ino_t ino, struct stat *statbuf) { struct ext2_inode_large inode; @@ -795,7 +778,7 @@ static int stat_inode(ext2_filsys fs, ext2_ino_t ino, struct stat *statbuf) statbuf->st_gid = inode.i_gid; statbuf->st_size = EXT2_I_SIZE(&inode); statbuf->st_blksize = fs->blocksize; - statbuf->st_blocks = blocks_from_inode(fs, &inode); + statbuf->st_blocks = ext2fs_inode_i_blocks(fs, &inode); EXT4_INODE_GET_XTIME(i_atime, &tv, &inode); statbuf->st_atime = tv.tv_sec; EXT4_INODE_GET_XTIME(i_mtime, &tv, &inode); -- 2.21.0