Skip to content

Commit 29eeafc

Browse files
committed
Merge tag 'f2fs-for-5.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs
Pull f2fs fixes from Jaegeuk Kim: "Some urgent fixes to avoid generating corrupted inodes caused by compressed and inline_data files. In addition, avoid a wrong error report which prevents a roll-forward recovery" * tag 'f2fs-for-5.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: f2fs: do not count ENOENT for error case f2fs: fix iostat related lock protection f2fs: attach inline_data after setting compression
2 parents 8c23f23 + 82c7863 commit 29eeafc

File tree

3 files changed

+32
-20
lines changed

3 files changed

+32
-20
lines changed

fs/f2fs/iostat.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ static inline void __record_iostat_latency(struct f2fs_sb_info *sbi)
9191
unsigned int cnt;
9292
struct f2fs_iostat_latency iostat_lat[MAX_IO_TYPE][NR_PAGE_TYPE];
9393
struct iostat_lat_info *io_lat = sbi->iostat_io_lat;
94+
unsigned long flags;
9495

95-
spin_lock_bh(&sbi->iostat_lat_lock);
96+
spin_lock_irqsave(&sbi->iostat_lat_lock, flags);
9697
for (idx = 0; idx < MAX_IO_TYPE; idx++) {
9798
for (io = 0; io < NR_PAGE_TYPE; io++) {
9899
cnt = io_lat->bio_cnt[idx][io];
@@ -106,7 +107,7 @@ static inline void __record_iostat_latency(struct f2fs_sb_info *sbi)
106107
io_lat->bio_cnt[idx][io] = 0;
107108
}
108109
}
109-
spin_unlock_bh(&sbi->iostat_lat_lock);
110+
spin_unlock_irqrestore(&sbi->iostat_lat_lock, flags);
110111

111112
trace_f2fs_iostat_latency(sbi, iostat_lat);
112113
}
@@ -115,14 +116,15 @@ static inline void f2fs_record_iostat(struct f2fs_sb_info *sbi)
115116
{
116117
unsigned long long iostat_diff[NR_IO_TYPE];
117118
int i;
119+
unsigned long flags;
118120

119121
if (time_is_after_jiffies(sbi->iostat_next_period))
120122
return;
121123

122124
/* Need double check under the lock */
123-
spin_lock_bh(&sbi->iostat_lock);
125+
spin_lock_irqsave(&sbi->iostat_lock, flags);
124126
if (time_is_after_jiffies(sbi->iostat_next_period)) {
125-
spin_unlock_bh(&sbi->iostat_lock);
127+
spin_unlock_irqrestore(&sbi->iostat_lock, flags);
126128
return;
127129
}
128130
sbi->iostat_next_period = jiffies +
@@ -133,7 +135,7 @@ static inline void f2fs_record_iostat(struct f2fs_sb_info *sbi)
133135
sbi->prev_rw_iostat[i];
134136
sbi->prev_rw_iostat[i] = sbi->rw_iostat[i];
135137
}
136-
spin_unlock_bh(&sbi->iostat_lock);
138+
spin_unlock_irqrestore(&sbi->iostat_lock, flags);
137139

138140
trace_f2fs_iostat(sbi, iostat_diff);
139141

@@ -145,25 +147,27 @@ void f2fs_reset_iostat(struct f2fs_sb_info *sbi)
145147
struct iostat_lat_info *io_lat = sbi->iostat_io_lat;
146148
int i;
147149

148-
spin_lock_bh(&sbi->iostat_lock);
150+
spin_lock_irq(&sbi->iostat_lock);
149151
for (i = 0; i < NR_IO_TYPE; i++) {
150152
sbi->rw_iostat[i] = 0;
151153
sbi->prev_rw_iostat[i] = 0;
152154
}
153-
spin_unlock_bh(&sbi->iostat_lock);
155+
spin_unlock_irq(&sbi->iostat_lock);
154156

155-
spin_lock_bh(&sbi->iostat_lat_lock);
157+
spin_lock_irq(&sbi->iostat_lat_lock);
156158
memset(io_lat, 0, sizeof(struct iostat_lat_info));
157-
spin_unlock_bh(&sbi->iostat_lat_lock);
159+
spin_unlock_irq(&sbi->iostat_lat_lock);
158160
}
159161

160162
void f2fs_update_iostat(struct f2fs_sb_info *sbi,
161163
enum iostat_type type, unsigned long long io_bytes)
162164
{
165+
unsigned long flags;
166+
163167
if (!sbi->iostat_enable)
164168
return;
165169

166-
spin_lock_bh(&sbi->iostat_lock);
170+
spin_lock_irqsave(&sbi->iostat_lock, flags);
167171
sbi->rw_iostat[type] += io_bytes;
168172

169173
if (type == APP_BUFFERED_IO || type == APP_DIRECT_IO)
@@ -172,7 +176,7 @@ void f2fs_update_iostat(struct f2fs_sb_info *sbi,
172176
if (type == APP_BUFFERED_READ_IO || type == APP_DIRECT_READ_IO)
173177
sbi->rw_iostat[APP_READ_IO] += io_bytes;
174178

175-
spin_unlock_bh(&sbi->iostat_lock);
179+
spin_unlock_irqrestore(&sbi->iostat_lock, flags);
176180

177181
f2fs_record_iostat(sbi);
178182
}
@@ -185,6 +189,7 @@ static inline void __update_iostat_latency(struct bio_iostat_ctx *iostat_ctx,
185189
struct f2fs_sb_info *sbi = iostat_ctx->sbi;
186190
struct iostat_lat_info *io_lat = sbi->iostat_io_lat;
187191
int idx;
192+
unsigned long flags;
188193

189194
if (!sbi->iostat_enable)
190195
return;
@@ -202,12 +207,12 @@ static inline void __update_iostat_latency(struct bio_iostat_ctx *iostat_ctx,
202207
idx = WRITE_ASYNC_IO;
203208
}
204209

205-
spin_lock_bh(&sbi->iostat_lat_lock);
210+
spin_lock_irqsave(&sbi->iostat_lat_lock, flags);
206211
io_lat->sum_lat[idx][iotype] += ts_diff;
207212
io_lat->bio_cnt[idx][iotype]++;
208213
if (ts_diff > io_lat->peak_lat[idx][iotype])
209214
io_lat->peak_lat[idx][iotype] = ts_diff;
210-
spin_unlock_bh(&sbi->iostat_lat_lock);
215+
spin_unlock_irqrestore(&sbi->iostat_lat_lock, flags);
211216
}
212217

213218
void iostat_update_and_unbind_ctx(struct bio *bio, int rw)

fs/f2fs/namei.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
8989
if (test_opt(sbi, INLINE_XATTR))
9090
set_inode_flag(inode, FI_INLINE_XATTR);
9191

92-
if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
93-
set_inode_flag(inode, FI_INLINE_DATA);
9492
if (f2fs_may_inline_dentry(inode))
9593
set_inode_flag(inode, FI_INLINE_DENTRY);
9694

@@ -107,10 +105,6 @@ static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
107105

108106
f2fs_init_extent_tree(inode, NULL);
109107

110-
stat_inc_inline_xattr(inode);
111-
stat_inc_inline_inode(inode);
112-
stat_inc_inline_dir(inode);
113-
114108
F2FS_I(inode)->i_flags =
115109
f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED);
116110

@@ -127,6 +121,14 @@ static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
127121
set_compress_context(inode);
128122
}
129123

124+
/* Should enable inline_data after compression set */
125+
if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode))
126+
set_inode_flag(inode, FI_INLINE_DATA);
127+
128+
stat_inc_inline_xattr(inode);
129+
stat_inc_inline_inode(inode);
130+
stat_inc_inline_dir(inode);
131+
130132
f2fs_set_inode_flags(inode);
131133

132134
trace_f2fs_new_inode(inode, 0);
@@ -325,6 +327,9 @@ static void set_compress_inode(struct f2fs_sb_info *sbi, struct inode *inode,
325327
if (!is_extension_exist(name, ext[i], false))
326328
continue;
327329

330+
/* Do not use inline_data with compression */
331+
stat_dec_inline_inode(inode);
332+
clear_inode_flag(inode, FI_INLINE_DATA);
328333
set_compress_context(inode);
329334
return;
330335
}

fs/f2fs/node.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1450,7 +1450,9 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
14501450
out_err:
14511451
ClearPageUptodate(page);
14521452
out_put_err:
1453-
f2fs_handle_page_eio(sbi, page->index, NODE);
1453+
/* ENOENT comes from read_node_page which is not an error. */
1454+
if (err != -ENOENT)
1455+
f2fs_handle_page_eio(sbi, page->index, NODE);
14541456
f2fs_put_page(page, 1);
14551457
return ERR_PTR(err);
14561458
}

0 commit comments

Comments
 (0)