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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.