Skip to content

Commit 2eca18d

Browse files
Christoph Hellwiggregkh
authored andcommitted
xfs: don't use a xfs_log_iovec for ri_buf in log recovery
[ Upstream commit ded74fd ] ri_buf just holds a pointer/len pair and is not a log iovec used for writing to the log. Switch to use a kvec instead. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> Signed-off-by: Carlos Maiolino <cem@kernel.org> Stable-dep-of: 813f813 ("xfs: bounds-check buffer log item's dirty bitmap") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent d3ffb89 commit 2eca18d

16 files changed

Lines changed: 123 additions & 121 deletions

fs/xfs/libxfs/xfs_log_recover.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ struct xlog_recover_item {
9595
struct list_head ri_list;
9696
int ri_cnt; /* count of regions found */
9797
int ri_total; /* total regions */
98-
struct xfs_log_iovec *ri_buf; /* ptr to regions buffer */
98+
struct kvec *ri_buf; /* ptr to regions buffer */
9999
const struct xlog_recover_item_ops *ri_ops;
100100
};
101101

@@ -108,7 +108,7 @@ struct xlog_recover {
108108
struct list_head r_itemq; /* q for items */
109109
};
110110

111-
#define ITEM_TYPE(i) (*(unsigned short *)(i)->ri_buf[0].i_addr)
111+
#define ITEM_TYPE(i) (*(unsigned short *)(i)->ri_buf[0].iov_base)
112112

113113
#define XLOG_RECOVER_CRCPASS 0
114114
#define XLOG_RECOVER_PASS1 1

fs/xfs/xfs_attr_item.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -729,13 +729,13 @@ xlog_recover_attri_commit_pass2(
729729

730730
/* Validate xfs_attri_log_format before the large memory allocation */
731731
len = sizeof(struct xfs_attri_log_format);
732-
if (item->ri_buf[i].i_len != len) {
732+
if (item->ri_buf[i].iov_len != len) {
733733
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
734-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
734+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
735735
return -EFSCORRUPTED;
736736
}
737737

738-
attri_formatp = item->ri_buf[i].i_addr;
738+
attri_formatp = item->ri_buf[i].iov_base;
739739
if (!xfs_attri_validate(mp, attri_formatp)) {
740740
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
741741
attri_formatp, len);
@@ -770,14 +770,14 @@ xlog_recover_attri_commit_pass2(
770770
i++;
771771

772772
/* Validate the attr name */
773-
if (item->ri_buf[i].i_len !=
773+
if (item->ri_buf[i].iov_len !=
774774
xlog_calc_iovec_len(attri_formatp->alfi_name_len)) {
775775
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
776776
attri_formatp, len);
777777
return -EFSCORRUPTED;
778778
}
779779

780-
attr_name = item->ri_buf[i].i_addr;
780+
attr_name = item->ri_buf[i].iov_base;
781781
if (!xfs_attr_namecheck(attri_formatp->alfi_attr_filter, attr_name,
782782
attri_formatp->alfi_name_len)) {
783783
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
@@ -788,14 +788,14 @@ xlog_recover_attri_commit_pass2(
788788

789789
/* Validate the attr value, if present */
790790
if (attri_formatp->alfi_value_len != 0) {
791-
if (item->ri_buf[i].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
791+
if (item->ri_buf[i].iov_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
792792
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
793-
item->ri_buf[0].i_addr,
794-
item->ri_buf[0].i_len);
793+
item->ri_buf[0].iov_base,
794+
item->ri_buf[0].iov_len);
795795
return -EFSCORRUPTED;
796796
}
797797

798-
attr_value = item->ri_buf[i].i_addr;
798+
attr_value = item->ri_buf[i].iov_base;
799799
i++;
800800
}
801801

@@ -912,10 +912,10 @@ xlog_recover_attrd_commit_pass2(
912912
{
913913
struct xfs_attrd_log_format *attrd_formatp;
914914

915-
attrd_formatp = item->ri_buf[0].i_addr;
916-
if (item->ri_buf[0].i_len != sizeof(struct xfs_attrd_log_format)) {
915+
attrd_formatp = item->ri_buf[0].iov_base;
916+
if (item->ri_buf[0].iov_len != sizeof(struct xfs_attrd_log_format)) {
917917
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
918-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
918+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
919919
return -EFSCORRUPTED;
920920
}
921921

fs/xfs/xfs_bmap_item.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -669,24 +669,24 @@ xlog_recover_bui_commit_pass2(
669669
struct xfs_bui_log_format *bui_formatp;
670670
size_t len;
671671

672-
bui_formatp = item->ri_buf[0].i_addr;
672+
bui_formatp = item->ri_buf[0].iov_base;
673673

674-
if (item->ri_buf[0].i_len < xfs_bui_log_format_sizeof(0)) {
674+
if (item->ri_buf[0].iov_len < xfs_bui_log_format_sizeof(0)) {
675675
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
676-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
676+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
677677
return -EFSCORRUPTED;
678678
}
679679

680680
if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) {
681681
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
682-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
682+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
683683
return -EFSCORRUPTED;
684684
}
685685

686686
len = xfs_bui_log_format_sizeof(bui_formatp->bui_nextents);
687-
if (item->ri_buf[0].i_len != len) {
687+
if (item->ri_buf[0].iov_len != len) {
688688
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
689-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
689+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
690690
return -EFSCORRUPTED;
691691
}
692692

@@ -720,10 +720,10 @@ xlog_recover_bud_commit_pass2(
720720
{
721721
struct xfs_bud_log_format *bud_formatp;
722722

723-
bud_formatp = item->ri_buf[0].i_addr;
724-
if (item->ri_buf[0].i_len != sizeof(struct xfs_bud_log_format)) {
723+
bud_formatp = item->ri_buf[0].iov_base;
724+
if (item->ri_buf[0].iov_len != sizeof(struct xfs_bud_log_format)) {
725725
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
726-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
726+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
727727
return -EFSCORRUPTED;
728728
}
729729

fs/xfs/xfs_buf_item.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,16 @@ static inline struct xfs_buf_log_item *BUF_ITEM(struct xfs_log_item *lip)
3535
/* Is this log iovec plausibly large enough to contain the buffer log format? */
3636
bool
3737
xfs_buf_log_check_iovec(
38-
struct xfs_log_iovec *iovec)
38+
struct kvec *iovec)
3939
{
40-
struct xfs_buf_log_format *blfp = iovec->i_addr;
40+
struct xfs_buf_log_format *blfp = iovec->iov_base;
4141
char *bmp_end;
4242
char *item_end;
4343

44-
if (offsetof(struct xfs_buf_log_format, blf_data_map) > iovec->i_len)
44+
if (offsetof(struct xfs_buf_log_format, blf_data_map) > iovec->iov_len)
4545
return false;
4646

47-
item_end = (char *)iovec->i_addr + iovec->i_len;
47+
item_end = (char *)iovec->iov_base + iovec->iov_len;
4848
bmp_end = (char *)&blfp->blf_data_map[blfp->blf_map_size];
4949
return bmp_end <= item_end;
5050
}

fs/xfs/xfs_buf_item.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static inline void xfs_buf_dquot_io_fail(struct xfs_buf *bp)
6767
}
6868
#endif /* CONFIG_XFS_QUOTA */
6969
void xfs_buf_iodone(struct xfs_buf *);
70-
bool xfs_buf_log_check_iovec(struct xfs_log_iovec *iovec);
70+
bool xfs_buf_log_check_iovec(struct kvec *iovec);
7171

7272
extern struct kmem_cache *xfs_buf_item_cache;
7373

fs/xfs/xfs_buf_item_recover.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ STATIC enum xlog_recover_reorder
157157
xlog_recover_buf_reorder(
158158
struct xlog_recover_item *item)
159159
{
160-
struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
160+
struct xfs_buf_log_format *buf_f = item->ri_buf[0].iov_base;
161161

162162
if (buf_f->blf_flags & XFS_BLF_CANCEL)
163163
return XLOG_REORDER_CANCEL_LIST;
@@ -171,7 +171,7 @@ xlog_recover_buf_ra_pass2(
171171
struct xlog *log,
172172
struct xlog_recover_item *item)
173173
{
174-
struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
174+
struct xfs_buf_log_format *buf_f = item->ri_buf[0].iov_base;
175175

176176
xlog_buf_readahead(log, buf_f->blf_blkno, buf_f->blf_len, NULL);
177177
}
@@ -185,11 +185,11 @@ xlog_recover_buf_commit_pass1(
185185
struct xlog *log,
186186
struct xlog_recover_item *item)
187187
{
188-
struct xfs_buf_log_format *bf = item->ri_buf[0].i_addr;
188+
struct xfs_buf_log_format *bf = item->ri_buf[0].iov_base;
189189

190190
if (!xfs_buf_log_check_iovec(&item->ri_buf[0])) {
191-
xfs_err(log->l_mp, "bad buffer log item size (%d)",
192-
item->ri_buf[0].i_len);
191+
xfs_err(log->l_mp, "bad buffer log item size (%zd)",
192+
item->ri_buf[0].iov_len);
193193
return -EFSCORRUPTED;
194194
}
195195

@@ -470,8 +470,8 @@ xlog_recover_do_reg_buffer(
470470
nbits = xfs_contig_bits(buf_f->blf_data_map,
471471
buf_f->blf_map_size, bit);
472472
ASSERT(nbits > 0);
473-
ASSERT(item->ri_buf[i].i_addr != NULL);
474-
ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0);
473+
ASSERT(item->ri_buf[i].iov_base != NULL);
474+
ASSERT(item->ri_buf[i].iov_len % XFS_BLF_CHUNK == 0);
475475
ASSERT(BBTOB(bp->b_length) >=
476476
((uint)bit << XFS_BLF_SHIFT) + (nbits << XFS_BLF_SHIFT));
477477

@@ -483,8 +483,8 @@ xlog_recover_do_reg_buffer(
483483
* the log. Hence we need to trim nbits back to the length of
484484
* the current region being copied out of the log.
485485
*/
486-
if (item->ri_buf[i].i_len < (nbits << XFS_BLF_SHIFT))
487-
nbits = item->ri_buf[i].i_len >> XFS_BLF_SHIFT;
486+
if (item->ri_buf[i].iov_len < (nbits << XFS_BLF_SHIFT))
487+
nbits = item->ri_buf[i].iov_len >> XFS_BLF_SHIFT;
488488

489489
/*
490490
* Do a sanity check if this is a dquot buffer. Just checking
@@ -494,18 +494,18 @@ xlog_recover_do_reg_buffer(
494494
fa = NULL;
495495
if (buf_f->blf_flags &
496496
(XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) {
497-
if (item->ri_buf[i].i_addr == NULL) {
497+
if (item->ri_buf[i].iov_base == NULL) {
498498
xfs_alert(mp,
499499
"XFS: NULL dquot in %s.", __func__);
500500
goto next;
501501
}
502-
if (item->ri_buf[i].i_len < size_disk_dquot) {
502+
if (item->ri_buf[i].iov_len < size_disk_dquot) {
503503
xfs_alert(mp,
504-
"XFS: dquot too small (%d) in %s.",
505-
item->ri_buf[i].i_len, __func__);
504+
"XFS: dquot too small (%zd) in %s.",
505+
item->ri_buf[i].iov_len, __func__);
506506
goto next;
507507
}
508-
fa = xfs_dquot_verify(mp, item->ri_buf[i].i_addr, -1);
508+
fa = xfs_dquot_verify(mp, item->ri_buf[i].iov_base, -1);
509509
if (fa) {
510510
xfs_alert(mp,
511511
"dquot corrupt at %pS trying to replay into block 0x%llx",
@@ -516,7 +516,7 @@ xlog_recover_do_reg_buffer(
516516

517517
memcpy(xfs_buf_offset(bp,
518518
(uint)bit << XFS_BLF_SHIFT), /* dest */
519-
item->ri_buf[i].i_addr, /* source */
519+
item->ri_buf[i].iov_base, /* source */
520520
nbits<<XFS_BLF_SHIFT); /* length */
521521
next:
522522
i++;
@@ -652,16 +652,16 @@ xlog_recover_do_inode_buffer(
652652
if (next_unlinked_offset < reg_buf_offset)
653653
continue;
654654

655-
ASSERT(item->ri_buf[item_index].i_addr != NULL);
656-
ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0);
655+
ASSERT(item->ri_buf[item_index].iov_base != NULL);
656+
ASSERT((item->ri_buf[item_index].iov_len % XFS_BLF_CHUNK) == 0);
657657
ASSERT((reg_buf_offset + reg_buf_bytes) <= BBTOB(bp->b_length));
658658

659659
/*
660660
* The current logged region contains a copy of the
661661
* current di_next_unlinked field. Extract its value
662662
* and copy it to the buffer copy.
663663
*/
664-
logged_nextp = item->ri_buf[item_index].i_addr +
664+
logged_nextp = item->ri_buf[item_index].iov_base +
665665
next_unlinked_offset - reg_buf_offset;
666666
if (XFS_IS_CORRUPT(mp, *logged_nextp == 0)) {
667667
xfs_alert(mp,
@@ -951,7 +951,7 @@ xlog_recover_buf_commit_pass2(
951951
struct xlog_recover_item *item,
952952
xfs_lsn_t current_lsn)
953953
{
954-
struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
954+
struct xfs_buf_log_format *buf_f = item->ri_buf[0].iov_base;
955955
struct xfs_mount *mp = log->l_mp;
956956
struct xfs_buf *bp;
957957
int error;

fs/xfs/xfs_dquot_item_recover.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ xlog_recover_dquot_ra_pass2(
3434
if (mp->m_qflags == 0)
3535
return;
3636

37-
recddq = item->ri_buf[1].i_addr;
37+
recddq = item->ri_buf[1].iov_base;
3838
if (recddq == NULL)
3939
return;
40-
if (item->ri_buf[1].i_len < sizeof(struct xfs_disk_dquot))
40+
if (item->ri_buf[1].iov_len < sizeof(struct xfs_disk_dquot))
4141
return;
4242

4343
type = recddq->d_type & XFS_DQTYPE_REC_MASK;
4444
ASSERT(type);
4545
if (log->l_quotaoffs_flag & type)
4646
return;
4747

48-
dq_f = item->ri_buf[0].i_addr;
48+
dq_f = item->ri_buf[0].iov_base;
4949
ASSERT(dq_f);
5050
ASSERT(dq_f->qlf_len == 1);
5151

@@ -79,14 +79,14 @@ xlog_recover_dquot_commit_pass2(
7979
if (mp->m_qflags == 0)
8080
return 0;
8181

82-
recddq = item->ri_buf[1].i_addr;
82+
recddq = item->ri_buf[1].iov_base;
8383
if (recddq == NULL) {
8484
xfs_alert(log->l_mp, "NULL dquot in %s.", __func__);
8585
return -EFSCORRUPTED;
8686
}
87-
if (item->ri_buf[1].i_len < sizeof(struct xfs_disk_dquot)) {
88-
xfs_alert(log->l_mp, "dquot too small (%d) in %s.",
89-
item->ri_buf[1].i_len, __func__);
87+
if (item->ri_buf[1].iov_len < sizeof(struct xfs_disk_dquot)) {
88+
xfs_alert(log->l_mp, "dquot too small (%zd) in %s.",
89+
item->ri_buf[1].iov_len, __func__);
9090
return -EFSCORRUPTED;
9191
}
9292

@@ -108,7 +108,7 @@ xlog_recover_dquot_commit_pass2(
108108
* The other possibility, of course, is that the quota subsystem was
109109
* removed since the last mount - ENOSYS.
110110
*/
111-
dq_f = item->ri_buf[0].i_addr;
111+
dq_f = item->ri_buf[0].iov_base;
112112
ASSERT(dq_f);
113113
fa = xfs_dquot_verify(mp, recddq, dq_f->qlf_id);
114114
if (fa) {
@@ -147,7 +147,7 @@ xlog_recover_dquot_commit_pass2(
147147
}
148148
}
149149

150-
memcpy(ddq, recddq, item->ri_buf[1].i_len);
150+
memcpy(ddq, recddq, item->ri_buf[1].iov_len);
151151
if (xfs_has_crc(mp)) {
152152
xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk),
153153
XFS_DQUOT_CRC_OFF);
@@ -192,7 +192,7 @@ xlog_recover_quotaoff_commit_pass1(
192192
struct xlog *log,
193193
struct xlog_recover_item *item)
194194
{
195-
struct xfs_qoff_logformat *qoff_f = item->ri_buf[0].i_addr;
195+
struct xfs_qoff_logformat *qoff_f = item->ri_buf[0].iov_base;
196196
ASSERT(qoff_f);
197197

198198
/*

0 commit comments

Comments
 (0)