diff options
-rw-r--r-- | fs/nilfs2/sufile.c | 31 | ||||
-rw-r--r-- | fs/nilfs2/sufile.h | 3 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.c | 23 |
3 files changed, 19 insertions, 38 deletions
diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index e9b4cec0d3ef..5f18acab9dd4 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c | |||
@@ -112,6 +112,15 @@ static void nilfs_sufile_mod_counter(struct buffer_head *header_bh, | |||
112 | } | 112 | } |
113 | 113 | ||
114 | /** | 114 | /** |
115 | * nilfs_sufile_get_ncleansegs - return the number of clean segments | ||
116 | * @sufile: inode of segment usage file | ||
117 | */ | ||
118 | unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile) | ||
119 | { | ||
120 | return NILFS_SUI(sufile)->ncleansegs; | ||
121 | } | ||
122 | |||
123 | /** | ||
115 | * nilfs_sufile_updatev - modify multiple segment usages at a time | 124 | * nilfs_sufile_updatev - modify multiple segment usages at a time |
116 | * @sufile: inode of segment usage file | 125 | * @sufile: inode of segment usage file |
117 | * @segnumv: array of segment numbers | 126 | * @segnumv: array of segment numbers |
@@ -540,28 +549,6 @@ int nilfs_sufile_get_stat(struct inode *sufile, struct nilfs_sustat *sustat) | |||
540 | return ret; | 549 | return ret; |
541 | } | 550 | } |
542 | 551 | ||
543 | /** | ||
544 | * nilfs_sufile_get_ncleansegs - get the number of clean segments | ||
545 | * @sufile: inode of segment usage file | ||
546 | * @nsegsp: pointer to the number of clean segments | ||
547 | * | ||
548 | * Description: nilfs_sufile_get_ncleansegs() acquires the number of clean | ||
549 | * segments. | ||
550 | * | ||
551 | * Return Value: On success, 0 is returned and the number of clean segments is | ||
552 | * stored in the place pointed by @nsegsp. On error, one of the following | ||
553 | * negative error codes is returned. | ||
554 | * | ||
555 | * %-EIO - I/O error. | ||
556 | * | ||
557 | * %-ENOMEM - Insufficient amount of memory available. | ||
558 | */ | ||
559 | int nilfs_sufile_get_ncleansegs(struct inode *sufile, unsigned long *nsegsp) | ||
560 | { | ||
561 | *nsegsp = NILFS_SUI(sufile)->ncleansegs; | ||
562 | return 0; | ||
563 | } | ||
564 | |||
565 | void nilfs_sufile_do_set_error(struct inode *sufile, __u64 segnum, | 552 | void nilfs_sufile_do_set_error(struct inode *sufile, __u64 segnum, |
566 | struct buffer_head *header_bh, | 553 | struct buffer_head *header_bh, |
567 | struct buffer_head *su_bh) | 554 | struct buffer_head *su_bh) |
diff --git a/fs/nilfs2/sufile.h b/fs/nilfs2/sufile.h index b303a80ac3b1..c339ad5b5326 100644 --- a/fs/nilfs2/sufile.h +++ b/fs/nilfs2/sufile.h | |||
@@ -34,6 +34,8 @@ static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile) | |||
34 | return NILFS_MDT(sufile)->mi_nilfs->ns_nsegments; | 34 | return NILFS_MDT(sufile)->mi_nilfs->ns_nsegments; |
35 | } | 35 | } |
36 | 36 | ||
37 | unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile); | ||
38 | |||
37 | int nilfs_sufile_alloc(struct inode *, __u64 *); | 39 | int nilfs_sufile_alloc(struct inode *, __u64 *); |
38 | int nilfs_sufile_get_segment_usage(struct inode *, __u64, | 40 | int nilfs_sufile_get_segment_usage(struct inode *, __u64, |
39 | struct nilfs_segment_usage **, | 41 | struct nilfs_segment_usage **, |
@@ -41,7 +43,6 @@ int nilfs_sufile_get_segment_usage(struct inode *, __u64, | |||
41 | void nilfs_sufile_put_segment_usage(struct inode *, __u64, | 43 | void nilfs_sufile_put_segment_usage(struct inode *, __u64, |
42 | struct buffer_head *); | 44 | struct buffer_head *); |
43 | int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *); | 45 | int nilfs_sufile_get_stat(struct inode *, struct nilfs_sustat *); |
44 | int nilfs_sufile_get_ncleansegs(struct inode *, unsigned long *); | ||
45 | ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, void *, unsigned, | 46 | ssize_t nilfs_sufile_get_suinfo(struct inode *, __u64, void *, unsigned, |
46 | size_t); | 47 | size_t); |
47 | 48 | ||
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index 75095edec2fc..4d4d35c6fbef 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
@@ -612,30 +612,23 @@ int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks) | |||
612 | { | 612 | { |
613 | struct inode *dat = nilfs_dat_inode(nilfs); | 613 | struct inode *dat = nilfs_dat_inode(nilfs); |
614 | unsigned long ncleansegs; | 614 | unsigned long ncleansegs; |
615 | int err; | ||
616 | 615 | ||
617 | down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 616 | down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ |
618 | err = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile, &ncleansegs); | 617 | ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); |
619 | up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 618 | up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ |
620 | if (likely(!err)) | 619 | *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment; |
621 | *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment; | 620 | return 0; |
622 | return err; | ||
623 | } | 621 | } |
624 | 622 | ||
625 | int nilfs_near_disk_full(struct the_nilfs *nilfs) | 623 | int nilfs_near_disk_full(struct the_nilfs *nilfs) |
626 | { | 624 | { |
627 | struct inode *sufile = nilfs->ns_sufile; | ||
628 | unsigned long ncleansegs, nincsegs; | 625 | unsigned long ncleansegs, nincsegs; |
629 | int ret; | ||
630 | 626 | ||
631 | ret = nilfs_sufile_get_ncleansegs(sufile, &ncleansegs); | 627 | ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); |
632 | if (likely(!ret)) { | 628 | nincsegs = atomic_read(&nilfs->ns_ndirtyblks) / |
633 | nincsegs = atomic_read(&nilfs->ns_ndirtyblks) / | 629 | nilfs->ns_blocks_per_segment + 1; |
634 | nilfs->ns_blocks_per_segment + 1; | 630 | |
635 | if (ncleansegs <= nilfs->ns_nrsvsegs + nincsegs) | 631 | return ncleansegs <= nilfs->ns_nrsvsegs + nincsegs; |
636 | ret++; | ||
637 | } | ||
638 | return ret; | ||
639 | } | 632 | } |
640 | 633 | ||
641 | /** | 634 | /** |