hc
2024-09-20 a36159eec6ca17402b0e146b86efaf76568dc353
kernel/fs/nilfs2/sufile.c
....@@ -171,9 +171,9 @@
171171 down_write(&NILFS_MDT(sufile)->mi_sem);
172172 for (seg = segnumv; seg < segnumv + nsegs; seg++) {
173173 if (unlikely(*seg >= nilfs_sufile_get_nsegments(sufile))) {
174
- nilfs_msg(sufile->i_sb, KERN_WARNING,
175
- "%s: invalid segment number: %llu",
176
- __func__, (unsigned long long)*seg);
174
+ nilfs_warn(sufile->i_sb,
175
+ "%s: invalid segment number: %llu",
176
+ __func__, (unsigned long long)*seg);
177177 nerr++;
178178 }
179179 }
....@@ -230,9 +230,8 @@
230230 int ret;
231231
232232 if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) {
233
- nilfs_msg(sufile->i_sb, KERN_WARNING,
234
- "%s: invalid segment number: %llu",
235
- __func__, (unsigned long long)segnum);
233
+ nilfs_warn(sufile->i_sb, "%s: invalid segment number: %llu",
234
+ __func__, (unsigned long long)segnum);
236235 return -EINVAL;
237236 }
238237 down_write(&NILFS_MDT(sufile)->mi_sem);
....@@ -410,9 +409,8 @@
410409 kaddr = kmap_atomic(su_bh->b_page);
411410 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
412411 if (unlikely(!nilfs_segment_usage_clean(su))) {
413
- nilfs_msg(sufile->i_sb, KERN_WARNING,
414
- "%s: segment %llu must be clean", __func__,
415
- (unsigned long long)segnum);
412
+ nilfs_warn(sufile->i_sb, "%s: segment %llu must be clean",
413
+ __func__, (unsigned long long)segnum);
416414 kunmap_atomic(kaddr);
417415 return;
418416 }
....@@ -468,9 +466,8 @@
468466 kaddr = kmap_atomic(su_bh->b_page);
469467 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
470468 if (nilfs_segment_usage_clean(su)) {
471
- nilfs_msg(sufile->i_sb, KERN_WARNING,
472
- "%s: segment %llu is already clean",
473
- __func__, (unsigned long long)segnum);
469
+ nilfs_warn(sufile->i_sb, "%s: segment %llu is already clean",
470
+ __func__, (unsigned long long)segnum);
474471 kunmap_atomic(kaddr);
475472 return;
476473 }
....@@ -498,14 +495,22 @@
498495 int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum)
499496 {
500497 struct buffer_head *bh;
498
+ void *kaddr;
499
+ struct nilfs_segment_usage *su;
501500 int ret;
502501
502
+ down_write(&NILFS_MDT(sufile)->mi_sem);
503503 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &bh);
504504 if (!ret) {
505505 mark_buffer_dirty(bh);
506506 nilfs_mdt_mark_dirty(sufile);
507
+ kaddr = kmap_atomic(bh->b_page);
508
+ su = nilfs_sufile_block_get_segment_usage(sufile, segnum, bh, kaddr);
509
+ nilfs_segment_usage_set_dirty(su);
510
+ kunmap_atomic(kaddr);
507511 brelse(bh);
508512 }
513
+ up_write(&NILFS_MDT(sufile)->mi_sem);
509514 return ret;
510515 }
511516
....@@ -549,13 +554,13 @@
549554 /**
550555 * nilfs_sufile_get_stat - get segment usage statistics
551556 * @sufile: inode of segment usage file
552
- * @stat: pointer to a structure of segment usage statistics
557
+ * @sustat: pointer to a structure of segment usage statistics
553558 *
554559 * Description: nilfs_sufile_get_stat() returns information about segment
555560 * usage.
556561 *
557562 * Return Value: On success, 0 is returned, and segment usage information is
558
- * stored in the place pointed by @stat. On error, one of the following
563
+ * stored in the place pointed by @sustat. On error, one of the following
559564 * negative error codes is returned.
560565 *
561566 * %-EIO - I/O error.
....@@ -774,6 +779,15 @@
774779 goto out_header;
775780
776781 sui->ncleansegs -= nsegs - newnsegs;
782
+
783
+ /*
784
+ * If the sufile is successfully truncated, immediately adjust
785
+ * the segment allocation space while locking the semaphore
786
+ * "mi_sem" so that nilfs_sufile_alloc() never allocates
787
+ * segments in the truncated space.
788
+ */
789
+ sui->allocmax = newnsegs - 1;
790
+ sui->allocmin = 0;
777791 }
778792
779793 kaddr = kmap_atomic(header_bh->b_page);
....@@ -1168,12 +1182,12 @@
11681182 int err;
11691183
11701184 if (susize > sb->s_blocksize) {
1171
- nilfs_msg(sb, KERN_ERR,
1172
- "too large segment usage size: %zu bytes", susize);
1185
+ nilfs_err(sb, "too large segment usage size: %zu bytes",
1186
+ susize);
11731187 return -EINVAL;
11741188 } else if (susize < NILFS_MIN_SEGMENT_USAGE_SIZE) {
1175
- nilfs_msg(sb, KERN_ERR,
1176
- "too small segment usage size: %zu bytes", susize);
1189
+ nilfs_err(sb, "too small segment usage size: %zu bytes",
1190
+ susize);
11771191 return -EINVAL;
11781192 }
11791193