The patch titled xfs semaphore count abuse fixes has been added to the -mm tree. Its filename is xfs-semaphore-count-abuse-fixes.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: xfs semaphore count abuse fixes From: Al Viro <viro@xxxxxxxxxxxxxxxx> Kill direct access to ->count in valusema(); all we ever use it for is check if semaphore is actually locked, which can be trivially done in portable way. Code gets more reabable, while we are at it... Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Nathan Scott <nathans@xxxxxxx> Cc: Christoph Hellwig <hch@xxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- fs/xfs/linux-2.6/sema.h | 5 ++++- fs/xfs/quota/xfs_dquot.h | 4 ++-- fs/xfs/quota/xfs_dquot_item.c | 4 ++-- fs/xfs/xfs_iget.c | 2 +- fs/xfs/xfs_inode.c | 4 ++-- fs/xfs/xfs_inode_item.c | 6 +++--- 6 files changed, 14 insertions(+), 11 deletions(-) diff -puN fs/xfs/linux-2.6/sema.h~xfs-semaphore-count-abuse-fixes fs/xfs/linux-2.6/sema.h --- a/fs/xfs/linux-2.6/sema.h~xfs-semaphore-count-abuse-fixes +++ a/fs/xfs/linux-2.6/sema.h @@ -34,8 +34,11 @@ typedef struct semaphore sema_t; #define initnsema(sp, val, name) sema_init(sp, val) #define psema(sp, b) down(sp) #define vsema(sp) up(sp) -#define valusema(sp) (atomic_read(&(sp)->count)) #define freesema(sema) +static inline int sem_is_locked(sema_t *sp) +{ + return down_trylock(sp) || (up(sp), 0); +} /* * Map cpsema (try to get the sema) to down_trylock. We need to switch diff -puN fs/xfs/quota/xfs_dquot.h~xfs-semaphore-count-abuse-fixes fs/xfs/quota/xfs_dquot.h --- a/fs/xfs/quota/xfs_dquot.h~xfs-semaphore-count-abuse-fixes +++ a/fs/xfs/quota/xfs_dquot.h @@ -119,7 +119,7 @@ XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp) */ #define xfs_dqflock(dqp) { psema(&((dqp)->q_flock), PINOD | PRECALC);\ (dqp)->dq_flags |= XFS_DQ_FLOCKED; } -#define xfs_dqfunlock(dqp) { ASSERT(valusema(&((dqp)->q_flock)) <= 0); \ +#define xfs_dqfunlock(dqp) { ASSERT(sem_is_locked(&((dqp)->q_flock))); \ vsema(&((dqp)->q_flock)); \ (dqp)->dq_flags &= ~(XFS_DQ_FLOCKED); } @@ -128,7 +128,7 @@ XFS_DQ_IS_LOCKED(xfs_dquot_t *dqp) #define XFS_DQ_PINUNLOCK(dqp, s) mutex_spinunlock( \ &(XFS_DQ_TO_QINF(dqp)->qi_pinlock), s) -#define XFS_DQ_IS_FLUSH_LOCKED(dqp) (valusema(&((dqp)->q_flock)) <= 0) +#define XFS_DQ_IS_FLUSH_LOCKED(dqp) (sem_is_locked(&((dqp)->q_flock))) #define XFS_DQ_IS_ON_FREELIST(dqp) ((dqp)->dq_flnext != (dqp)) #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) diff -puN fs/xfs/quota/xfs_dquot_item.c~xfs-semaphore-count-abuse-fixes fs/xfs/quota/xfs_dquot_item.c --- a/fs/xfs/quota/xfs_dquot_item.c~xfs-semaphore-count-abuse-fixes +++ a/fs/xfs/quota/xfs_dquot_item.c @@ -248,7 +248,7 @@ xfs_qm_dquot_logitem_pushbuf( * inode flush completed and the inode was taken off the AIL. * So, just get out. */ - if ((valusema(&(dqp->q_flock)) > 0) || + if (!sem_is_locked(&(dqp->q_flock)) || ((qip->qli_item.li_flags & XFS_LI_IN_AIL) == 0)) { qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); @@ -261,7 +261,7 @@ xfs_qm_dquot_logitem_pushbuf( if (bp != NULL) { if (XFS_BUF_ISDELAYWRITE(bp)) { dopush = ((qip->qli_item.li_flags & XFS_LI_IN_AIL) && - (valusema(&(dqp->q_flock)) <= 0)); + sem_is_locked(&(dqp->q_flock))); qip->qli_pushbuf_flag = 0; xfs_dqunlock(dqp); diff -puN fs/xfs/xfs_iget.c~xfs-semaphore-count-abuse-fixes fs/xfs/xfs_iget.c --- a/fs/xfs/xfs_iget.c~xfs-semaphore-count-abuse-fixes +++ a/fs/xfs/xfs_iget.c @@ -1031,6 +1031,6 @@ xfs_iflock_nowait(xfs_inode_t *ip) void xfs_ifunlock(xfs_inode_t *ip) { - ASSERT(valusema(&(ip->i_flock)) <= 0); + ASSERT(sem_is_locked(&(ip->i_flock))); vsema(&(ip->i_flock)); } diff -puN fs/xfs/xfs_inode.c~xfs-semaphore-count-abuse-fixes fs/xfs/xfs_inode.c --- a/fs/xfs/xfs_inode.c~xfs-semaphore-count-abuse-fixes +++ a/fs/xfs/xfs_inode.c @@ -3015,7 +3015,7 @@ xfs_iflush( XFS_STATS_INC(xs_iflush_count); ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); - ASSERT(valusema(&ip->i_flock) <= 0); + ASSERT(sem_is_locked(&(ip->i_flock))); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > ip->i_df.if_ext_max); @@ -3273,7 +3273,7 @@ xfs_iflush_int( SPLDECL(s); ASSERT(ismrlocked(&ip->i_lock, MR_UPDATE|MR_ACCESS)); - ASSERT(valusema(&ip->i_flock) <= 0); + ASSERT(sem_is_locked(&(ip->i_flock))); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > ip->i_df.if_ext_max); diff -puN fs/xfs/xfs_inode_item.c~xfs-semaphore-count-abuse-fixes fs/xfs/xfs_inode_item.c --- a/fs/xfs/xfs_inode_item.c~xfs-semaphore-count-abuse-fixes +++ a/fs/xfs/xfs_inode_item.c @@ -794,7 +794,7 @@ xfs_inode_item_pushbuf( * inode flush completed and the inode was taken off the AIL. * So, just get out. */ - if ((valusema(&(ip->i_flock)) > 0) || + if (!sem_is_locked(&(ip->i_flock)) || ((iip->ili_item.li_flags & XFS_LI_IN_AIL) == 0)) { iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); @@ -816,7 +816,7 @@ xfs_inode_item_pushbuf( * If not, we can flush it async. */ dopush = ((iip->ili_item.li_flags & XFS_LI_IN_AIL) && - (valusema(&(ip->i_flock)) <= 0)); + sem_is_locked(&(ip->i_flock))); iip->ili_pushbuf_flag = 0; xfs_iunlock(ip, XFS_ILOCK_SHARED); xfs_buftrace("INODE ITEM PUSH", bp); @@ -864,7 +864,7 @@ xfs_inode_item_push( ip = iip->ili_inode; ASSERT(ismrlocked(&(ip->i_lock), MR_ACCESS)); - ASSERT(valusema(&(ip->i_flock)) <= 0); + ASSERT(sem_is_locked(&(ip->i_flock))); /* * Since we were able to lock the inode's flush lock and * we found it on the AIL, the inode must be dirty. This _ Patches currently in -mm which might be from viro@xxxxxxxxxxxxxxxx are sparc-build-breakage.patch sctp_unpack_cookie-fix.patch fix-broken-uses-of-nipquad-in-net-atm.patch kill-open-coded-offsetof-in-cm4000_csc-zero_dev.patch xfs-semaphore-count-abuse-fixes.patch m68k-trapsc-constraints.patch m68k-windfarm-is-powerpc-only-dont-do-it-on-m68k-macs.patch inotify-add-names-inode-to-event-handler.patch inotify-add-interfaces-to-kernel-api.patch inotify-allow-watch-removal-from-event-handler.patch inotify-update-kernel-documentation.patch affs_fill_super-%s-abuses.patch slab-leaks3-default-y.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html