Skip to content

Commit cacb124

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 0edd222 commit cacb124

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
@@ -721,13 +721,13 @@ xlog_recover_attri_commit_pass2(
721721

722722
/* Validate xfs_attri_log_format before the large memory allocation */
723723
len = sizeof(struct xfs_attri_log_format);
724-
if (item->ri_buf[i].i_len != len) {
724+
if (item->ri_buf[i].iov_len != len) {
725725
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, 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

730-
attri_formatp = item->ri_buf[i].i_addr;
730+
attri_formatp = item->ri_buf[i].iov_base;
731731
if (!xfs_attri_validate(mp, attri_formatp)) {
732732
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
733733
attri_formatp, len);
@@ -762,14 +762,14 @@ xlog_recover_attri_commit_pass2(
762762
i++;
763763

764764
/* Validate the attr name */
765-
if (item->ri_buf[i].i_len !=
765+
if (item->ri_buf[i].iov_len !=
766766
xlog_calc_iovec_len(attri_formatp->alfi_name_len)) {
767767
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
768768
attri_formatp, len);
769769
return -EFSCORRUPTED;
770770
}
771771

772-
attr_name = item->ri_buf[i].i_addr;
772+
attr_name = item->ri_buf[i].iov_base;
773773
if (!xfs_attr_namecheck(attr_name, attri_formatp->alfi_name_len)) {
774774
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
775775
attri_formatp, len);
@@ -779,14 +779,14 @@ xlog_recover_attri_commit_pass2(
779779

780780
/* Validate the attr value, if present */
781781
if (attri_formatp->alfi_value_len != 0) {
782-
if (item->ri_buf[i].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
782+
if (item->ri_buf[i].iov_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
783783
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
784-
item->ri_buf[0].i_addr,
785-
item->ri_buf[0].i_len);
784+
item->ri_buf[0].iov_base,
785+
item->ri_buf[0].iov_len);
786786
return -EFSCORRUPTED;
787787
}
788788

789-
attr_value = item->ri_buf[i].i_addr;
789+
attr_value = item->ri_buf[i].iov_base;
790790
i++;
791791
}
792792

@@ -908,10 +908,10 @@ xlog_recover_attrd_commit_pass2(
908908
{
909909
struct xfs_attrd_log_format *attrd_formatp;
910910

911-
attrd_formatp = item->ri_buf[0].i_addr;
912-
if (item->ri_buf[0].i_len != sizeof(struct xfs_attrd_log_format)) {
911+
attrd_formatp = item->ri_buf[0].iov_base;
912+
if (item->ri_buf[0].iov_len != sizeof(struct xfs_attrd_log_format)) {
913913
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
914-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
914+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
915915
return -EFSCORRUPTED;
916916
}
917917

fs/xfs/xfs_bmap_item.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -623,24 +623,24 @@ xlog_recover_bui_commit_pass2(
623623
struct xfs_bui_log_format *bui_formatp;
624624
size_t len;
625625

626-
bui_formatp = item->ri_buf[0].i_addr;
626+
bui_formatp = item->ri_buf[0].iov_base;
627627

628-
if (item->ri_buf[0].i_len < xfs_bui_log_format_sizeof(0)) {
628+
if (item->ri_buf[0].iov_len < xfs_bui_log_format_sizeof(0)) {
629629
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
630-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
630+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
631631
return -EFSCORRUPTED;
632632
}
633633

634634
if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) {
635635
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
636-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
636+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
637637
return -EFSCORRUPTED;
638638
}
639639

640640
len = xfs_bui_log_format_sizeof(bui_formatp->bui_nextents);
641-
if (item->ri_buf[0].i_len != len) {
641+
if (item->ri_buf[0].iov_len != len) {
642642
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
643-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
643+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
644644
return -EFSCORRUPTED;
645645
}
646646

@@ -677,10 +677,10 @@ xlog_recover_bud_commit_pass2(
677677
{
678678
struct xfs_bud_log_format *bud_formatp;
679679

680-
bud_formatp = item->ri_buf[0].i_addr;
681-
if (item->ri_buf[0].i_len != sizeof(struct xfs_bud_log_format)) {
680+
bud_formatp = item->ri_buf[0].iov_base;
681+
if (item->ri_buf[0].iov_len != sizeof(struct xfs_bud_log_format)) {
682682
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
683-
item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
683+
item->ri_buf[0].iov_base, item->ri_buf[0].iov_len);
684684
return -EFSCORRUPTED;
685685
}
686686

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
@@ -154,7 +154,7 @@ STATIC enum xlog_recover_reorder
154154
xlog_recover_buf_reorder(
155155
struct xlog_recover_item *item)
156156
{
157-
struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
157+
struct xfs_buf_log_format *buf_f = item->ri_buf[0].iov_base;
158158

159159
if (buf_f->blf_flags & XFS_BLF_CANCEL)
160160
return XLOG_REORDER_CANCEL_LIST;
@@ -168,7 +168,7 @@ xlog_recover_buf_ra_pass2(
168168
struct xlog *log,
169169
struct xlog_recover_item *item)
170170
{
171-
struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
171+
struct xfs_buf_log_format *buf_f = item->ri_buf[0].iov_base;
172172

173173
xlog_buf_readahead(log, buf_f->blf_blkno, buf_f->blf_len, NULL);
174174
}
@@ -182,11 +182,11 @@ xlog_recover_buf_commit_pass1(
182182
struct xlog *log,
183183
struct xlog_recover_item *item)
184184
{
185-
struct xfs_buf_log_format *bf = item->ri_buf[0].i_addr;
185+
struct xfs_buf_log_format *bf = item->ri_buf[0].iov_base;
186186

187187
if (!xfs_buf_log_check_iovec(&item->ri_buf[0])) {
188-
xfs_err(log->l_mp, "bad buffer log item size (%d)",
189-
item->ri_buf[0].i_len);
188+
xfs_err(log->l_mp, "bad buffer log item size (%zd)",
189+
item->ri_buf[0].iov_len);
190190
return -EFSCORRUPTED;
191191
}
192192

@@ -467,8 +467,8 @@ xlog_recover_do_reg_buffer(
467467
nbits = xfs_contig_bits(buf_f->blf_data_map,
468468
buf_f->blf_map_size, bit);
469469
ASSERT(nbits > 0);
470-
ASSERT(item->ri_buf[i].i_addr != NULL);
471-
ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0);
470+
ASSERT(item->ri_buf[i].iov_base != NULL);
471+
ASSERT(item->ri_buf[i].iov_len % XFS_BLF_CHUNK == 0);
472472
ASSERT(BBTOB(bp->b_length) >=
473473
((uint)bit << XFS_BLF_SHIFT) + (nbits << XFS_BLF_SHIFT));
474474

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

486486
/*
487487
* Do a sanity check if this is a dquot buffer. Just checking
@@ -491,18 +491,18 @@ xlog_recover_do_reg_buffer(
491491
fa = NULL;
492492
if (buf_f->blf_flags &
493493
(XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) {
494-
if (item->ri_buf[i].i_addr == NULL) {
494+
if (item->ri_buf[i].iov_base == NULL) {
495495
xfs_alert(mp,
496496
"XFS: NULL dquot in %s.", __func__);
497497
goto next;
498498
}
499-
if (item->ri_buf[i].i_len < size_disk_dquot) {
499+
if (item->ri_buf[i].iov_len < size_disk_dquot) {
500500
xfs_alert(mp,
501-
"XFS: dquot too small (%d) in %s.",
502-
item->ri_buf[i].i_len, __func__);
501+
"XFS: dquot too small (%zd) in %s.",
502+
item->ri_buf[i].iov_len, __func__);
503503
goto next;
504504
}
505-
fa = xfs_dquot_verify(mp, item->ri_buf[i].i_addr, -1);
505+
fa = xfs_dquot_verify(mp, item->ri_buf[i].iov_base, -1);
506506
if (fa) {
507507
xfs_alert(mp,
508508
"dquot corrupt at %pS trying to replay into block 0x%llx",
@@ -513,7 +513,7 @@ xlog_recover_do_reg_buffer(
513513

514514
memcpy(xfs_buf_offset(bp,
515515
(uint)bit << XFS_BLF_SHIFT), /* dest */
516-
item->ri_buf[i].i_addr, /* source */
516+
item->ri_buf[i].iov_base, /* source */
517517
nbits<<XFS_BLF_SHIFT); /* length */
518518
next:
519519
i++;
@@ -649,16 +649,16 @@ xlog_recover_do_inode_buffer(
649649
if (next_unlinked_offset < reg_buf_offset)
650650
continue;
651651

652-
ASSERT(item->ri_buf[item_index].i_addr != NULL);
653-
ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0);
652+
ASSERT(item->ri_buf[item_index].iov_base != NULL);
653+
ASSERT((item->ri_buf[item_index].iov_len % XFS_BLF_CHUNK) == 0);
654654
ASSERT((reg_buf_offset + reg_buf_bytes) <= BBTOB(bp->b_length));
655655

656656
/*
657657
* The current logged region contains a copy of the
658658
* current di_next_unlinked field. Extract its value
659659
* and copy it to the buffer copy.
660660
*/
661-
logged_nextp = item->ri_buf[item_index].i_addr +
661+
logged_nextp = item->ri_buf[item_index].iov_base +
662662
next_unlinked_offset - reg_buf_offset;
663663
if (XFS_IS_CORRUPT(mp, *logged_nextp == 0)) {
664664
xfs_alert(mp,
@@ -887,7 +887,7 @@ xlog_recover_buf_commit_pass2(
887887
struct xlog_recover_item *item,
888888
xfs_lsn_t current_lsn)
889889
{
890-
struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
890+
struct xfs_buf_log_format *buf_f = item->ri_buf[0].iov_base;
891891
struct xfs_mount *mp = log->l_mp;
892892
struct xfs_buf *bp;
893893
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)