Lines Matching defs:sufile
17 #include "sufile.h"
22 * struct nilfs_sufile_info - on-memory private data of sufile
35 static inline struct nilfs_sufile_info *NILFS_SUI(struct inode *sufile)
37 return (struct nilfs_sufile_info *)NILFS_MDT(sufile);
41 nilfs_sufile_segment_usages_per_block(const struct inode *sufile)
43 return NILFS_MDT(sufile)->mi_entries_per_block;
47 nilfs_sufile_get_blkoff(const struct inode *sufile, __u64 segnum)
49 __u64 t = segnum + NILFS_MDT(sufile)->mi_first_entry_offset;
51 do_div(t, nilfs_sufile_segment_usages_per_block(sufile));
56 nilfs_sufile_get_offset(const struct inode *sufile, __u64 segnum)
58 __u64 t = segnum + NILFS_MDT(sufile)->mi_first_entry_offset;
60 return do_div(t, nilfs_sufile_segment_usages_per_block(sufile));
64 nilfs_sufile_segment_usages_in_block(const struct inode *sufile, __u64 curr,
68 nilfs_sufile_segment_usages_per_block(sufile) -
69 nilfs_sufile_get_offset(sufile, curr),
74 nilfs_sufile_block_get_segment_usage(const struct inode *sufile, __u64 segnum,
78 nilfs_sufile_get_offset(sufile, segnum) *
79 NILFS_MDT(sufile)->mi_entry_size;
82 static inline int nilfs_sufile_get_header_block(struct inode *sufile,
85 return nilfs_mdt_get_block(sufile, 0, 0, NULL, bhp);
89 nilfs_sufile_get_segment_usage_block(struct inode *sufile, __u64 segnum,
92 return nilfs_mdt_get_block(sufile,
93 nilfs_sufile_get_blkoff(sufile, segnum),
97 static int nilfs_sufile_delete_segment_usage_block(struct inode *sufile,
100 return nilfs_mdt_delete_block(sufile,
101 nilfs_sufile_get_blkoff(sufile, segnum));
121 * @sufile: inode of segment usage file
123 unsigned long nilfs_sufile_get_ncleansegs(struct inode *sufile)
125 return NILFS_SUI(sufile)->ncleansegs;
130 * @sufile: inode of segment usage file
139 * buffers of a header block and the sufile block in which the target
156 int nilfs_sufile_updatev(struct inode *sufile, __u64 *segnumv, size_t nsegs,
171 down_write(&NILFS_MDT(sufile)->mi_sem);
173 if (unlikely(*seg >= nilfs_sufile_get_nsegments(sufile))) {
174 nilfs_warn(sufile->i_sb,
185 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
190 blkoff = nilfs_sufile_get_blkoff(sufile, *seg);
191 ret = nilfs_mdt_get_block(sufile, blkoff, create, NULL, &bh);
196 dofunc(sufile, *seg, header_bh, bh);
201 blkoff = nilfs_sufile_get_blkoff(sufile, *seg);
207 ret = nilfs_mdt_get_block(sufile, blkoff, create, NULL, &bh);
217 up_write(&NILFS_MDT(sufile)->mi_sem);
224 int nilfs_sufile_update(struct inode *sufile, __u64 segnum, int create,
232 if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) {
233 nilfs_warn(sufile->i_sb, "%s: invalid segment number: %llu",
237 down_write(&NILFS_MDT(sufile)->mi_sem);
239 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
243 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, create, &bh);
245 dofunc(sufile, segnum, header_bh, bh);
251 up_write(&NILFS_MDT(sufile)->mi_sem);
257 * @sufile: inode of segment usage file
266 int nilfs_sufile_set_alloc_range(struct inode *sufile, __u64 start, __u64 end)
268 struct nilfs_sufile_info *sui = NILFS_SUI(sufile);
272 down_write(&NILFS_MDT(sufile)->mi_sem);
273 nsegs = nilfs_sufile_get_nsegments(sufile);
280 up_write(&NILFS_MDT(sufile)->mi_sem);
286 * @sufile: inode of segment usage file
301 int nilfs_sufile_alloc(struct inode *sufile, __u64 *segnump)
306 struct nilfs_sufile_info *sui = NILFS_SUI(sufile);
307 size_t susz = NILFS_MDT(sufile)->mi_entry_size;
313 down_write(&NILFS_MDT(sufile)->mi_sem);
315 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
323 nsegments = nilfs_sufile_get_nsegments(sufile);
350 trace_nilfs2_segment_usage_check(sufile, segnum, cnt);
351 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 1,
357 sufile, segnum, su_bh, kaddr);
360 sufile, segnum, maxsegnum);
378 nilfs_mdt_mark_dirty(sufile);
382 trace_nilfs2_segment_usage_allocated(sufile, segnum);
398 up_write(&NILFS_MDT(sufile)->mi_sem);
402 void nilfs_sufile_do_cancel_free(struct inode *sufile, __u64 segnum,
410 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
412 nilfs_warn(sufile->i_sb, "%s: segment %llu must be clean",
421 NILFS_SUI(sufile)->ncleansegs--;
424 nilfs_mdt_mark_dirty(sufile);
427 void nilfs_sufile_do_scrap(struct inode *sufile, __u64 segnum,
436 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
452 NILFS_SUI(sufile)->ncleansegs -= clean;
455 nilfs_mdt_mark_dirty(sufile);
458 void nilfs_sufile_do_free(struct inode *sufile, __u64 segnum,
467 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
469 nilfs_warn(sufile->i_sb, "%s: segment %llu is already clean",
483 NILFS_SUI(sufile)->ncleansegs++;
485 nilfs_mdt_mark_dirty(sufile);
487 trace_nilfs2_segment_usage_freed(sufile, segnum);
492 * @sufile: inode of segment usage file
495 int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum)
502 down_write(&NILFS_MDT(sufile)->mi_sem);
503 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &bh);
508 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, bh, kaddr);
510 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
515 nilfs_error(sufile->i_sb,
532 nilfs_mdt_mark_dirty(sufile);
536 up_write(&NILFS_MDT(sufile)->mi_sem);
542 * @sufile: inode of segment usage file
547 int nilfs_sufile_set_segment_usage(struct inode *sufile, __u64 segnum,
555 down_write(&NILFS_MDT(sufile)->mi_sem);
556 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &bh);
561 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, bh, kaddr);
574 nilfs_mdt_mark_dirty(sufile);
578 up_write(&NILFS_MDT(sufile)->mi_sem);
584 * @sufile: inode of segment usage file
598 int nilfs_sufile_get_stat(struct inode *sufile, struct nilfs_sustat *sustat)
602 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
606 down_read(&NILFS_MDT(sufile)->mi_sem);
608 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
614 sustat->ss_nsegs = nilfs_sufile_get_nsegments(sufile);
626 up_read(&NILFS_MDT(sufile)->mi_sem);
630 void nilfs_sufile_do_set_error(struct inode *sufile, __u64 segnum,
639 su = nilfs_sufile_block_get_segment_usage(sufile, segnum, su_bh, kaddr);
650 NILFS_SUI(sufile)->ncleansegs--;
653 nilfs_mdt_mark_dirty(sufile);
658 * @sufile: inode of segment usage file
673 static int nilfs_sufile_truncate_range(struct inode *sufile,
676 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
680 size_t susz = NILFS_MDT(sufile)->mi_entry_size;
689 nsegs = nilfs_sufile_get_nsegments(sufile);
695 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
699 segusages_per_block = nilfs_sufile_segment_usages_per_block(sufile);
705 nilfs_sufile_get_offset(sufile, segnum),
707 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0,
717 sufile, segnum, su_bh, kaddr);
745 nilfs_sufile_delete_segment_usage_block(sufile, segnum);
752 NILFS_SUI(sufile)->ncleansegs += ncleaned;
754 nilfs_mdt_mark_dirty(sufile);
763 * @sufile: inode of segment usage file
777 int nilfs_sufile_resize(struct inode *sufile, __u64 newnsegs)
779 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
782 struct nilfs_sufile_info *sui = NILFS_SUI(sufile);
787 down_write(&NILFS_MDT(sufile)->mi_sem);
789 nsegs = nilfs_sufile_get_nsegments(sufile);
798 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
805 ret = nilfs_sufile_truncate_range(sufile, newnsegs, nsegs - 1);
812 * If the sufile is successfully truncated, immediately adjust
827 nilfs_mdt_mark_dirty(sufile);
833 up_write(&NILFS_MDT(sufile)->mi_sem);
839 * @sufile: inode of segment usage file
854 ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum, void *buf,
860 size_t susz = NILFS_MDT(sufile)->mi_entry_size;
861 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
867 down_read(&NILFS_MDT(sufile)->mi_sem);
869 segusages_per_block = nilfs_sufile_segment_usages_per_block(sufile);
871 nilfs_sufile_get_nsegments(sufile) - segnum,
876 nilfs_sufile_get_offset(sufile, segnum),
878 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0,
891 sufile, segnum, su_bh, kaddr);
908 up_read(&NILFS_MDT(sufile)->mi_sem);
914 * @sufile: inode of segment usage file
932 ssize_t nilfs_sufile_set_suinfo(struct inode *sufile, void *buf,
935 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
958 down_write(&NILFS_MDT(sufile)->mi_sem);
960 ret = nilfs_sufile_get_header_block(sufile, &header_bh);
965 blkoff = nilfs_sufile_get_blkoff(sufile, sup->sup_segnum);
966 ret = nilfs_mdt_get_block(sufile, blkoff, 1, NULL, &bh);
973 sufile, sup->sup_segnum, bh, kaddr);
1015 blkoff = nilfs_sufile_get_blkoff(sufile, sup->sup_segnum);
1022 ret = nilfs_mdt_get_block(sufile, blkoff, 1, NULL, &bh);
1033 NILFS_SUI(sufile)->ncleansegs += ncleaned;
1035 nilfs_mdt_mark_dirty(sufile);
1039 up_write(&NILFS_MDT(sufile)->mi_sem);
1045 * @sufile: inode of segment usage file
1059 int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range)
1061 struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
1065 size_t n, i, susz = NILFS_MDT(sufile)->mi_entry_size;
1097 down_read(&NILFS_MDT(sufile)->mi_sem);
1100 n = nilfs_sufile_segment_usages_in_block(sufile, segnum,
1103 ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0,
1114 su = nilfs_sufile_block_get_segment_usage(sufile, segnum,
1157 sufile, segnum, su_bh, kaddr);
1189 up_read(&NILFS_MDT(sufile)->mi_sem);
1196 * nilfs_sufile_read - read or get sufile inode
1199 * @raw_inode: on-disk sufile inode
1205 struct inode *sufile;
1222 sufile = nilfs_iget_locked(sb, NULL, NILFS_SUFILE_INO);
1223 if (unlikely(!sufile))
1225 if (!(sufile->i_state & I_NEW))
1228 err = nilfs_mdt_init(sufile, NILFS_MDT_GFP, sizeof(*sui));
1232 nilfs_mdt_set_entry_size(sufile, susize,
1235 err = nilfs_read_inode_common(sufile, raw_inode);
1239 err = nilfs_sufile_get_header_block(sufile, &header_bh);
1243 sui = NILFS_SUI(sufile);
1250 sui->allocmax = nilfs_sufile_get_nsegments(sufile) - 1;
1253 unlock_new_inode(sufile);
1255 *inodep = sufile;
1258 iget_failed(sufile);