ocfs2: Add missing initialization
Subsystems (4)
Jan Kara
reviewerPATCH 1/10 ocfs2: Add missing initialization
Add missing variable initialization to ocfs2_dquot_drop_slow().
--- fs/ocfs2/quota_global.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
fs/ocfs2/quota_global.c +1 -1
@@ -873,7 +873,7 @@ out:static int ocfs2_dquot_drop_slow (struct inode *inode) { -int status; +int status =0 ;int cnt;int got_lock[MAXQUOTAS ] = {0 ,0 };handle_t *handle;
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 2/10 ocfs2: Fix ocfs2_read_quota_block() error handling.
From: Joel Becker <[email protected]>
ocfs2_bread() has become ocfs2_read_virt_blocks(), with a prototype to match ocfs2_read_blocks(). The quota code, converting from ocfs2_bread(), wraps the call to ocfs2_read_virt_blocks() in ocfs2_read_quota_block(). Unfortunately, the prototype of ocfs2_read_quota_block() matches the old prototype of ocfs2_bread().
The problem is that ocfs2_bread() returned the buffer head, and callers assumed that a NULL pointer was indicative of error. It wasn't. This is why ocfs2_bread() took an int*err argument as well.
The new prototype of ocfs2_read_virt_blocks() avoids this error handling confusion. Let's change ocfs2_read_quota_block() to match.
--- fs/ocfs2/dlmglue.c | 6 ++-- fs/ocfs2/quota.h | 4 +- fs/ocfs2/quota_global.c | 34 ++++++++++++++---------- fs/ocfs2/quota_local.c | 64 +++++++++++++++++++++++++--------------------- 4 files changed, 60 insertions(+), 48 deletions(-)
fs/ocfs2/dlmglue.c +3 -3
@@ -3519,7 +3519,7 @@ static int ocfs2_refresh_qinfo(struct ocfs2_mem_dqinfo *oinfo) oinfo->dqi_gi.dqi_type);struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;struct ocfs2_qinfo_lvb *lvb =ocfs2_dlm_lvb (&lockres->l_lksb); -struct buffer_head *bh; +struct buffer_head *bh =NULL ;struct ocfs2_global_disk_dqinfo *gdinfo;int status =0 ;
@@ -3532,8 +3532,8 @@ static int ocfs2_refresh_qinfo(struct ocfs2_mem_dqinfo *oinfo) oinfo->dqi_gi.dqi_free_entry =be32_to_cpu (lvb->lvb_free_entry); }else { - bh =ocfs2_read_quota_block (oinfo->dqi_gqinode,0 , &status); -if (!bh) { + status =ocfs2_read_quota_block (oinfo->dqi_gqinode,0 , &bh); +if (status) {mlog_errno (status); goto bail; }
fs/ocfs2/quota.h +2 -2
@@ -108,8 +108,8 @@ static inline int ocfs2_global_release_dquot(struct dquot *dquot)int ocfs2_lock_global_qf (struct ocfs2_mem_dqinfo *oinfo,int ex);void ocfs2_unlock_global_qf (struct ocfs2_mem_dqinfo *oinfo,int ex); -struct buffer_head *ocfs2_read_quota_block (struct inode *inode, -int block,int *err); +int ocfs2_read_quota_block (struct inode *inode,u64 v_block, +struct buffer_head **bh);extern struct dquot_operations ocfs2_quota_operations;extern struct quota_format_type ocfs2_quota_format;
fs/ocfs2/quota_global.c +20 -14
@@ -85,16 +85,21 @@ struct qtree_fmt_operations ocfs2_global_ops = { .is_id = ocfs2_global_is_id, }; -struct buffer_head *ocfs2_read_quota_block (struct inode *inode, -int block,int *err) +int ocfs2_read_quota_block (struct inode *inode,u64 v_block, +struct buffer_head **bh) { -struct buffer_head *tmp =NULL ; +int rc =0 ; +struct buffer_head *tmp = *bh; - *err =ocfs2_read_virt_blocks (inode, block,1 , &tmp,0 ,NULL ); -if (*err) -mlog_errno (*err); + rc =ocfs2_read_virt_blocks (inode, v_block,1 , &tmp,0 ,NULL ); +if (rc) +mlog_errno (rc); + +/* If ocfs2_read_virt_blocks() got us a new bh, pass it up. */ +if (!rc && !*bh) + *bh = tmp; -return tmp; +return rc; } static struct buffer_head *ocfs2_get_quota_block(struct inode *inode,
@@ -141,8 +146,9 @@ ssize_t ocfs2_quota_read(struct super_block *sb, int type, char *data, toread = len;while (toread >0 ) { tocopy =min ((size_t )(sb->s_blocksize - offset), toread); - bh =ocfs2_read_quota_block (gqinode, blk, &err); -if (!bh) { + bh =NULL ; + err =ocfs2_read_quota_block (gqinode, blk, &bh); +if (err) {mlog_errno (err);return err; }
@@ -167,7 +173,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,int offset = off & (sb->s_blocksize -1 );sector_t blk = off >> sb->s_blocksize_bits;int err =0 , new =0 ; -struct buffer_head *bh; +struct buffer_head *bh =NULL ;handle_t *handle =journal_current_handle ();if (!handle) {
@@ -198,13 +204,13 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,/* Not rewriting whole block? */ if ((offset || len < sb->s_blocksize -OCFS2_QBLK_RESERVED_SPACE ) && !new) { - bh =ocfs2_read_quota_block (gqinode, blk, &err); -if (!bh) { + err =ocfs2_read_quota_block (gqinode, blk, &bh); +if (err) {mlog_errno (err);return err; } err =ocfs2_journal_access (handle, gqinode, bh, -OCFS2_JOURNAL_ACCESS_WRITE ); +OCFS2_JOURNAL_ACCESS_WRITE ); }else { bh =ocfs2_get_quota_block (gqinode, blk, &err);if (!bh) {
@@ -212,7 +218,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,return err; } err =ocfs2_journal_access (handle, gqinode, bh, -OCFS2_JOURNAL_ACCESS_CREATE ); +OCFS2_JOURNAL_ACCESS_CREATE ); }if (err <0 ) {brelse (bh);
fs/ocfs2/quota_local.c +35 -29
134 lines not on this page · raw message
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 3/10 ocfs2: Fix oops when extending quota files
We have to mark buffer as uptodate before calling ocfs2_journal_access() and ocfs2_set_buffer_uptodate() does not do this for us.
--- fs/ocfs2/quota_global.c | 28 ++++++++++++---------------- 1 files changed, 12 insertions(+), 16 deletions(-)
fs/ocfs2/quota_global.c +12 -16
@@ -172,7 +172,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,struct inode *gqinode = oinfo->dqi_gqinode;int offset = off & (sb->s_blocksize -1 );sector_t blk = off >> sb->s_blocksize_bits; -int err =0 , new =0 ; +int err =0 , new =0 , ja_type;struct buffer_head *bh =NULL ;handle_t *handle =journal_current_handle ();
@@ -205,32 +205,28 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,if ((offset || len < sb->s_blocksize -OCFS2_QBLK_RESERVED_SPACE ) && !new) { err =ocfs2_read_quota_block (gqinode, blk, &bh); -if (err) { -mlog_errno (err); -return err; - } - err =ocfs2_journal_access (handle, gqinode, bh, -OCFS2_JOURNAL_ACCESS_WRITE ); + ja_type =OCFS2_JOURNAL_ACCESS_WRITE ; }else { bh =ocfs2_get_quota_block (gqinode, blk, &err); -if (!bh) { -mlog_errno (err); -return err; - } - err =ocfs2_journal_access (handle, gqinode, bh, -OCFS2_JOURNAL_ACCESS_CREATE ); + ja_type =OCFS2_JOURNAL_ACCESS_CREATE ; } -if (err <0 ) { -brelse (bh); - goto out; +if (err) { +mlog_errno (err); +return err; }lock_buffer (bh);if (new)memset (bh->b_data,0 , sb->s_blocksize);memcpy (bh->b_data + offset, data, len);flush_dcache_page (bh->b_page); +set_buffer_uptodate (bh);unlock_buffer (bh);ocfs2_set_buffer_uptodate (gqinode, bh); + err =ocfs2_journal_access (handle, gqinode, bh, ja_type); +if (err <0 ) { +brelse (bh); + goto out; + } err =ocfs2_journal_dirty (handle, bh);brelse (bh);if (err <0 )
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 4/10 ocfs2: Make ocfs2_get_quota_block() consistent with ocfs2_read_quota_block()
Make function return error status and not buffer pointer so that it's consistent with ocfs2_read_quota_block().
--- fs/ocfs2/quota_global.c | 27 +++++++++++++-------------- 1 files changed, 13 insertions(+), 14 deletions(-)
fs/ocfs2/quota_global.c +13 -14
@@ -102,26 +102,25 @@ int ocfs2_read_quota_block(struct inode *inode, u64 v_block,return rc; } -static struct buffer_head *ocfs2_get_quota_block (struct inode *inode, -int block,int *err) +static int ocfs2_get_quota_block (struct inode *inode,int block, +struct buffer_head **bh) {u64 pblock, pcount; -struct buffer_head *bh; +int err;down_read (&OCFS2_I (inode)->ip_alloc_sem); - *err =ocfs2_extent_map_get_blocks (inode, block, &pblock, &pcount, -NULL ); + err =ocfs2_extent_map_get_blocks (inode, block, &pblock, &pcount,NULL );up_read (&OCFS2_I (inode)->ip_alloc_sem); -if (*err) { -mlog_errno (*err); -return NULL ; +if (err) { +mlog_errno (err); +return err; } - bh =sb_getblk (inode->i_sb, pblock); -if (!bh) { - *err = -EIO ; -mlog_errno (*err); + *bh =sb_getblk (inode->i_sb, pblock); +if (!*bh) { + err = -EIO ; +mlog_errno (err); } -return bh; +return err;; }/* Read data from global quotafile - avoid pagecache and such because we cannot
@@ -207,7 +206,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, err =ocfs2_read_quota_block (gqinode, blk, &bh); ja_type =OCFS2_JOURNAL_ACCESS_WRITE ; }else { - bh =ocfs2_get_quota_block (gqinode, blk, &err); + err =ocfs2_get_quota_block (gqinode, blk, &bh); ja_type =OCFS2_JOURNAL_ACCESS_CREATE ; }if (err) {
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 5/10 ocfs2: Fix build warnings (64-bit types vs long long)
fs/ocfs2/quota_local.c: In function 'olq_set_dquot':fs/ocfs2/quota_local.c:844: warning: format '%lld' expects type 'long long int', but argument 7 has type '__le64' fs/ocfs2/quota_local.c:844: warning: format '%lld' expects type 'long long int', but argument 8 has type '__le64' fs/ocfs2/quota_local.c:844: warning: format '%lld' expects type 'long long int', but argument 7 has type '__le64' fs/ocfs2/quota_local.c:844: warning: format '%lld' expects type 'long long int', but argument 8 has type '__le64' fs/ocfs2/quota_local.c:844: warning: format '%lld' expects type 'long long int', but argument 7 has type '__le64' fs/ocfs2/quota_local.c:844: warning: format '%lld' expects type 'long long int', but argument 8 has type '__le64' fs/ocfs2/quota_global.c: In function '__ocfs2_sync_dquot':fs/ocfs2/quota_global.c:457: warning: format '%lld' expects type 'long long int', but argument 8 has type 's64' fs/ocfs2/quota_global.c:457: warning: format '%lld' expects type 'long long int', but argument 10 has type 's64' fs/ocfs2/quota_global.c:457: warning: format '%lld' expects type 'long long int', but argument 8 has type 's64' fs/ocfs2/quota_global.c:457: warning: format '%lld' expects type 'long long int', but argument 10 has type 's64' fs/ocfs2/quota_global.c:457: warning: format '%lld' expects type 'long long int', but argument 8 has type 's64' fs/ocfs2/quota_global.c:457: warning: format '%lld' expects type 'long long int', but argument 10 has type 's64'
--- fs/ocfs2/quota_global.c | 6 +++--- fs/ocfs2/quota_local.c | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-)
fs/ocfs2/quota_global.c +3 -3
@@ -455,9 +455,9 @@ int __ocfs2_sync_dquot(struct dquot *dquot, int freeing) olditime = dquot->dq_dqb.dqb_itime; oldbtime = dquot->dq_dqb.dqb_btime;ocfs2_global_disk2memdqb (dquot, &dqblk); -mlog (0 ,"Syncing global dquot %d space %lld+%lld, inodes %lld+%lld\n" , - dquot->dq_id, dquot->dq_dqb.dqb_curspace, spacechange, - dquot->dq_dqb.dqb_curinodes, inodechange); +mlog (0 ,"Syncing global dquot %u space %lld+%lld, inodes %lld+%lld\n" , + dquot->dq_id, dquot->dq_dqb.dqb_curspace, (long long )spacechange, + dquot->dq_dqb.dqb_curinodes, (long long )inodechange);if (!test_bit (DQ_LASTSET_B +QIF_SPACE_B , &dquot->dq_flags)) dquot->dq_dqb.dqb_curspace += spacechange;if (!test_bit (DQ_LASTSET_B +QIF_INODES_B , &dquot->dq_flags))
fs/ocfs2/quota_local.c +2 -1
@@ -848,7 +848,8 @@ static void olq_set_dquot(struct buffer_head *bh, void *private) od->dq_originodes);spin_unlock (&dq_data_lock);mlog (0 ,"Writing local dquot %u space %lld inodes %lld\n" , - od->dq_dquot.dq_id, dqblk->dqb_spacemod, dqblk->dqb_inodemod); + od->dq_dquot.dq_id, (long long )le64_to_cpu (dqblk->dqb_spacemod), + (long long )le64_to_cpu (dqblk->dqb_inodemod)); }/* Write dquot to local quota file */
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 6/10 quota: Unexport dqblk_v1.h and dqblk_v2.h
Unexport header files dqblk_v[12].h since except for quota format ID they don't contain information userspace should be interested in. Move ID definitions to quota.h.
--- include/linux/Kbuild | 2 -- include/linux/dqblk_v1.h | 3 --- include/linux/dqblk_v2.h | 3 --- include/linux/quota.h | 4 ++++ 4 files changed, 4 insertions(+), 8 deletions(-)
include/linux/Kbuild +0 -2
@@ -56,8 +56,6 @@ header-y += dlm_device.h header-y += dlm_netlink.h header-y += dm-ioctl.h header-y += dn.h -header-y += dqblk_v1.h -header-y += dqblk_v2.h header-y += dqblk_xfs.h header-y += efs_fs_sb.h header-y += elf-fdpic.h
include/linux/dqblk_v1.h +0 -3
@@ -5,9 +5,6 @@#ifndef _LINUX_DQBLK_V1_H#define _LINUX_DQBLK_V1_H -/* Id of quota format */ -#define QFMT_VFS_OLD 1 -/* Root squash turned on */ #define V1_DQF_RSQUASH 1
include/linux/dqblk_v2.h +0 -3
@@ -7,9 +7,6 @@#include <linux/dqblk_qtree.h> -/* Id number of quota format */ -#define QFMT_VFS_V0 2 -/* Numbers of blocks needed for updates */ #define V2_INIT_ALLOC QTREE_INIT_ALLOC#define V2_INIT_REWRITE QTREE_INIT_REWRITE
include/linux/quota.h +4 -0
@@ -70,6 +70,10 @@#define Q_GETQUOTA 0x800007/* get user quota structure */ #define Q_SETQUOTA 0x800008/* set user quota structure */ +/* Quota format type IDs */ +#define QFMT_VFS_OLD 1 +#define QFMT_VFS_V0 2 +/* Size of block in which space limits are passed through the quota * interface */ #define QIF_DQBLKSIZE_BITS 10
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 7/10 quota: Export dquot_alloc() and dquot_destroy() functions
These are default functions for creating and destroying quota structures and they should be used from filesystems.
--- fs/dquot.c | 6 ++++-- include/linux/quotaops.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-)
fs/dquot.c +4 -2
@@ -413,10 +413,11 @@ out_dqlock:return ret; } -static void dquot_destroy (struct dquot *dquot) +void dquot_destroy (struct dquot *dquot) {kmem_cache_free (dquot_cachep, dquot); } +EXPORT_SYMBOL (dquot_destroy);static inline void do_destroy_dquot (struct dquot *dquot) {
@@ -668,10 +669,11 @@ we_slept:spin_unlock (&dq_list_lock); } -static struct dquot *dquot_alloc (struct super_block *sb,int type) +struct dquot *dquot_alloc (struct super_block *sb,int type) {return kmem_cache_zalloc (dquot_cachep,GFP_NOFS ); } +EXPORT_SYMBOL (dquot_alloc);static struct dquot *get_empty_dquot (struct super_block *sb,int type) {
include/linux/quotaops.h +2 -0
@@ -31,6 +31,8 @@ int dquot_is_cached(struct super_block *sb, unsigned int id, int type);int dquot_scan_active (struct super_block *sb,int (*fn)(struct dquot *dquot,unsigned long priv),unsigned long priv); +struct dquot *dquot_alloc (struct super_block *sb,int type); +void dquot_destroy (struct dquot *dquot);int dquot_alloc_space (struct inode *inode,qsize_t number,int prealloc);int dquot_alloc_inode (const struct inode *inode,qsize_t number);
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 8/10 reiserfs: Add default allocation routines for quota structures
--- fs/reiserfs/super.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
fs/reiserfs/super.c +2 -0
@@ -649,6 +649,8 @@ static struct dquot_operations reiserfs_quota_operations = { .release_dquot = reiserfs_release_dquot, .mark_dirty = reiserfs_mark_dquot_dirty, .write_info = reiserfs_write_info, + .alloc_dquot = dquot_alloc, + .destroy_dquot = dquot_destroy, };static struct quotactl_ops reiserfs_qctl_operations = {
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 9/10 ext3: Add default allocation routines for quota structures
--- fs/ext3/super.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
fs/ext3/super.c +3 -1
@@ -713,7 +713,9 @@ static struct dquot_operations ext3_quota_operations = { .acquire_dquot = ext3_acquire_dquot, .release_dquot = ext3_release_dquot, .mark_dirty = ext3_mark_dquot_dirty, - .write_info = ext3_write_info + .write_info = ext3_write_info, + .alloc_dquot = dquot_alloc, + .destroy_dquot = dquot_destroy, };static struct quotactl_ops ext3_qctl_operations = {
Signature · 1 line
1.6.0.4
Jan Kara
reviewerPATCH 10/10 ext4: Add default allocation routines for quota structures
--- fs/ext4/super.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
fs/ext4/super.c +3 -1
@@ -803,7 +803,9 @@ static struct dquot_operations ext4_quota_operations = { .acquire_dquot = ext4_acquire_dquot, .release_dquot = ext4_release_dquot, .mark_dirty = ext4_mark_dquot_dirty, - .write_info = ext4_write_info + .write_info = ext4_write_info, + .alloc_dquot = dquot_alloc, + .destroy_dquot = dquot_destroy, };static struct quotactl_ops ext4_qctl_operations = {
Signature · 1 line
1.6.0.4
PATCH 1/10 ocfs2: Add missing initialization
In reply to Jan KaraHi Jan,
I have already found this and generate a patch for it.
http://oss.oracle.com/pipermail/ocfs2-devel/2008-November/003413.html
but since Mark hasn't push it to his merge_window, I think either of the patch is OK.
Regards,
Tao
Quoted 20 lines · Jan Kara
Add missing variable initialization to
ocfs2_dquot_drop_slow().Signed-off-by Jan Kara <[email protected]>--- fs/ocfs2/quota_global.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)fs/ocfs2/quota_global.c +1
-1@@ -873,7 +873,7 @@ out:static int ocfs2_dquot_drop_slow (struct inode *inode) { -int status; +int status =0 ;int cnt;int got_lock[MAXQUOTAS ] = {0 ,0 };handle_t *handle;