From: Christoph Hellwig <hch@infradead.org>
To: Ben Myers <bpm@sgi.com>
Cc: xfs@oss.sgi.com
Subject: [PATCH 04/11 v2] xfs: add xfs_ilock_attr_map_shared
Date: Wed, 18 Dec 2013 02:14:39 -0800 [thread overview]
Message-ID: <20131218101439.GA5060@infradead.org> (raw)
In-Reply-To: <20131217173334.GV1935@sgi.com>
Equivalent to xfs_ilock_data_map_shared, except for the attribute fork.
Make xfs_getbmap use it if called for the attribute fork instead of
xfs_ilock_data_map_shared.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Index: xfs/fs/xfs/xfs_bmap_util.c
===================================================================
--- xfs.orig/fs/xfs/xfs_bmap_util.c 2013-12-18 11:14:52.587953376 +0100
+++ xfs/fs/xfs/xfs_bmap_util.c 2013-12-18 11:15:29.367952621 +0100
@@ -617,22 +617,27 @@ xfs_getbmap(
return XFS_ERROR(ENOMEM);
xfs_ilock(ip, XFS_IOLOCK_SHARED);
- if (whichfork == XFS_DATA_FORK && !(iflags & BMV_IF_DELALLOC)) {
- if (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size) {
+ if (whichfork == XFS_DATA_FORK) {
+ if (!(iflags & BMV_IF_DELALLOC) &&
+ (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size)) {
error = -filemap_write_and_wait(VFS_I(ip)->i_mapping);
if (error)
goto out_unlock_iolock;
+
+ /*
+ * Even after flushing the inode, there can still be
+ * delalloc blocks on the inode beyond EOF due to
+ * speculative preallocation. These are not removed
+ * until the release function is called or the inode
+ * is inactivated. Hence we cannot assert here that
+ * ip->i_delayed_blks == 0.
+ */
}
- /*
- * even after flushing the inode, there can still be delalloc
- * blocks on the inode beyond EOF due to speculative
- * preallocation. These are not removed until the release
- * function is called or the inode is inactivated. Hence we
- * cannot assert here that ip->i_delayed_blks == 0.
- */
- }
- lock = xfs_ilock_data_map_shared(ip);
+ lock = xfs_ilock_data_map_shared(ip);
+ } else {
+ lock = xfs_ilock_attr_map_shared(ip);
+ }
/*
* Don't let nex be bigger than the number of extents
Index: xfs/fs/xfs/xfs_inode.c
===================================================================
--- xfs.orig/fs/xfs/xfs_inode.c 2013-12-18 11:14:52.587953376 +0100
+++ xfs/fs/xfs/xfs_inode.c 2013-12-18 11:14:53.599953355 +0100
@@ -77,17 +77,18 @@ xfs_get_extsz_hint(
}
/*
- * This is a wrapper routine around the xfs_ilock() routine used to centralize
- * some grungy code. It is used in places that wish to lock the inode solely
- * for reading the extents. The reason these places can't just call
- * xfs_ilock(SHARED) is that the inode lock also guards to bringing in of the
- * extents from disk for a file in b-tree format. If the inode is in b-tree
- * format, then we need to lock the inode exclusively until the extents are read
- * in. Locking it exclusively all the time would limit our parallelism
- * unnecessarily, though. What we do instead is check to see if the extents
- * have been read in yet, and only lock the inode exclusively if they have not.
+ * These two are wrapper routines around the xfs_ilock() routine used to
+ * centralize some grungy code. They are used in places that wish to lock the
+ * inode solely for reading the extents. The reason these places can't just
+ * call xfs_ilock(ip, XFS_ILOCK_SHARED) is that the inode lock also guards to
+ * bringing in of the extents from disk for a file in b-tree format. If the
+ * inode is in b-tree format, then we need to lock the inode exclusively until
+ * the extents are read in. Locking it exclusively all the time would limit
+ * our parallelism unnecessarily, though. What we do instead is check to see
+ * if the extents have been read in yet, and only lock the inode exclusively
+ * if they have not.
*
- * The function returns a value which should be given to the corresponding
+ * The functions return a value which should be given to the corresponding
* xfs_iunlock() call.
*/
uint
@@ -101,6 +102,19 @@ xfs_ilock_data_map_shared(
lock_mode = XFS_ILOCK_EXCL;
xfs_ilock(ip, lock_mode);
return lock_mode;
+}
+
+uint
+xfs_ilock_attr_map_shared(
+ struct xfs_inode *ip)
+{
+ uint lock_mode = XFS_ILOCK_SHARED;
+
+ if (ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE &&
+ (ip->i_afp->if_flags & XFS_IFEXTENTS) == 0)
+ lock_mode = XFS_ILOCK_EXCL;
+ xfs_ilock(ip, lock_mode);
+ return lock_mode;
}
/*
Index: xfs/fs/xfs/xfs_inode.h
===================================================================
--- xfs.orig/fs/xfs/xfs_inode.h 2013-12-18 11:14:52.587953376 +0100
+++ xfs/fs/xfs/xfs_inode.h 2013-12-18 11:14:53.599953355 +0100
@@ -338,6 +338,7 @@ void xfs_iunlock(xfs_inode_t *, uint);
void xfs_ilock_demote(xfs_inode_t *, uint);
int xfs_isilocked(xfs_inode_t *, uint);
uint xfs_ilock_data_map_shared(struct xfs_inode *);
+uint xfs_ilock_attr_map_shared(struct xfs_inode *);
int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t,
xfs_nlink_t, xfs_dev_t, prid_t, int,
struct xfs_buf **, xfs_inode_t **);
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2013-12-18 10:14 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-06 20:30 [PATCH 00/11] extent list locking fixes V3 Christoph Hellwig
2013-12-06 20:30 ` [PATCH 01/11] xfs: no need to lock the inode in xfs_find_handle Christoph Hellwig
2013-12-08 22:31 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 02/11] xfs: remove xfs_iunlock_map_shared Christoph Hellwig
2013-12-08 22:31 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 03/11] xfs: rename xfs_ilock_map_shared Christoph Hellwig
2013-12-08 22:33 ` Dave Chinner
2013-12-09 7:03 ` Christoph Hellwig
2013-12-09 7:24 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 04/11] xfs: add xfs_ilock_attr_map_shared Christoph Hellwig
2013-12-08 22:36 ` Dave Chinner
2013-12-09 18:16 ` Christoph Hellwig
2013-12-09 18:52 ` Ben Myers
2013-12-09 22:24 ` Dave Chinner
2013-12-09 22:30 ` Ben Myers
2013-12-10 16:13 ` Christoph Hellwig
2013-12-17 17:33 ` Ben Myers
2013-12-18 10:14 ` Christoph Hellwig [this message]
2013-12-18 21:47 ` [PATCH 04/11 v2] " Ben Myers
2013-12-06 20:30 ` [PATCH 05/11] xfs: reinstate the ilock in xfs_readdir Christoph Hellwig
2013-12-08 22:36 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 06/11] xfs: take the ilock around xfs_bmapi_read in xfs_zero_remaining_bytes Christoph Hellwig
2013-12-08 22:36 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 07/11] xfs: use xfs_ilock_data_map_shared in xfs_qm_dqtobp Christoph Hellwig
2013-12-08 22:38 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 08/11] xfs: use xfs_ilock_data_map_shared in xfs_qm_dqiterate Christoph Hellwig
2013-12-08 22:38 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 09/11] xfs: use xfs_ilock_attr_map_shared in xfs_attr_get Christoph Hellwig
2013-12-08 22:39 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 10/11] xfs: use xfs_ilock_attr_map_shared in xfs_attr_list_int Christoph Hellwig
2013-12-08 22:39 ` Dave Chinner
2013-12-06 20:30 ` [PATCH 11/11] xfs: assert that we hold the ilock for extent map access Christoph Hellwig
2013-12-08 22:40 ` Dave Chinner
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=20131218101439.GA5060@infradead.org \
--to=hch@infradead.org \
--cc=bpm@sgi.com \
--cc=xfs@oss.sgi.com \
/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;
as well as URLs for NNTP newsgroup(s).