diff options
Diffstat (limited to 'fs/nilfs2/cpfile.c')
-rw-r--r-- | fs/nilfs2/cpfile.c | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c index 18737818db63..5ff15a8a1024 100644 --- a/fs/nilfs2/cpfile.c +++ b/fs/nilfs2/cpfile.c | |||
@@ -863,26 +863,19 @@ int nilfs_cpfile_is_snapshot(struct inode *cpfile, __u64 cno) | |||
863 | */ | 863 | */ |
864 | int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode) | 864 | int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode) |
865 | { | 865 | { |
866 | struct the_nilfs *nilfs; | ||
867 | int ret; | 866 | int ret; |
868 | 867 | ||
869 | nilfs = NILFS_MDT(cpfile)->mi_nilfs; | ||
870 | |||
871 | switch (mode) { | 868 | switch (mode) { |
872 | case NILFS_CHECKPOINT: | 869 | case NILFS_CHECKPOINT: |
873 | /* | 870 | if (nilfs_checkpoint_is_mounted(cpfile->i_sb, cno)) |
874 | * Check for protecting existing snapshot mounts: | 871 | /* |
875 | * ns_mount_mutex is used to make this operation atomic and | 872 | * Current implementation does not have to protect |
876 | * exclusive with a new mount job. Though it doesn't cover | 873 | * plain read-only mounts since they are exclusive |
877 | * umount, it's enough for the purpose. | 874 | * with a read/write mount and are protected from the |
878 | */ | 875 | * cleaner. |
879 | if (nilfs_checkpoint_is_mounted(nilfs, cno, 1)) { | 876 | */ |
880 | /* Current implementation does not have to protect | ||
881 | plain read-only mounts since they are exclusive | ||
882 | with a read/write mount and are protected from the | ||
883 | cleaner. */ | ||
884 | ret = -EBUSY; | 877 | ret = -EBUSY; |
885 | } else | 878 | else |
886 | ret = nilfs_cpfile_clear_snapshot(cpfile, cno); | 879 | ret = nilfs_cpfile_clear_snapshot(cpfile, cno); |
887 | return ret; | 880 | return ret; |
888 | case NILFS_SNAPSHOT: | 881 | case NILFS_SNAPSHOT: |
@@ -933,27 +926,40 @@ int nilfs_cpfile_get_stat(struct inode *cpfile, struct nilfs_cpstat *cpstat) | |||
933 | } | 926 | } |
934 | 927 | ||
935 | /** | 928 | /** |
936 | * nilfs_cpfile_read - read cpfile inode | 929 | * nilfs_cpfile_read - read or get cpfile inode |
937 | * @cpfile: cpfile inode | 930 | * @sb: super block instance |
938 | * @raw_inode: on-disk cpfile inode | ||
939 | */ | ||
940 | int nilfs_cpfile_read(struct inode *cpfile, struct nilfs_inode *raw_inode) | ||
941 | { | ||
942 | return nilfs_read_inode_common(cpfile, raw_inode); | ||
943 | } | ||
944 | |||
945 | /** | ||
946 | * nilfs_cpfile_new - create cpfile | ||
947 | * @nilfs: nilfs object | ||
948 | * @cpsize: size of a checkpoint entry | 931 | * @cpsize: size of a checkpoint entry |
932 | * @raw_inode: on-disk cpfile inode | ||
933 | * @inodep: buffer to store the inode | ||
949 | */ | 934 | */ |
950 | struct inode *nilfs_cpfile_new(struct the_nilfs *nilfs, size_t cpsize) | 935 | int nilfs_cpfile_read(struct super_block *sb, size_t cpsize, |
936 | struct nilfs_inode *raw_inode, struct inode **inodep) | ||
951 | { | 937 | { |
952 | struct inode *cpfile; | 938 | struct inode *cpfile; |
939 | int err; | ||
940 | |||
941 | cpfile = nilfs_iget_locked(sb, NULL, NILFS_CPFILE_INO); | ||
942 | if (unlikely(!cpfile)) | ||
943 | return -ENOMEM; | ||
944 | if (!(cpfile->i_state & I_NEW)) | ||
945 | goto out; | ||
946 | |||
947 | err = nilfs_mdt_init(cpfile, NILFS_MDT_GFP, 0); | ||
948 | if (err) | ||
949 | goto failed; | ||
953 | 950 | ||
954 | cpfile = nilfs_mdt_new(nilfs, NULL, NILFS_CPFILE_INO, 0); | 951 | nilfs_mdt_set_entry_size(cpfile, cpsize, |
955 | if (cpfile) | 952 | sizeof(struct nilfs_cpfile_header)); |
956 | nilfs_mdt_set_entry_size(cpfile, cpsize, | 953 | |
957 | sizeof(struct nilfs_cpfile_header)); | 954 | err = nilfs_read_inode_common(cpfile, raw_inode); |
958 | return cpfile; | 955 | if (err) |
956 | goto failed; | ||
957 | |||
958 | unlock_new_inode(cpfile); | ||
959 | out: | ||
960 | *inodep = cpfile; | ||
961 | return 0; | ||
962 | failed: | ||
963 | iget_failed(cpfile); | ||
964 | return err; | ||
959 | } | 965 | } |