Lines Matching +full:next +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (C) 2006-2008 Nippon Telegraph and Telephone Corporation.
22 return NILFS_MDT(cpfile)->mi_entries_per_block; in nilfs_cpfile_checkpoints_per_block()
29 __u64 tcno = cno + NILFS_MDT(cpfile)->mi_first_entry_offset - 1; in nilfs_cpfile_get_blkoff()
39 __u64 tcno = cno + NILFS_MDT(cpfile)->mi_first_entry_offset - 1; in nilfs_cpfile_get_offset()
48 + 1 - NILFS_MDT(cpfile)->mi_first_entry_offset; in nilfs_cpfile_first_checkpoint_in_block()
57 nilfs_cpfile_checkpoints_per_block(cpfile) - in nilfs_cpfile_checkpoints_in_block()
59 max - curr); in nilfs_cpfile_checkpoints_in_block()
76 cp = kmap_local_folio(bh->b_folio, in nilfs_cpfile_block_add_valid_checkpoints()
77 offset_in_folio(bh->b_folio, bh->b_data)); in nilfs_cpfile_block_add_valid_checkpoints()
78 count = le32_to_cpu(cp->cp_checkpoints_count) + n; in nilfs_cpfile_block_add_valid_checkpoints()
79 cp->cp_checkpoints_count = cpu_to_le32(count); in nilfs_cpfile_block_add_valid_checkpoints()
92 cp = kmap_local_folio(bh->b_folio, in nilfs_cpfile_block_sub_valid_checkpoints()
93 offset_in_folio(bh->b_folio, bh->b_data)); in nilfs_cpfile_block_sub_valid_checkpoints()
94 WARN_ON(le32_to_cpu(cp->cp_checkpoints_count) < n); in nilfs_cpfile_block_sub_valid_checkpoints()
95 count = le32_to_cpu(cp->cp_checkpoints_count) - n; in nilfs_cpfile_block_sub_valid_checkpoints()
96 cp->cp_checkpoints_count = cpu_to_le32(count); in nilfs_cpfile_block_sub_valid_checkpoints()
106 size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size; in nilfs_cpfile_block_init()
109 while (n-- > 0) { in nilfs_cpfile_block_init()
116 * nilfs_cpfile_checkpoint_offset - calculate the byte offset of a checkpoint
128 return offset_in_folio(bh->b_folio, bh->b_data) + in nilfs_cpfile_checkpoint_offset()
130 NILFS_MDT(cpfile)->mi_entry_size; in nilfs_cpfile_checkpoint_offset()
134 * nilfs_cpfile_cp_snapshot_list_offset - calculate the byte offset of a
153 * nilfs_cpfile_ch_snapshot_list_offset - calculate the byte offset of the
168 if (unlikely(err == -ENOENT)) { in nilfs_cpfile_get_header_block()
169 nilfs_error(cpfile->i_sb, in nilfs_cpfile_get_header_block()
171 err = -EIO; in nilfs_cpfile_get_header_block()
187 * nilfs_cpfile_find_checkpoint_block - find and get a buffer on cpfile
191 * @cnop: place to store the next checkpoint number
196 * * %-EIO - I/O error (including metadata corruption).
197 * * %-ENOENT - no block exists in the range.
198 * * %-ENOMEM - Insufficient memory available.
209 return -ENOENT; in nilfs_cpfile_find_checkpoint_block()
229 * nilfs_cpfile_read_checkpoint - read a checkpoint entry in cpfile
241 * * %-EINVAL - Invalid checkpoint.
242 * * %-ENOMEM - Insufficient memory available.
243 * * %-EIO - I/O error (including metadata corruption).
254 return -EINVAL; in nilfs_cpfile_read_checkpoint()
256 down_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_read_checkpoint()
259 if (ret == -ENOENT) in nilfs_cpfile_read_checkpoint()
260 ret = -EINVAL; in nilfs_cpfile_read_checkpoint()
265 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_read_checkpoint()
267 ret = -EINVAL; in nilfs_cpfile_read_checkpoint()
271 ret = nilfs_read_inode_common(ifile, &cp->cp_ifile_inode); in nilfs_cpfile_read_checkpoint()
277 nilfs_err(cpfile->i_sb, in nilfs_cpfile_read_checkpoint()
280 ret = -EIO; in nilfs_cpfile_read_checkpoint()
285 atomic64_set(&root->inodes_count, le64_to_cpu(cp->cp_inodes_count)); in nilfs_cpfile_read_checkpoint()
286 atomic64_set(&root->blocks_count, le64_to_cpu(cp->cp_blocks_count)); in nilfs_cpfile_read_checkpoint()
287 root->ifile = ifile; in nilfs_cpfile_read_checkpoint()
293 up_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_read_checkpoint()
298 * nilfs_cpfile_create_checkpoint - create a checkpoint entry on cpfile
310 * * %-ENOMEM - Insufficient memory available.
311 * * %-EIO - I/O error (including metadata corruption).
312 * * %-EROFS - Read only filesystem
323 return -EIO; in nilfs_cpfile_create_checkpoint()
325 down_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_create_checkpoint()
335 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_create_checkpoint()
337 /* a newly-created checkpoint */ in nilfs_cpfile_create_checkpoint()
344 header = kmap_local_folio(header_bh->b_folio, 0); in nilfs_cpfile_create_checkpoint()
345 le64_add_cpu(&header->ch_ncheckpoints, 1); in nilfs_cpfile_create_checkpoint()
361 up_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_create_checkpoint()
366 * nilfs_cpfile_finalize_checkpoint - fill in a checkpoint entry in cpfile
380 * * %-ENOMEM - Insufficient memory available.
381 * * %-EIO - I/O error (including metadata corruption).
393 return -EIO; in nilfs_cpfile_finalize_checkpoint()
395 down_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_finalize_checkpoint()
398 if (ret == -ENOENT) in nilfs_cpfile_finalize_checkpoint()
404 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_finalize_checkpoint()
411 cp->cp_snapshot_list.ssl_next = 0; in nilfs_cpfile_finalize_checkpoint()
412 cp->cp_snapshot_list.ssl_prev = 0; in nilfs_cpfile_finalize_checkpoint()
413 cp->cp_inodes_count = cpu_to_le64(atomic64_read(&root->inodes_count)); in nilfs_cpfile_finalize_checkpoint()
414 cp->cp_blocks_count = cpu_to_le64(atomic64_read(&root->blocks_count)); in nilfs_cpfile_finalize_checkpoint()
415 cp->cp_nblk_inc = cpu_to_le64(blkinc); in nilfs_cpfile_finalize_checkpoint()
416 cp->cp_create = cpu_to_le64(ctime); in nilfs_cpfile_finalize_checkpoint()
417 cp->cp_cno = cpu_to_le64(cno); in nilfs_cpfile_finalize_checkpoint()
424 nilfs_write_inode_common(root->ifile, &cp->cp_ifile_inode); in nilfs_cpfile_finalize_checkpoint()
425 nilfs_bmap_write(NILFS_I(root->ifile)->i_bmap, &cp->cp_ifile_inode); in nilfs_cpfile_finalize_checkpoint()
430 up_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_finalize_checkpoint()
434 nilfs_error(cpfile->i_sb, in nilfs_cpfile_finalize_checkpoint()
436 ret = -EIO; in nilfs_cpfile_finalize_checkpoint()
441 * nilfs_cpfile_delete_checkpoints - delete checkpoints
452 * * %-EINVAL - Invalid checkpoints.
453 * * %-EIO - I/O error (including metadata corruption).
454 * * %-ENOMEM - Insufficient memory available.
463 size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size; in nilfs_cpfile_delete_checkpoints()
471 nilfs_err(cpfile->i_sb, in nilfs_cpfile_delete_checkpoints()
474 return -EINVAL; in nilfs_cpfile_delete_checkpoints()
477 down_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_delete_checkpoints()
489 if (ret != -ENOENT) in nilfs_cpfile_delete_checkpoints()
497 cp = kaddr = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_delete_checkpoints()
531 nilfs_err(cpfile->i_sb, in nilfs_cpfile_delete_checkpoints()
538 header = kmap_local_folio(header_bh->b_folio, 0); in nilfs_cpfile_delete_checkpoints()
539 le64_add_cpu(&header->ch_ncheckpoints, -(u64)tnicps); in nilfs_cpfile_delete_checkpoints()
547 ret = -EBUSY; in nilfs_cpfile_delete_checkpoints()
550 up_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_delete_checkpoints()
558 ci->ci_flags = le32_to_cpu(cp->cp_flags); in nilfs_cpfile_checkpoint_to_cpinfo()
559 ci->ci_cno = le64_to_cpu(cp->cp_cno); in nilfs_cpfile_checkpoint_to_cpinfo()
560 ci->ci_create = le64_to_cpu(cp->cp_create); in nilfs_cpfile_checkpoint_to_cpinfo()
561 ci->ci_nblk_inc = le64_to_cpu(cp->cp_nblk_inc); in nilfs_cpfile_checkpoint_to_cpinfo()
562 ci->ci_inodes_count = le64_to_cpu(cp->cp_inodes_count); in nilfs_cpfile_checkpoint_to_cpinfo()
563 ci->ci_blocks_count = le64_to_cpu(cp->cp_blocks_count); in nilfs_cpfile_checkpoint_to_cpinfo()
564 ci->ci_next = le64_to_cpu(cp->cp_snapshot_list.ssl_next); in nilfs_cpfile_checkpoint_to_cpinfo()
574 size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size; in nilfs_cpfile_do_get_cpinfo()
582 return -ENOENT; /* checkpoint number 0 is invalid */ in nilfs_cpfile_do_get_cpinfo()
583 down_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_do_get_cpinfo()
587 cpfile, cno, cur_cno - 1, &cno, &bh); in nilfs_cpfile_do_get_cpinfo()
589 if (likely(ret == -ENOENT)) in nilfs_cpfile_do_get_cpinfo()
596 cp = kaddr = kmap_local_folio(bh->b_folio, offset); in nilfs_cpfile_do_get_cpinfo()
611 ci = (void *)ci - cisz; in nilfs_cpfile_do_get_cpinfo()
612 *cnop = ci->ci_cno + 1; in nilfs_cpfile_do_get_cpinfo()
616 up_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_do_get_cpinfo()
628 __u64 curr = *cnop, next; in nilfs_cpfile_do_get_ssinfo() local
633 down_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_do_get_ssinfo()
639 header = kmap_local_folio(bh->b_folio, 0); in nilfs_cpfile_do_get_ssinfo()
640 curr = le64_to_cpu(header->ch_snapshot_list.ssl_next); in nilfs_cpfile_do_get_ssinfo()
655 if (ret == -ENOENT) in nilfs_cpfile_do_get_ssinfo()
660 cp = kmap_local_folio(bh->b_folio, offset); in nilfs_cpfile_do_get_ssinfo()
669 next = le64_to_cpu(cp->cp_snapshot_list.ssl_next); in nilfs_cpfile_do_get_ssinfo()
670 if (next == 0) in nilfs_cpfile_do_get_ssinfo()
674 next_blkoff = nilfs_cpfile_get_blkoff(cpfile, next); in nilfs_cpfile_do_get_ssinfo()
677 ret = nilfs_cpfile_get_checkpoint_block(cpfile, next, in nilfs_cpfile_do_get_ssinfo()
680 WARN_ON(ret == -ENOENT); in nilfs_cpfile_do_get_ssinfo()
684 offset = nilfs_cpfile_checkpoint_offset(cpfile, next, bh); in nilfs_cpfile_do_get_ssinfo()
685 cp = kmap_local_folio(bh->b_folio, offset); in nilfs_cpfile_do_get_ssinfo()
686 curr = next; in nilfs_cpfile_do_get_ssinfo()
695 up_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_do_get_ssinfo()
700 * nilfs_cpfile_get_cpinfo - get information on checkpoints
704 * @mode: mode of checkpoints that the caller wants to retrieve
709 * nilfs_cpfile_get_cpinfo() searches for checkpoints in @mode state
719 * * %-EINVAL - Invalid checkpoint mode.
720 * * %-ENOMEM - Insufficient memory available.
721 * * %-EIO - I/O error (including metadata corruption).
722 * * %-ENOENT - Invalid checkpoint number specified.
725 ssize_t nilfs_cpfile_get_cpinfo(struct inode *cpfile, __u64 *cnop, int mode, in nilfs_cpfile_get_cpinfo() argument
728 switch (mode) { in nilfs_cpfile_get_cpinfo()
734 return -EINVAL; in nilfs_cpfile_get_cpinfo()
739 * nilfs_cpfile_delete_checkpoint - delete a checkpoint
745 * * %-EBUSY - Checkpoint in use (snapshot specified).
746 * * %-EIO - I/O error (including metadata corruption).
747 * * %-ENOENT - No valid checkpoint found.
748 * * %-ENOMEM - Insufficient memory available.
760 return -ENOENT; in nilfs_cpfile_delete_checkpoint()
762 return -EBUSY; in nilfs_cpfile_delete_checkpoint()
779 return -ENOENT; /* checkpoint number 0 is invalid */ in nilfs_cpfile_set_snapshot()
780 down_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_set_snapshot()
791 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_set_snapshot()
793 ret = -ENOENT; in nilfs_cpfile_set_snapshot()
806 * snapshot mode by going backwards through the snapshot list. in nilfs_cpfile_set_snapshot()
809 header = kmap_local_folio(header_bh->b_folio, 0); in nilfs_cpfile_set_snapshot()
810 list = &header->ch_snapshot_list; in nilfs_cpfile_set_snapshot()
816 prev = le64_to_cpu(list->ssl_prev); in nilfs_cpfile_set_snapshot()
830 list = kmap_local_folio(curr_bh->b_folio, curr_list_offset); in nilfs_cpfile_set_snapshot()
832 prev = le64_to_cpu(list->ssl_prev); in nilfs_cpfile_set_snapshot()
850 /* Update the list entry for the next snapshot */ in nilfs_cpfile_set_snapshot()
851 list = kmap_local_folio(curr_bh->b_folio, curr_list_offset); in nilfs_cpfile_set_snapshot()
852 list->ssl_prev = cpu_to_le64(cno); in nilfs_cpfile_set_snapshot()
857 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_set_snapshot()
858 cp->cp_snapshot_list.ssl_next = cpu_to_le64(curr); in nilfs_cpfile_set_snapshot()
859 cp->cp_snapshot_list.ssl_prev = cpu_to_le64(prev); in nilfs_cpfile_set_snapshot()
864 list = kmap_local_folio(prev_bh->b_folio, prev_list_offset); in nilfs_cpfile_set_snapshot()
865 list->ssl_next = cpu_to_le64(cno); in nilfs_cpfile_set_snapshot()
869 header = kmap_local_folio(header_bh->b_folio, 0); in nilfs_cpfile_set_snapshot()
870 le64_add_cpu(&header->ch_nsnapshots, 1); in nilfs_cpfile_set_snapshot()
891 up_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_set_snapshot()
901 __u64 next, prev; in nilfs_cpfile_clear_snapshot() local
906 return -ENOENT; /* checkpoint number 0 is invalid */ in nilfs_cpfile_clear_snapshot()
907 down_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_clear_snapshot()
918 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_clear_snapshot()
920 ret = -ENOENT; in nilfs_cpfile_clear_snapshot()
930 list = &cp->cp_snapshot_list; in nilfs_cpfile_clear_snapshot()
931 next = le64_to_cpu(list->ssl_next); in nilfs_cpfile_clear_snapshot()
932 prev = le64_to_cpu(list->ssl_prev); in nilfs_cpfile_clear_snapshot()
935 if (next != 0) { in nilfs_cpfile_clear_snapshot()
936 ret = nilfs_cpfile_get_checkpoint_block(cpfile, next, 0, in nilfs_cpfile_clear_snapshot()
942 cpfile, next, next_bh); in nilfs_cpfile_clear_snapshot()
962 /* Update the list entry for the next snapshot */ in nilfs_cpfile_clear_snapshot()
963 list = kmap_local_folio(next_bh->b_folio, next_list_offset); in nilfs_cpfile_clear_snapshot()
964 list->ssl_prev = cpu_to_le64(prev); in nilfs_cpfile_clear_snapshot()
968 list = kmap_local_folio(prev_bh->b_folio, prev_list_offset); in nilfs_cpfile_clear_snapshot()
969 list->ssl_next = cpu_to_le64(next); in nilfs_cpfile_clear_snapshot()
973 cp = kmap_local_folio(cp_bh->b_folio, offset); in nilfs_cpfile_clear_snapshot()
974 cp->cp_snapshot_list.ssl_next = cpu_to_le64(0); in nilfs_cpfile_clear_snapshot()
975 cp->cp_snapshot_list.ssl_prev = cpu_to_le64(0); in nilfs_cpfile_clear_snapshot()
980 header = kmap_local_folio(header_bh->b_folio, 0); in nilfs_cpfile_clear_snapshot()
981 le64_add_cpu(&header->ch_nsnapshots, -1); in nilfs_cpfile_clear_snapshot()
1002 up_write(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_clear_snapshot()
1007 * nilfs_cpfile_is_snapshot - determine if checkpoint is a snapshot
1013 * * %-EIO - I/O error (including metadata corruption).
1014 * * %-ENOENT - No such checkpoint.
1015 * * %-ENOMEM - Insufficient memory available.
1029 return -ENOENT; in nilfs_cpfile_is_snapshot()
1030 down_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_is_snapshot()
1037 cp = kmap_local_folio(bh->b_folio, offset); in nilfs_cpfile_is_snapshot()
1039 ret = -ENOENT; in nilfs_cpfile_is_snapshot()
1046 up_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_is_snapshot()
1051 * nilfs_cpfile_change_cpmode - change checkpoint mode
1054 * @mode: mode of checkpoint
1056 * Description: nilfs_change_cpmode() changes the mode of the checkpoint
1057 * specified by @cno. The mode @mode is NILFS_CHECKPOINT or NILFS_SNAPSHOT.
1061 * * %-EIO - I/O error (including metadata corruption).
1062 * * %-ENOENT - No such checkpoint.
1063 * * %-ENOMEM - Insufficient memory available.
1065 int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode) in nilfs_cpfile_change_cpmode() argument
1069 switch (mode) { in nilfs_cpfile_change_cpmode()
1071 if (nilfs_checkpoint_is_mounted(cpfile->i_sb, cno)) in nilfs_cpfile_change_cpmode()
1074 * plain read-only mounts since they are exclusive in nilfs_cpfile_change_cpmode()
1078 ret = -EBUSY; in nilfs_cpfile_change_cpmode()
1085 return -EINVAL; in nilfs_cpfile_change_cpmode()
1090 * nilfs_cpfile_get_stat - get checkpoint statistics
1099 * * %-EIO - I/O error (including metadata corruption).
1100 * * %-ENOMEM - Insufficient memory available.
1108 down_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_get_stat()
1113 header = kmap_local_folio(bh->b_folio, 0); in nilfs_cpfile_get_stat()
1114 cpstat->cs_cno = nilfs_mdt_cno(cpfile); in nilfs_cpfile_get_stat()
1115 cpstat->cs_ncps = le64_to_cpu(header->ch_ncheckpoints); in nilfs_cpfile_get_stat()
1116 cpstat->cs_nsss = le64_to_cpu(header->ch_nsnapshots); in nilfs_cpfile_get_stat()
1121 up_read(&NILFS_MDT(cpfile)->mi_sem); in nilfs_cpfile_get_stat()
1126 * nilfs_cpfile_read - read or get cpfile inode
1129 * @raw_inode: on-disk cpfile inode
1140 if (cpsize > sb->s_blocksize) { in nilfs_cpfile_read()
1142 return -EINVAL; in nilfs_cpfile_read()
1145 return -EINVAL; in nilfs_cpfile_read()
1150 return -ENOMEM; in nilfs_cpfile_read()