Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/2224719/?format=api
{ "id": 2224719, "url": "http://patchwork.ozlabs.org/api/1.2/patches/2224719/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/patch/20260417213723.74204-3-artem.blagodarenko@gmail.com/", "project": { "id": 8, "url": "http://patchwork.ozlabs.org/api/1.2/projects/8/?format=api", "name": "Linux ext4 filesystem development", "link_name": "linux-ext4", "list_id": "linux-ext4.vger.kernel.org", "list_email": "linux-ext4@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260417213723.74204-3-artem.blagodarenko@gmail.com>", "list_archive_url": null, "date": "2026-04-17T21:37:19", "name": "[2/3] ext4: add dirdata support structures and helpers", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "07e2eedf42daaa783e22db0694835edd0b6dac15", "submitter": { "id": 70973, "url": "http://patchwork.ozlabs.org/api/1.2/people/70973/?format=api", "name": "Artem Blagodarenko", "email": "artem.blagodarenko@gmail.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-ext4/patch/20260417213723.74204-3-artem.blagodarenko@gmail.com/mbox/", "series": [ { "id": 500406, "url": "http://patchwork.ozlabs.org/api/1.2/series/500406/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/list/?series=500406", "date": "2026-04-17T21:37:18", "name": "Data in direntry (dirdata) feature", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/500406/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2224719/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2224719/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <SRS0=qU7R=CQ=vger.kernel.org=linux-ext4+bounces-15889-patchwork-incoming=ozlabs.org@ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-ext4@vger.kernel.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "patchwork-incoming@ozlabs.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=K+RfYXeX;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=2404:9400:2221:ea00::3; helo=mail.ozlabs.org;\n envelope-from=srs0=qu7r=cq=vger.kernel.org=linux-ext4+bounces-15889-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)", "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=172.105.105.114 arc.chain=subspace.kernel.org", "gandalf.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "gandalf.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=K+RfYXeX;\n\tdkim-atps=neutral", "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15889-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)", "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com\n header.b=\"K+RfYXeX\"", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.128.48", "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=gmail.com" ], "Received": [ "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fy7XS0bJjz1yDF\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 18 Apr 2026 07:38:00 +1000 (AEST)", "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4fy7XS07xnz4wKC\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 18 Apr 2026 07:38:00 +1000 (AEST)", "by gandalf.ozlabs.org (Postfix)\n\tid 4fy7XS05byz4wJs; Sat, 18 Apr 2026 07:38:00 +1000 (AEST)", "from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby gandalf.ozlabs.org (Postfix) with ESMTPS id 4fy7XN3pmYz4wKx\n\tfor <patchwork-incoming@ozlabs.org>; Sat, 18 Apr 2026 07:37:56 +1000 (AEST)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id E256D305F829\n\tfor <patchwork-incoming@ozlabs.org>; Fri, 17 Apr 2026 21:37:44 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id B2C2B37D120;\n\tFri, 17 Apr 2026 21:37:41 +0000 (UTC)", "from mail-wm1-f48.google.com (mail-wm1-f48.google.com\n [209.85.128.48])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id F41B9369990\n\tfor <linux-ext4@vger.kernel.org>; Fri, 17 Apr 2026 21:37:39 +0000 (UTC)", "by mail-wm1-f48.google.com with SMTP id\n 5b1f17b1804b1-488b3f8fa2bso19530245e9.1\n for <linux-ext4@vger.kernel.org>;\n Fri, 17 Apr 2026 14:37:39 -0700 (PDT)", "from localhost.localdomain\n ([2a00:23c7:90c1:9201:f5b4:1568:453c:b849])\n by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-488fb762f56sm25725645e9.15.2026.04.17.14.37.37\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 17 Apr 2026 14:37:37 -0700 (PDT)" ], "ARC-Seal": [ "i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1776461879; cv=pass;\n\tb=atqAnB3CHNiIS8EKIEBMz8IiGCt/wsh2JxBL7mLxrb2kXZ6UOitH8MRp5dveHBBTkp7FOyjYk/WtIu8mfZDhZwfQZOkRAKNsB+zlma8JGgK4itXxJ1TLyUdHdUsYgHWtcfPcXnvttQj/3JUat61o0Zsc+3Ry7AHVtbDN02hsY/N1jaZOgaiakSpNUseQyB9KzCc99bGfaEDZM0u4I9mKw5oQHFULZHaIBfRH92/URxLENgU0a8zk6CpZ9V4WgYaBlS+y2/ZKzYQ7NGVRJQLWKHu34iSLhrE8NtY3cdlgwOGxui3OMTe9yFGfnuC0RNK5kbn/hJoGg0iZp1CGq+lzOA==", "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776461861; cv=none;\n b=NOJo4CdhxCmUMS0KD/Ecokicj+yxbK0Bc+KTJkY5iLpmvnB6rTVD+SJ2YM85lP3h5blXfYYvaMaAwviCENfpOgaSctul3+q1DK+KmcieCw8R/0IjCY3gLp0b9WBaEppU8vzgYRXspmLEN/lZiHD0Lq58mqRG8zDvdoqxdMzvrWw=" ], "ARC-Message-Signature": [ "i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1776461879; c=relaxed/relaxed;\n\tbh=G6tFieCJAiC5nh8dd2uucoWVK3zmd0x9+zdqU6Vsths=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=g+9z3He/mPCo66vBG+vYjKG4i+mT5z2LMYeCYMpsf5ttKJ7uFebDPGZQY2i0lfzpey3WBD37Opyru8+200VDAcESeeyisReNUuz4tzVNudsq+72CHXZJf/i5mUIcjndrxtVk6ePGdEGklbmRgw5lGp8XFHw5MoZAiM5flsjYpsW3AzPBuOV5w7U6z4/ZVjxLZ1Jtqnc9fYW0AJOIpmtOBvmT2SDM7apKVgDIvRKg7Y1s2EIBZ7Hclo4MtT+MBiZnrBBLwrNjE6iT1B4+IWr2W7zz9tNbrwnTsLJPMwU1ekRRPlyl7RllCckAOgERhWS0eVjEnKQxiIDC8HGWxMnyYg==", "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776461861; c=relaxed/simple;\n\tbh=CO64/L2VEZHXhyQuZN9K5sXJUy4ueCobKpwYH8YzQuU=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=BwUGkB8hF0YqSpyabg82uZ3sZN6e63gHFd3hcmM+gGZwiMX8k524H5HVJ7DCiv37Ov5t8jqEO0PRzht8jgw62ANFArvNPgCt1uj0hVKK8+2jpu/LvG7G42bf4nMLlR/mDSo9CkhaTwxpMnhwjiwwVi1tV8o+R3mK63uDoQ/Ggxc=" ], "ARC-Authentication-Results": [ "i=2; gandalf.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com; dkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=K+RfYXeX; dkim-atps=neutral;\n spf=pass (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15889-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org", "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com;\n spf=pass smtp.mailfrom=gmail.com;\n dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com\n header.b=K+RfYXeX; arc=none smtp.client-ip=209.85.128.48" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1776461858; x=1777066658;\n darn=vger.kernel.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=G6tFieCJAiC5nh8dd2uucoWVK3zmd0x9+zdqU6Vsths=;\n b=K+RfYXeXrBnznzlueTo1QVt9D8jhXQs1qaHORyX6Tt/K2U+YNKpmnmixqThTOBWDRf\n s14OphL0FvN3CIyxfnkUPCy4YmR3N6tgif/mLiCeCGVF8Npa6KvtkYEOZD7m9sasa+9z\n S0UDdYFncM9rYkqnF9NVYfILitfP9Slir0YUnkgfLsavMBpGDRdydvnotvTvjtZwgmdL\n wljLwqHvoNkgxbIiBClXej4OJyUIIdn1qX1k5Gphd+gU+CM6a6rNxs3TU7mpnzJPlZC9\n 5b5KA/8NJu1grDytDKY8zDacGxV4c1rYTnty8GkwdbYo/06gTC1CnrNfNv2s1rc7COEq\n NVsQ==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776461858; x=1777066658;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=G6tFieCJAiC5nh8dd2uucoWVK3zmd0x9+zdqU6Vsths=;\n b=YU5sTOflPTH9MTaTR7/wfMgNlGlFyuviV9ho2MBBfwnJJefcIjm2n9d0yihx4HdUR5\n gW/9CUkCY/S13tG7Q7jwIksgg1whEoC1LU3z6jbAvm+yCNVGgTMCbFH5nb1A6+24kHnu\n iyZe9uVjJF3OU0KpDE2Ll5MINtukLnN8QIrPE9asx2C3/b7W3dzHGSNw42boWBCzt3QZ\n fkKrx3L0psvvad3vc3eT2fY6XcCHER3Mh/XmjBt2HpctlOGiJ54ch4EQIIxCV++oBJ8/\n +XnhwCjo8XTdaHgWPgXMFpASoGKo1VHng64gkj0TfuX4o517JVOTPqSgN/qblAEc2Sc/\n 3dCA==", "X-Gm-Message-State": "AOJu0Yw5XXiNpory9uCp5kroRLi4MALt0aApHosJ2rB7AMmMcnVLPWW1\n\tS0AF8yow3S4g5udZPco3yBDcalg+nS8mcCAldqblfdXjVwjrP+GZNfn4FHfnHw==", "X-Gm-Gg": "AeBDievb7ALHFfJ6C28OfX13I7T/09Y8Zd/QCYlL4975Pj6V6nAWFcC5aWUNxckmsHy\n\tG3OzQkNtDYhdZAwlaqKx1tJEEiOM+vacIp5ZkTzWJf4NjaqhtVkPQYQs2d4sUgjnfBo02+q1W4l\n\tvKRqb+KHwQMW8GHBNK65qnmpmFUMTSnEBuumOStO9ZKuj8lguy7pfuuOMiWpVRfwBWVEZZhpxmg\n\tAjPRxdbNdoMRwhiLrqmgCGN983waPccP4dMDfsSey4rrfARuSDjR2YNx9tVdZt5TmVIwL4WxmSN\n\tlSCXQkih7CAtdyU6aqJF994CbotrR4zed4vsJ1nswimWSko8kqHBveOZHHwIfDqonD5hCSPl8+1\n\t4KW5crRS3RmOTcDSiW+R5uOqr2CtlBUCZgLdx154HaCtxvLg0f2mId11xZ5NIX+xA7/xx1c2wLX\n\tb0CQcr/AL3J+yHVvQeyhphYSwpQNlhpLWgDOJnSLTS9CD8eYVUtj205SnAGN5ALYzGJRnUG9EZE\n\tfDQg2RE9Vb9", "X-Received": "by 2002:a05:600c:5488:b0:46e:59bd:f7e2 with SMTP id\n 5b1f17b1804b1-488fb8b1b21mr52674565e9.11.1776461858074;\n Fri, 17 Apr 2026 14:37:38 -0700 (PDT)", "From": "Artem Blagodarenko <artem.blagodarenko@gmail.com>", "To": "linux-ext4@vger.kernel.org", "Cc": "adilger.kernel@dilger.ca,\n\tArtem Blagodarenko <artem.blagodarenko@gmail.com>,\n\tPravin Shelar <pravin.shelar@sun.com>,\n\tAndreas Dilger <adilger@dilger.ca>", "Subject": "[PATCH 2/3] ext4: add dirdata support structures and helpers", "Date": "Fri, 17 Apr 2026 22:37:19 +0100", "Message-ID": "<20260417213723.74204-3-artem.blagodarenko@gmail.com>", "X-Mailer": "git-send-email 2.52.0", "In-Reply-To": "<20260417213723.74204-1-artem.blagodarenko@gmail.com>", "References": "<20260417213723.74204-1-artem.blagodarenko@gmail.com>", "Precedence": "bulk", "X-Mailing-List": "linux-ext4@vger.kernel.org", "List-Id": "<linux-ext4.vger.kernel.org>", "List-Subscribe": "<mailto:linux-ext4+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-ext4+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Spam-Status": "No, score=-1.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,\n\tFREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,\n\tMAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org" }, "content": "Space after the name is currently used to store hashes for\nfscrypt and casefold. The dirdata feature will add structures\nto store different types of data there (including the hash).\n\nThis patch adds some structures, values, and functions that\nwill be used by the dirdata feature.\n\nSigned-off-by: Pravin Shelar <pravin.shelar@sun.com>\nSigned-off-by: Artem Blagodarenko <artem.blagodarenko@gmail.com>\nReviewed-by: Andreas Dilger <adilger@dilger.ca>\n---\n fs/ext4/ext4.h | 123 +++++++++++++++++++++++++++++++++++++++++++++++--\n 1 file changed, 119 insertions(+), 4 deletions(-)", "diff": "diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h\nindex 293f698b7042..09d277e24dde 100644\n--- a/fs/ext4/ext4.h\n+++ b/fs/ext4/ext4.h\n@@ -2472,6 +2472,34 @@ struct ext4_dir_entry_tail {\n #define EXT4_FT_SYMLINK\t\t7\n \n #define EXT4_FT_MAX\t\t8\n+#define EXT4_FT_MASK\t\t0xf\n+\n+#if EXT4_FT_MAX > EXT4_FT_MASK\n+#error \"conflicting EXT4_FT_MAX and EXT4_FT_MASK\"\n+#endif\n+\n+/*\n+ * d_type has 4 unused bits, so it can hold four types of data. These different\n+ * types of data (e.g. lustre data, high 32 bits of 64-bit inode number) can be\n+ * stored, in flag order, after file-name in ext4 dirent.\n+ *\n+ * These flags are added to d_type if ext4 dirent has extra data after\n+ * filename. This data length is variable and length is stored in first byte\n+ * of data. Data starts after filename NUL byte.\n+ */\n+#define EXT4_DIRENT_LUFID\t\t0x10\n+#define EXT4_DIRENT_INO64\t\t0x20\n+#define EXT4_DIRENT_CFHASH\t\t0x40\n+\n+struct ext4_dirent_data_header {\n+\t/* length of this header + the whole data blob */\n+\t__u8\tddh_length;\n+} __packed;\n+\n+struct ext4_dirent_hash {\n+\tstruct ext4_dirent_data_header\tdh_header;\n+\tstruct ext4_dir_entry_hash\tdh_hash;\n+} __packed;\n \n #define EXT4_FT_DIR_CSUM\t0xDE\n \n@@ -2489,17 +2517,25 @@ struct ext4_dir_entry_tail {\n * casefolded and encrypted need to store the hash as well, so we add room for\n * ext4_extended_dir_entry_2. For all entries related to '.' or '..' you should\n * pass NULL for dir, as those entries do not use the extra fields.\n+ *\n+ * For directories with the dirdata feature, extra data may follow the filename.\n+ * Use ext4_dir_entry_len() to compute the length of a directory entry\n+ * including any dirdata, or ext4_dirent_rec_len() directly when the total\n+ * name_len (including dirdata length) is already known.\n */\n-static inline unsigned int ext4_dir_rec_len(__u8 name_len,\n+static inline unsigned int ext4_dirent_rec_len(unsigned int name_len,\n \t\t\t\t\t\tconst struct inode *dir)\n {\n-\tint rec_len = (name_len + 8 + EXT4_DIR_ROUND);\n+\tunsigned int rec_len = (name_len + 8 + EXT4_DIR_ROUND);\n \n \tif (dir && ext4_hash_in_dirent(dir))\n \t\trec_len += sizeof(struct ext4_dir_entry_hash);\n \treturn (rec_len & ~EXT4_DIR_ROUND);\n }\n \n+/* Compute rec_len for a given name_len without a directory inode context */\n+#define __EXT4_DIR_REC_LEN(name_len)\text4_dirent_rec_len((name_len), NULL)\n+\n static inline unsigned int\n ext4_rec_len_from_disk(__le16 dlen, unsigned blocksize)\n {\n@@ -2921,10 +2957,16 @@ static const unsigned char ext4_filetype_table[] = {\n \n static inline unsigned char get_dtype(struct super_block *sb, int filetype)\n {\n-\tif (!ext4_has_feature_filetype(sb) || filetype >= EXT4_FT_MAX)\n+\tunsigned char fl_index = filetype & EXT4_FT_MASK;\n+\n+\tif (!ext4_has_feature_filetype(sb) || fl_index >= EXT4_FT_MAX)\n \t\treturn DT_UNKNOWN;\n \n-\treturn ext4_filetype_table[filetype];\n+\tif (!test_opt(sb, DIRDATA))\n+\t\treturn ext4_filetype_table[fl_index];\n+\n+\treturn (ext4_filetype_table[fl_index]) |\n+\t\t(filetype & ~EXT4_FT_MASK);\n }\n extern int ext4_check_all_de(struct inode *dir, struct buffer_head *bh,\n \t\t\t void *buf, int buf_size);\n@@ -3917,6 +3959,79 @@ static inline void ext4_clear_io_unwritten_flag(ext4_io_end_t *io_end)\n \t\tio_end->flag &= ~EXT4_IO_END_UNWRITTEN;\n }\n \n+/*\n+ * Advance to the next dirdata record header starting from @ddh.\n+ */\n+#define ext4_dirdata_next(ddh) \\\n+\t((struct ext4_dirent_data_header *)((char *)(ddh) + (ddh)->ddh_length))\n+\n+/*\n+ * ext4_dir_entry_is_tail() - Check if a directory entry is a tail entry.\n+ * @de: directory entry to check\n+ *\n+ * Returns true if @de is a directory block tail entry (checksum record).\n+ */\n+static inline bool ext4_dir_entry_is_tail(struct ext4_dir_entry_2 *de)\n+{\n+\tstruct ext4_dir_entry_tail *t = (struct ext4_dir_entry_tail *)de;\n+\n+\treturn !t->det_reserved_zero1 &&\n+\t le16_to_cpu(t->det_rec_len) == sizeof(*t) &&\n+\t !t->det_reserved_zero2 &&\n+\t t->det_reserved_ft == EXT4_FT_DIR_CSUM;\n+}\n+\n+/*\n+ * ext4_dirent_get_data_len() - Compute the total dirdata length for an entry.\n+ * @de: directory entry\n+ *\n+ * Computes the length of optional data stored after the filename (and its\n+ * implicit NUL terminator). Each extension is indicated by a bit in the\n+ * high 4 bits of de->file_type; the first byte of each extension is its\n+ * length (including that length byte itself).\n+ *\n+ * Returns 0 for tail entries and for entries with no dirdata.\n+ */\n+static inline int ext4_dirent_get_data_len(struct ext4_dir_entry_2 *de)\n+{\n+\t__u8 extra_data_flags;\n+\tstruct ext4_dirent_data_header *ddh;\n+\tint dlen = 0;\n+\n+\tif (ext4_dir_entry_is_tail(de))\n+\t\treturn 0;\n+\n+\textra_data_flags = (de->file_type & ~EXT4_FT_MASK) >> 4;\n+\tddh = (struct ext4_dirent_data_header *)(de->name + de->name_len +\n+\t\t\t\t\t\t 1 /* NUL terminator */);\n+\n+\twhile (extra_data_flags) {\n+\t\tif (extra_data_flags & 1) {\n+\t\t\tdlen += ddh->ddh_length + (dlen == 0);\n+\t\t\tddh = ext4_dirdata_next(ddh);\n+\t\t}\n+\t\textra_data_flags >>= 1;\n+\t}\n+\treturn dlen;\n+}\n+\n+/*\n+ * ext4_dir_entry_len() - Compute the required rec_len for a directory entry.\n+ * @de: directory entry (used to read name_len and any dirdata length)\n+ * @dir: directory inode (may be NULL for '.' and '..' entries)\n+ *\n+ * Returns the minimum record length needed to hold @de, rounded up to the\n+ * directory alignment and including room for the casefold+fscrypt hash if\n+ * the directory requires it.\n+ */\n+static inline unsigned int ext4_dir_entry_len(struct ext4_dir_entry_2 *de,\n+\t\t\t\t\t const struct inode *dir)\n+{\n+\tunsigned int dirdata = ext4_dirent_get_data_len(de);\n+\n+\treturn ext4_dirent_rec_len(de->name_len + dirdata, dir);\n+}\n+\n extern const struct iomap_ops ext4_iomap_ops;\n extern const struct iomap_ops ext4_iomap_report_ops;\n \n", "prefixes": [ "2/3" ] }