From: Tahsin Erdogan <tahsin@google.com>
To: Jan Kara <jack@suse.com>, "Theodore Ts'o" <tytso@mit.edu>,
Andreas Dilger <adilger.kernel@dilger.ca>,
Dave Kleikamp <shaggy@kernel.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Mark Fasheh <mfasheh@versity.com>,
Joel Becker <jlbec@evilplan.org>, Jens Axboe <axboe@fb.com>,
Deepa Dinamani <deepa.kernel@gmail.com>,
Mike Christie <mchristi@redhat.com>,
Fabian Frederick <fabf@skynet.be>,
linux-ext4@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
jfs-discussion@lists.sourceforge.net,
linux-fsdevel@vger.kernel.org, ocfs2-devel@oss.oracle.com,
reiserfs-devel@vger.kernel.org,
Tahsin Erdogan <tahsin@google.com>
Subject: [PATCH 21/28] ext4: modify ext4_xattr_ino_array to hold struct inode *
Date: Wed, 31 May 2017 01:15:10 -0700 [thread overview]
Message-ID: <20170531081517.11438-21-tahsin@google.com> (raw)
In-Reply-To: <20170531081517.11438-1-tahsin@google.com>
Tracking struct inode * rather than the inode number eliminates the
repeated ext4_xattr_inode_iget() call later. The second call cannot
fail in practice but still requires explanation when it wants to ignore
the return value. Avoid the trouble and make things simple.
Signed-off-by: Tahsin Erdogan <tahsin@google.com>
---
fs/ext4/ext4.h | 6 ++--
fs/ext4/inode.c | 8 ++---
fs/ext4/xattr.c | 93 ++++++++++++++++++++++++++++-----------------------------
fs/ext4/xattr.h | 5 ++--
4 files changed, 53 insertions(+), 59 deletions(-)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 2cdd6070e348..603edb5ff304 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2232,9 +2232,9 @@ struct mmpd_data {
# define ATTRIB_NORET __attribute__((noreturn))
# define NORET_AND noreturn,
-struct ext4_xattr_ino_array {
- unsigned int xia_count; /* # of used item in the array */
- unsigned int xia_inodes[0];
+struct ext4_xattr_inode_array {
+ unsigned int count; /* # of used items in the array */
+ struct inode *inodes[0];
};
/* bitmap.c */
extern unsigned int ext4_count_free(char *bitmap, unsigned numchars);
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index d095bf7ad390..8ee20b586567 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -188,7 +188,7 @@ void ext4_evict_inode(struct inode *inode)
handle_t *handle;
int err;
int extra_credits = 3;
- struct ext4_xattr_ino_array *lea_ino_array = NULL;
+ struct ext4_xattr_inode_array *ea_inode_array = NULL;
trace_ext4_evict_inode(inode);
@@ -257,7 +257,7 @@ void ext4_evict_inode(struct inode *inode)
/*
* Delete xattr inode before deleting the main inode.
*/
- err = ext4_xattr_delete_inode(handle, inode, &lea_ino_array);
+ err = ext4_xattr_delete_inode(handle, inode, &ea_inode_array);
if (err) {
ext4_warning(inode->i_sb,
"couldn't delete inode's xattr (err %d)", err);
@@ -345,9 +345,7 @@ void ext4_evict_inode(struct inode *inode)
ext4_journal_stop(handle);
sb_end_intwrite(inode->i_sb);
-
- if (lea_ino_array != NULL)
- ext4_xattr_inode_array_free(inode, lea_ino_array);
+ ext4_xattr_inode_array_free(ea_inode_array);
return;
no_delete:
ext4_clear_inode(inode); /* We must guarantee clearing of inode... */
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
index 5bce73b43b2a..886d06e409b6 100644
--- a/fs/ext4/xattr.c
+++ b/fs/ext4/xattr.c
@@ -1942,44 +1942,44 @@ int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
#define EIA_INCR 16 /* must be 2^n */
#define EIA_MASK (EIA_INCR - 1)
-/* Add the large xattr @ino into @lea_ino_array for later deletion.
- * If @lea_ino_array is new or full it will be grown and the old
+/* Add the large xattr @inode into @ea_inode_array for later deletion.
+ * If @ea_inode_array is new or full it will be grown and the old
* contents copied over.
*/
static int
-ext4_expand_ino_array(struct ext4_xattr_ino_array **lea_ino_array, __u32 ino)
+ext4_expand_inode_array(struct ext4_xattr_inode_array **ea_inode_array,
+ struct inode *inode)
{
- if (*lea_ino_array == NULL) {
+ if (*ea_inode_array == NULL) {
/*
* Start with 15 inodes, so it fits into a power-of-two size.
- * If *lea_ino_array is NULL, this is essentially offsetof()
+ * If *ea_inode_array is NULL, this is essentially offsetof()
*/
- (*lea_ino_array) =
- kmalloc(offsetof(struct ext4_xattr_ino_array,
- xia_inodes[EIA_MASK]),
+ (*ea_inode_array) =
+ kmalloc(offsetof(struct ext4_xattr_inode_array,
+ inodes[EIA_MASK]),
GFP_NOFS);
- if (*lea_ino_array == NULL)
+ if (*ea_inode_array == NULL)
return -ENOMEM;
- (*lea_ino_array)->xia_count = 0;
- } else if (((*lea_ino_array)->xia_count & EIA_MASK) == EIA_MASK) {
+ (*ea_inode_array)->count = 0;
+ } else if (((*ea_inode_array)->count & EIA_MASK) == EIA_MASK) {
/* expand the array once all 15 + n * 16 slots are full */
- struct ext4_xattr_ino_array *new_array = NULL;
- int count = (*lea_ino_array)->xia_count;
+ struct ext4_xattr_inode_array *new_array = NULL;
+ int count = (*ea_inode_array)->count;
/* if new_array is NULL, this is essentially offsetof() */
new_array = kmalloc(
- offsetof(struct ext4_xattr_ino_array,
- xia_inodes[count + EIA_INCR]),
+ offsetof(struct ext4_xattr_inode_array,
+ inodes[count + EIA_INCR]),
GFP_NOFS);
if (new_array == NULL)
return -ENOMEM;
- memcpy(new_array, *lea_ino_array,
- offsetof(struct ext4_xattr_ino_array,
- xia_inodes[count]));
- kfree(*lea_ino_array);
- *lea_ino_array = new_array;
+ memcpy(new_array, *ea_inode_array,
+ offsetof(struct ext4_xattr_inode_array, inodes[count]));
+ kfree(*ea_inode_array);
+ *ea_inode_array = new_array;
}
- (*lea_ino_array)->xia_inodes[(*lea_ino_array)->xia_count++] = ino;
+ (*ea_inode_array)->inodes[(*ea_inode_array)->count++] = inode;
return 0;
}
@@ -1987,16 +1987,16 @@ ext4_expand_ino_array(struct ext4_xattr_ino_array **lea_ino_array, __u32 ino)
* Add xattr inode to orphan list
*/
static int
-ext4_xattr_inode_orphan_add(handle_t *handle, struct inode *inode,
- int credits, struct ext4_xattr_ino_array *lea_ino_array)
+ext4_xattr_inode_orphan_add(handle_t *handle, struct inode *inode, int credits,
+ struct ext4_xattr_inode_array *ea_inode_array)
{
- struct inode *ea_inode;
int idx = 0, error = 0;
+ struct inode *ea_inode;
- if (lea_ino_array == NULL)
+ if (ea_inode_array == NULL)
return 0;
- for (; idx < lea_ino_array->xia_count; ++idx) {
+ for (; idx < ea_inode_array->count; ++idx) {
if (!ext4_handle_has_enough_credits(handle, credits)) {
error = ext4_journal_extend(handle, credits);
if (error > 0)
@@ -2009,10 +2009,7 @@ ext4_xattr_inode_orphan_add(handle_t *handle, struct inode *inode,
return error;
}
}
- error = ext4_xattr_inode_iget(inode,
- lea_ino_array->xia_inodes[idx], &ea_inode);
- if (error)
- continue;
+ ea_inode = ea_inode_array->inodes[idx];
inode_lock(ea_inode);
ext4_orphan_add(handle, ea_inode);
inode_unlock(ea_inode);
@@ -2034,13 +2031,14 @@ ext4_xattr_inode_orphan_add(handle_t *handle, struct inode *inode,
*/
int
ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
- struct ext4_xattr_ino_array **lea_ino_array)
+ struct ext4_xattr_inode_array **ea_inode_array)
{
struct buffer_head *bh = NULL;
struct ext4_xattr_ibody_header *header;
struct ext4_inode *raw_inode;
struct ext4_iloc iloc;
struct ext4_xattr_entry *entry;
+ struct inode *ea_inode;
unsigned int ea_ino;
int credits = 3, error = 0;
@@ -2057,8 +2055,12 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
if (!entry->e_value_inum)
continue;
ea_ino = le32_to_cpu(entry->e_value_inum);
- error = ext4_expand_ino_array(lea_ino_array, ea_ino);
+ error = ext4_xattr_inode_iget(inode, ea_ino, &ea_inode);
+ if (error)
+ continue;
+ error = ext4_expand_inode_array(ea_inode_array, ea_inode);
if (error) {
+ iput(ea_inode);
brelse(iloc.bh);
goto cleanup;
}
@@ -2070,7 +2072,7 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
if (!EXT4_I(inode)->i_file_acl) {
/* add xattr inode to orphan list */
error = ext4_xattr_inode_orphan_add(handle, inode, credits,
- *lea_ino_array);
+ *ea_inode_array);
goto cleanup;
}
bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
@@ -2093,7 +2095,10 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
if (!entry->e_value_inum)
continue;
ea_ino = le32_to_cpu(entry->e_value_inum);
- error = ext4_expand_ino_array(lea_ino_array, ea_ino);
+ error = ext4_xattr_inode_iget(inode, ea_ino, &ea_inode);
+ if (error)
+ continue;
+ error = ext4_expand_inode_array(ea_inode_array, ea_inode);
if (error)
goto cleanup;
entry->e_value_inum = 0;
@@ -2101,7 +2106,7 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
/* add xattr inode to orphan list */
error = ext4_xattr_inode_orphan_add(handle, inode, credits,
- *lea_ino_array);
+ *ea_inode_array);
if (error)
goto cleanup;
@@ -2128,28 +2133,20 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
return error;
}
-void
-ext4_xattr_inode_array_free(struct inode *inode,
- struct ext4_xattr_ino_array *lea_ino_array)
+void ext4_xattr_inode_array_free(struct ext4_xattr_inode_array *ea_inode_array)
{
struct inode *ea_inode;
int idx = 0;
- int err;
- if (lea_ino_array == NULL)
+ if (ea_inode_array == NULL)
return;
- for (; idx < lea_ino_array->xia_count; ++idx) {
- err = ext4_xattr_inode_iget(inode,
- lea_ino_array->xia_inodes[idx], &ea_inode);
- if (err)
- continue;
- /* for inode's i_count get from ext4_xattr_delete_inode */
- iput(ea_inode);
+ for (; idx < ea_inode_array->count; ++idx) {
+ ea_inode = ea_inode_array->inodes[idx];
clear_nlink(ea_inode);
iput(ea_inode);
}
- kfree(lea_ino_array);
+ kfree(ea_inode_array);
}
/*
diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h
index e82c5fe36a26..323eba54f72f 100644
--- a/fs/ext4/xattr.h
+++ b/fs/ext4/xattr.h
@@ -164,9 +164,8 @@ extern int ext4_xattr_set_credits(struct inode *inode, size_t value_len);
extern int ext4_xattr_inode_unlink(struct inode *inode, unsigned long ea_ino);
extern int ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
- struct ext4_xattr_ino_array **array);
-extern void ext4_xattr_inode_array_free(struct inode *inode,
- struct ext4_xattr_ino_array *array);
+ struct ext4_xattr_inode_array **array);
+extern void ext4_xattr_inode_array_free(struct ext4_xattr_inode_array *array);
extern int ext4_expand_extra_isize_ea(struct inode *inode, int new_extra_isize,
struct ext4_inode *raw_inode, handle_t *handle);
--
2.13.0.219.gdb65acc882-goog
next prev parent reply other threads:[~2017-05-31 8:22 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-31 8:14 [PATCH 01/28] ext4: xattr-in-inode support Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 02/28] ext4: fix lockdep warning about recursive inode locking Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 03/28] ext4: lock inode before calling ext4_orphan_add() Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 04/28] ext4: do not set posix acls on xattr inodes Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 05/28] ext4: attach jinode after creation of xattr inode Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 06/28] ext4: ea_inode owner should be the same as the inode owner Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 07/28] ext4: call journal revoke when freeing ea_inode blocks Tahsin Erdogan
2017-05-31 16:12 ` Darrick J. Wong
2017-05-31 21:01 ` Tahsin Erdogan
2017-06-05 22:08 ` Andreas Dilger
2017-05-31 8:14 ` [PATCH 08/28] ext4: fix ref counting for ea_inode Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 09/28] ext4: extended attribute value size limit is enforced by vfs Tahsin Erdogan
2017-05-31 16:03 ` Darrick J. Wong
2017-05-31 16:13 ` Tahsin Erdogan
2017-05-31 8:14 ` [PATCH 10/28] ext4: change ext4_xattr_inode_iget() signature Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 11/28] ext4: clean up ext4_xattr_inode_get() Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 12/28] ext4: add missing le32_to_cpu(e_value_inum) conversions Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 13/28] ext4: ext4_xattr_value_same() should return false for external data Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 14/28] ext4: fix ext4_xattr_make_inode_space() value size calculation Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 15/28] ext4: fix ext4_xattr_move_to_block() Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 16/28] ext4: fix ext4_xattr_cmp() Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 17/28] ext4: fix credits calculation for xattr inode Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 18/28] ext4: retry storing value in external inode with xattr block too Tahsin Erdogan
2017-06-20 8:56 ` [PATCH v2 18/31] " Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 19/28] ext4: ext4_xattr_delete_inode() should return accurate errors Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 20/28] ext4: improve journal credit handling in set xattr paths Tahsin Erdogan
2017-06-20 8:59 ` [PATCH v2 20/31] " Tahsin Erdogan
2017-05-31 8:15 ` Tahsin Erdogan [this message]
2017-05-31 8:15 ` [PATCH 22/28] ext4: move struct ext4_xattr_inode_array to xattr.h Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 23/28] mbcache: make mbcache more generic Tahsin Erdogan
2017-06-15 7:41 ` Jan Kara
2017-06-15 18:25 ` Tahsin Erdogan
2017-06-19 8:50 ` Jan Kara
2017-06-20 9:01 ` [PATCH v2 23/31] mbcache: make mbcache naming " Tahsin Erdogan
2017-06-21 17:43 ` Andreas Dilger
2017-06-21 18:33 ` Andreas Dilger
2017-06-21 21:39 ` Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 24/28] ext4: rename mb block cache functions Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 25/28] ext4: add ext4_is_quota_file() Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 26/28] ext4: cleanup transaction restarts during inode deletion Tahsin Erdogan
2017-06-14 14:17 ` [PATCH v2 " Tahsin Erdogan
2017-06-15 0:11 ` Andreas Dilger
2017-06-20 9:04 ` [PATCH v3 " Tahsin Erdogan
2017-06-20 9:29 ` Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 27/28] ext4: xattr inode deduplication Tahsin Erdogan
2017-05-31 15:40 ` kbuild test robot
2017-05-31 15:50 ` kbuild test robot
2017-05-31 16:00 ` Darrick J. Wong
2017-05-31 22:33 ` [PATCH v2 " Tahsin Erdogan
2017-06-02 5:41 ` Darrick J. Wong
2017-06-02 12:46 ` Tahsin Erdogan
2017-06-02 17:59 ` Darrick J. Wong
2017-06-02 23:35 ` [PATCH v3 " Tahsin Erdogan
2017-06-14 14:34 ` [PATCH v4 " Tahsin Erdogan
2017-05-31 8:15 ` [PATCH 28/28] quota: add extra inode count to dquot transfer functions Tahsin Erdogan
2017-06-15 7:57 ` Jan Kara
2017-06-17 1:50 ` Tahsin Erdogan
2017-06-19 9:03 ` Jan Kara
2017-06-19 11:46 ` Tahsin Erdogan
2017-06-19 12:36 ` Jan Kara
2017-06-20 9:12 ` [PATCH v2 28/31] quota: add get_inode_usage callback to transfer multi-inode charges Tahsin Erdogan
2017-06-20 12:01 ` Tahsin Erdogan
2017-06-20 15:28 ` Jan Kara
2017-06-20 18:08 ` [PATCH v3 " Tahsin Erdogan
2017-06-21 4:48 ` Theodore Ts'o
2017-06-21 11:22 ` Tahsin Erdogan
2017-06-20 9:53 ` [PATCH 28/28] quota: add extra inode count to dquot transfer functions Tahsin Erdogan
2017-05-31 16:42 ` [PATCH 01/28] ext4: xattr-in-inode support Darrick J. Wong
2017-05-31 19:59 ` Tahsin Erdogan
2017-06-01 15:50 ` [PATCH v2 " Tahsin Erdogan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170531081517.11438-21-tahsin@google.com \
--to=tahsin@google.com \
--cc=adilger.kernel@dilger.ca \
--cc=axboe@fb.com \
--cc=deepa.kernel@gmail.com \
--cc=fabf@skynet.be \
--cc=jack@suse.com \
--cc=jfs-discussion@lists.sourceforge.net \
--cc=jlbec@evilplan.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mchristi@redhat.com \
--cc=mfasheh@versity.com \
--cc=ocfs2-devel@oss.oracle.com \
--cc=reiserfs-devel@vger.kernel.org \
--cc=shaggy@kernel.org \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®