Get rid of the alloc_inode and free_inode dquot operations - they are always called from the filesystem and if a filesystem really needs their own (which none currently does) it can just call into it's own routine directly. Also get rid of the vfs_dq_alloc/vfs_dq_free wrappers and always call the lowlevel dquot_alloc_inode / dqout_free_inode routines directly, which now lose the number argument which is always 1. Signed-off-by: Christoph Hellwig <hch@xxxxxx> Index: linux-2.6/Documentation/filesystems/Locking =================================================================== --- linux-2.6.orig/Documentation/filesystems/Locking 2010-02-20 11:46:29.732254256 +0100 +++ linux-2.6/Documentation/filesystems/Locking 2010-02-20 12:15:36.974004850 +0100 @@ -462,8 +462,6 @@ in sys_read() and friends. prototypes: int (*initialize) (struct inode *, int); int (*drop) (struct inode *); - int (*alloc_inode) (const struct inode *, unsigned long); - int (*free_inode) (const struct inode *, unsigned long); int (*transfer) (struct inode *, struct iattr *); int (*write_dquot) (struct dquot *); int (*acquire_dquot) (struct dquot *); @@ -479,8 +477,6 @@ What filesystem should expect from the g FS recursion Held locks when called initialize: yes maybe dqonoff_sem drop: yes - -alloc_inode: ->mark_dirty() - -free_inode: ->mark_dirty() - transfer: yes - write_dquot: yes dqonoff_sem or dqptr_sem acquire_dquot: yes dqonoff_sem or dqptr_sem @@ -491,10 +487,6 @@ write_info: yes dqonoff_sem FS recursion means calling ->quota_read() and ->quota_write() from superblock operations. -->alloc_inode(), ->free_inode() are called -only directly by the filesystem and do not call any fs functions only -the ->mark_dirty() operation. - More details about quota locking can be found in fs/dquot.c. --------------------------- vm_operations_struct ----------------------------- Index: linux-2.6/fs/ext3/super.c =================================================================== --- linux-2.6.orig/fs/ext3/super.c 2010-02-20 11:46:29.743440315 +0100 +++ linux-2.6/fs/ext3/super.c 2010-02-20 12:15:36.983004151 +0100 @@ -752,8 +752,6 @@ static ssize_t ext3_quota_write(struct s static const struct dquot_operations ext3_quota_operations = { .initialize = dquot_initialize, .drop = dquot_drop, - .alloc_inode = dquot_alloc_inode, - .free_inode = dquot_free_inode, .transfer = dquot_transfer, .write_dquot = ext3_write_dquot, .acquire_dquot = ext3_acquire_dquot, Index: linux-2.6/fs/ext4/super.c =================================================================== --- linux-2.6.orig/fs/ext4/super.c 2010-02-20 11:46:29.762194960 +0100 +++ linux-2.6/fs/ext4/super.c 2010-02-20 12:15:37.003004221 +0100 @@ -1017,8 +1017,6 @@ static const struct dquot_operations ext #ifdef CONFIG_QUOTA .get_reserved_space = ext4_get_reserved_space, #endif - .alloc_inode = dquot_alloc_inode, - .free_inode = dquot_free_inode, .transfer = dquot_transfer, .write_dquot = ext4_write_dquot, .acquire_dquot = ext4_acquire_dquot, Index: linux-2.6/fs/ocfs2/namei.c =================================================================== --- linux-2.6.orig/fs/ocfs2/namei.c 2010-02-20 11:46:30.014005898 +0100 +++ linux-2.6/fs/ocfs2/namei.c 2010-02-20 12:15:27.774010507 +0100 @@ -348,10 +348,7 @@ static int ocfs2_mknod(struct inode *dir goto leave; } - /* We don't use standard VFS wrapper because we don't want vfs_dq_init - * to be called. */ - if (sb_any_quota_active(osb->sb) && - osb->sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) { + if (dquot_alloc_inode(inode)) { status = -EDQUOT; goto leave; } @@ -431,7 +428,7 @@ static int ocfs2_mknod(struct inode *dir status = 0; leave: if (status < 0 && did_quota_inode) - vfs_dq_free_inode(inode); + dquot_free_inode(inode); if (handle) ocfs2_commit_trans(osb, handle); @@ -1688,10 +1685,7 @@ static int ocfs2_symlink(struct inode *d goto bail; } - /* We don't use standard VFS wrapper because we don't want vfs_dq_init - * to be called. */ - if (sb_any_quota_active(osb->sb) && - osb->sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) { + if (dquot_alloc_inode(inode)) { status = -EDQUOT; goto bail; } @@ -1791,7 +1785,7 @@ bail: dquot_free_space_nodirty(inode, ocfs2_clusters_to_bytes(osb->sb, 1)); if (status < 0 && did_quota_inode) - vfs_dq_free_inode(inode); + dquot_free_inode(inode); if (handle) ocfs2_commit_trans(osb, handle); @@ -2099,10 +2093,7 @@ int ocfs2_create_inode_in_orphan(struct goto leave; } - /* We don't use standard VFS wrapper because we don't want vfs_dq_init - * to be called. */ - if (sb_any_quota_active(osb->sb) && - osb->sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) { + if (dquot_alloc_inode(inode)) { status = -EDQUOT; goto leave; } @@ -2140,7 +2131,7 @@ int ocfs2_create_inode_in_orphan(struct insert_inode_hash(inode); leave: if (status < 0 && did_quota_inode) - vfs_dq_free_inode(inode); + dquot_free_inode(inode); if (handle) ocfs2_commit_trans(osb, handle); Index: linux-2.6/fs/ocfs2/quota_global.c =================================================================== --- linux-2.6.orig/fs/ocfs2/quota_global.c 2010-02-20 11:46:29.772255792 +0100 +++ linux-2.6/fs/ocfs2/quota_global.c 2010-02-20 12:15:37.025253208 +0100 @@ -853,8 +853,6 @@ static void ocfs2_destroy_dquot(struct d const struct dquot_operations ocfs2_quota_operations = { .initialize = dquot_initialize, .drop = dquot_drop, - .alloc_inode = dquot_alloc_inode, - .free_inode = dquot_free_inode, .transfer = dquot_transfer, .write_dquot = ocfs2_write_dquot, .acquire_dquot = ocfs2_acquire_dquot, Index: linux-2.6/fs/quota/dquot.c =================================================================== --- linux-2.6.orig/fs/quota/dquot.c 2010-02-20 11:47:23.752007784 +0100 +++ linux-2.6/fs/quota/dquot.c 2010-02-20 12:15:37.043254605 +0100 @@ -1531,15 +1531,15 @@ EXPORT_SYMBOL(__dquot_alloc_space); /* * This operation can block, but only after everything is updated */ -int dquot_alloc_inode(const struct inode *inode, qsize_t number) +int dquot_alloc_inode(const struct inode *inode) { - int cnt, ret = NO_QUOTA; + int cnt, ret = 1; char warntype[MAXQUOTAS]; /* First test before acquiring mutex - solves deadlocks when we * re-enter the quota code and are already holding the mutex */ - if (IS_NOQUOTA(inode)) - return QUOTA_OK; + if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) + return 0; for (cnt = 0; cnt < MAXQUOTAS; cnt++) warntype[cnt] = QUOTA_NL_NOWARN; down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); @@ -1547,7 +1547,7 @@ int dquot_alloc_inode(const struct inode for (cnt = 0; cnt < MAXQUOTAS; cnt++) { if (!inode->i_dquot[cnt]) continue; - if (check_idq(inode->i_dquot[cnt], number, warntype+cnt) + if (check_idq(inode->i_dquot[cnt], 1, warntype+cnt) == NO_QUOTA) goto warn_put_all; } @@ -1555,12 +1555,12 @@ int dquot_alloc_inode(const struct inode for (cnt = 0; cnt < MAXQUOTAS; cnt++) { if (!inode->i_dquot[cnt]) continue; - dquot_incr_inodes(inode->i_dquot[cnt], number); + dquot_incr_inodes(inode->i_dquot[cnt], 1); } - ret = QUOTA_OK; + ret = 0; warn_put_all: spin_unlock(&dq_data_lock); - if (ret == QUOTA_OK) + if (ret == 0) mark_all_dquot_dirty(inode->i_dquot); flush_warnings(inode->i_dquot, warntype); up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); @@ -1638,29 +1638,28 @@ EXPORT_SYMBOL(__dquot_free_space); /* * This operation can block, but only after everything is updated */ -int dquot_free_inode(const struct inode *inode, qsize_t number) +void dquot_free_inode(const struct inode *inode) { unsigned int cnt; char warntype[MAXQUOTAS]; /* First test before acquiring mutex - solves deadlocks when we * re-enter the quota code and are already holding the mutex */ - if (IS_NOQUOTA(inode)) - return QUOTA_OK; + if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) + return; down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); spin_lock(&dq_data_lock); for (cnt = 0; cnt < MAXQUOTAS; cnt++) { if (!inode->i_dquot[cnt]) continue; - warntype[cnt] = info_idq_free(inode->i_dquot[cnt], number); - dquot_decr_inodes(inode->i_dquot[cnt], number); + warntype[cnt] = info_idq_free(inode->i_dquot[cnt], 1); + dquot_decr_inodes(inode->i_dquot[cnt], 1); } spin_unlock(&dq_data_lock); mark_all_dquot_dirty(inode->i_dquot); flush_warnings(inode->i_dquot, warntype); up_read(&sb_dqopt(inode->i_sb)->dqptr_sem); - return QUOTA_OK; } EXPORT_SYMBOL(dquot_free_inode); @@ -1815,8 +1814,6 @@ EXPORT_SYMBOL(dquot_commit_info); const struct dquot_operations dquot_operations = { .initialize = dquot_initialize, .drop = dquot_drop, - .alloc_inode = dquot_alloc_inode, - .free_inode = dquot_free_inode, .transfer = dquot_transfer, .write_dquot = dquot_commit, .acquire_dquot = dquot_acquire, Index: linux-2.6/fs/reiserfs/super.c =================================================================== --- linux-2.6.orig/fs/reiserfs/super.c 2010-02-20 11:46:29.785031041 +0100 +++ linux-2.6/fs/reiserfs/super.c 2010-02-20 12:15:37.058262148 +0100 @@ -618,8 +618,6 @@ static int reiserfs_quota_on(struct supe static const struct dquot_operations reiserfs_quota_operations = { .initialize = dquot_initialize, .drop = dquot_drop, - .alloc_inode = dquot_alloc_inode, - .free_inode = dquot_free_inode, .transfer = dquot_transfer, .write_dquot = reiserfs_write_dquot, .acquire_dquot = reiserfs_acquire_dquot, Index: linux-2.6/include/linux/quota.h =================================================================== --- linux-2.6.orig/include/linux/quota.h 2010-02-20 11:46:29.798033346 +0100 +++ linux-2.6/include/linux/quota.h 2010-02-20 12:15:37.108003732 +0100 @@ -297,8 +297,6 @@ struct quota_format_ops { struct dquot_operations { int (*initialize) (struct inode *, int); int (*drop) (struct inode *); - int (*alloc_inode) (const struct inode *, qsize_t); - int (*free_inode) (const struct inode *, qsize_t); int (*transfer) (struct inode *, qid_t *, unsigned long); int (*write_dquot) (struct dquot *); /* Ordinary dquot write */ struct dquot *(*alloc_dquot)(struct super_block *, int); /* Allocate memory for new dquot */ Index: linux-2.6/include/linux/quotaops.h =================================================================== --- linux-2.6.orig/include/linux/quotaops.h 2010-02-20 11:46:29.731254186 +0100 +++ linux-2.6/include/linux/quotaops.h 2010-02-20 12:18:10.302065681 +0100 @@ -37,10 +37,10 @@ int __dquot_alloc_space(struct inode *in int warn, int reserve); void __dquot_free_space(struct inode *inode, qsize_t number, int reserve); -int dquot_alloc_inode(const struct inode *inode, qsize_t number); +int dquot_alloc_inode(const struct inode *inode); int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); -int dquot_free_inode(const struct inode *inode, qsize_t number); +void dquot_free_inode(const struct inode *inode); int dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask); int dquot_commit(struct dquot *dquot); @@ -148,26 +148,6 @@ static inline void vfs_dq_init(struct in inode->i_sb->dq_op->initialize(inode, -1); } -static inline int vfs_dq_alloc_inode(struct inode *inode) -{ - if (sb_any_quota_active(inode->i_sb)) { - vfs_dq_init(inode); - if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA) - return 1; - } - return 0; -} - -/* - * Release reserved (in-memory) quotas - */ - -static inline void vfs_dq_free_inode(struct inode *inode) -{ - if (sb_any_quota_active(inode->i_sb)) - inode->i_sb->dq_op->free_inode(inode, 1); -} - /* Cannot be called inside a transaction */ static inline int vfs_dq_off(struct super_block *sb, int remount) { @@ -235,12 +215,12 @@ static inline void vfs_dq_drop(struct in { } -static inline int vfs_dq_alloc_inode(struct inode *inode) +static inline int dquot_alloc_inode(const struct inode *inode) { return 0; } -static inline void vfs_dq_free_inode(struct inode *inode) +static inline void dquot_free_inode(const struct inode *inode) { } @@ -272,7 +252,7 @@ static inline void __dquot_free_space(st { if (!reserve) inode_sub_bytes(inode, number); -{ +} static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) { Index: linux-2.6/fs/ext2/ialloc.c =================================================================== --- linux-2.6.orig/fs/ext2/ialloc.c 2010-02-20 11:40:50.536254256 +0100 +++ linux-2.6/fs/ext2/ialloc.c 2010-02-20 12:15:28.810254674 +0100 @@ -121,7 +121,7 @@ void ext2_free_inode (struct inode * ino if (!is_bad_inode(inode)) { /* Quota is already initialized in iput() */ ext2_xattr_delete_inode(inode); - vfs_dq_free_inode(inode); + dquot_free_inode(inode); vfs_dq_drop(inode); } @@ -586,7 +586,8 @@ got: goto fail_drop; } - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { err = -EDQUOT; goto fail_drop; } @@ -605,7 +606,7 @@ got: return inode; fail_free_drop: - vfs_dq_free_inode(inode); + dquot_free_inode(inode); fail_drop: vfs_dq_drop(inode); Index: linux-2.6/fs/ext3/ialloc.c =================================================================== --- linux-2.6.orig/fs/ext3/ialloc.c 2010-02-20 11:40:50.444254116 +0100 +++ linux-2.6/fs/ext3/ialloc.c 2010-02-20 12:15:28.748003592 +0100 @@ -125,7 +125,7 @@ void ext3_free_inode (handle_t *handle, */ vfs_dq_init(inode); ext3_xattr_delete_inode(handle, inode); - vfs_dq_free_inode(inode); + dquot_free_inode(inode); vfs_dq_drop(inode); is_directory = S_ISDIR(inode->i_mode); @@ -588,7 +588,8 @@ got: sizeof(struct ext3_inode) - EXT3_GOOD_OLD_INODE_SIZE : 0; ret = inode; - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { err = -EDQUOT; goto fail_drop; } @@ -619,7 +620,7 @@ really_out: return ret; fail_free_drop: - vfs_dq_free_inode(inode); + dquot_free_inode(inode); fail_drop: vfs_dq_drop(inode); Index: linux-2.6/fs/ext4/ialloc.c =================================================================== --- linux-2.6.orig/fs/ext4/ialloc.c 2010-02-20 11:40:50.462027618 +0100 +++ linux-2.6/fs/ext4/ialloc.c 2010-02-20 12:15:28.766003592 +0100 @@ -219,7 +219,7 @@ void ext4_free_inode(handle_t *handle, s */ vfs_dq_init(inode); ext4_xattr_delete_inode(handle, inode); - vfs_dq_free_inode(inode); + dquot_free_inode(inode); vfs_dq_drop(inode); is_directory = S_ISDIR(inode->i_mode); @@ -1034,7 +1034,8 @@ got: ei->i_extra_isize = EXT4_SB(sb)->s_want_extra_isize; ret = inode; - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { err = -EDQUOT; goto fail_drop; } @@ -1074,7 +1075,7 @@ really_out: return ret; fail_free_drop: - vfs_dq_free_inode(inode); + dquot_free_inode(inode); fail_drop: vfs_dq_drop(inode); Index: linux-2.6/fs/jfs/inode.c =================================================================== --- linux-2.6.orig/fs/jfs/inode.c 2010-02-20 11:40:50.545274091 +0100 +++ linux-2.6/fs/jfs/inode.c 2010-02-20 12:15:28.827253627 +0100 @@ -159,7 +159,7 @@ void jfs_delete_inode(struct inode *inod * Free the inode from the quota allocation. */ vfs_dq_init(inode); - vfs_dq_free_inode(inode); + dquot_free_inode(inode); vfs_dq_drop(inode); } Index: linux-2.6/fs/jfs/jfs_inode.c =================================================================== --- linux-2.6.orig/fs/jfs/jfs_inode.c 2010-02-20 11:40:50.556254186 +0100 +++ linux-2.6/fs/jfs/jfs_inode.c 2010-02-20 12:15:28.835255512 +0100 @@ -116,7 +116,8 @@ struct inode *ialloc(struct inode *paren /* * Allocate inode to quota. */ - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { rc = -EDQUOT; goto fail_drop; } Index: linux-2.6/fs/ocfs2/inode.c =================================================================== --- linux-2.6.orig/fs/ocfs2/inode.c 2010-02-20 11:40:50.497003942 +0100 +++ linux-2.6/fs/ocfs2/inode.c 2010-02-20 12:15:30.316254255 +0100 @@ -665,7 +665,7 @@ static int ocfs2_remove_inode(struct ino } ocfs2_remove_from_cache(INODE_CACHE(inode), di_bh); - vfs_dq_free_inode(inode); + dquot_free_inode(inode); status = ocfs2_free_dinode(handle, inode_alloc_inode, inode_alloc_bh, di); Index: linux-2.6/fs/reiserfs/inode.c =================================================================== --- linux-2.6.orig/fs/reiserfs/inode.c 2010-02-20 11:40:50.524004501 +0100 +++ linux-2.6/fs/reiserfs/inode.c 2010-02-20 12:15:37.067254326 +0100 @@ -54,7 +54,7 @@ void reiserfs_delete_inode(struct inode * after delete_object so that quota updates go into the same transaction as * stat data deletion */ if (!err) - vfs_dq_free_inode(inode); + dquot_free_inode(inode); if (journal_end(&th, inode->i_sb, jbegin_count)) goto out; @@ -1765,7 +1765,8 @@ int reiserfs_new_inode(struct reiserfs_t BUG_ON(!th->t_trans_id); - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { err = -EDQUOT; goto out_end_trans; } @@ -1959,7 +1960,7 @@ int reiserfs_new_inode(struct reiserfs_t INODE_PKEY(inode)->k_objectid = 0; /* Quota change must be inside a transaction for journaling */ - vfs_dq_free_inode(inode); + dquot_free_inode(inode); out_end_trans: journal_end(th, th->t_super, th->t_blocks_allocated); Index: linux-2.6/fs/udf/ialloc.c =================================================================== --- linux-2.6.orig/fs/udf/ialloc.c 2010-02-20 11:40:50.567004361 +0100 +++ linux-2.6/fs/udf/ialloc.c 2010-02-20 12:15:28.864012951 +0100 @@ -36,7 +36,7 @@ void udf_free_inode(struct inode *inode) * Note: we must free any quota before locking the superblock, * as writing the quota to disk may need the lock as well. */ - vfs_dq_free_inode(inode); + dquot_free_inode(inode); vfs_dq_drop(inode); clear_inode(inode); @@ -153,7 +153,8 @@ struct inode *udf_new_inode(struct inode insert_inode_hash(inode); mark_inode_dirty(inode); - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { vfs_dq_drop(inode); inode->i_flags |= S_NOQUOTA; inode->i_nlink = 0; Index: linux-2.6/fs/ufs/ialloc.c =================================================================== --- linux-2.6.orig/fs/ufs/ialloc.c 2010-02-20 11:40:50.578011834 +0100 +++ linux-2.6/fs/ufs/ialloc.c 2010-02-20 12:15:28.874275417 +0100 @@ -95,7 +95,7 @@ void ufs_free_inode (struct inode * inod is_directory = S_ISDIR(inode->i_mode); - vfs_dq_free_inode(inode); + dquot_free_inode(inode); vfs_dq_drop(inode); clear_inode (inode); @@ -355,7 +355,8 @@ cg_found: unlock_super (sb); - if (vfs_dq_alloc_inode(inode)) { + vfs_dq_init(inode); + if (dquot_alloc_inode(inode)) { vfs_dq_drop(inode); err = -EDQUOT; goto fail_without_unlock; -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html