diff options
Diffstat (limited to 'fs/nilfs2/cpfile.c')
-rw-r--r-- | fs/nilfs2/cpfile.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c index 18737818db63..03de1da8795b 100644 --- a/fs/nilfs2/cpfile.c +++ b/fs/nilfs2/cpfile.c | |||
@@ -933,27 +933,40 @@ int nilfs_cpfile_get_stat(struct inode *cpfile, struct nilfs_cpstat *cpstat) | |||
933 | } | 933 | } |
934 | 934 | ||
935 | /** | 935 | /** |
936 | * nilfs_cpfile_read - read cpfile inode | 936 | * nilfs_cpfile_read - read or get cpfile inode |
937 | * @cpfile: cpfile inode | 937 | * @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 | 938 | * @cpsize: size of a checkpoint entry |
939 | * @raw_inode: on-disk cpfile inode | ||
940 | * @inodep: buffer to store the inode | ||
949 | */ | 941 | */ |
950 | struct inode *nilfs_cpfile_new(struct the_nilfs *nilfs, size_t cpsize) | 942 | int nilfs_cpfile_read(struct super_block *sb, size_t cpsize, |
943 | struct nilfs_inode *raw_inode, struct inode **inodep) | ||
951 | { | 944 | { |
952 | struct inode *cpfile; | 945 | struct inode *cpfile; |
946 | int err; | ||
953 | 947 | ||
954 | cpfile = nilfs_mdt_new(nilfs, NULL, NILFS_CPFILE_INO, 0); | 948 | cpfile = nilfs_iget_locked(sb, NULL, NILFS_CPFILE_INO); |
955 | if (cpfile) | 949 | if (unlikely(!cpfile)) |
956 | nilfs_mdt_set_entry_size(cpfile, cpsize, | 950 | return -ENOMEM; |
957 | sizeof(struct nilfs_cpfile_header)); | 951 | if (!(cpfile->i_state & I_NEW)) |
958 | return cpfile; | 952 | goto out; |
953 | |||
954 | err = nilfs_mdt_init(cpfile, NILFS_MDT_GFP, 0); | ||
955 | if (err) | ||
956 | goto failed; | ||
957 | |||
958 | nilfs_mdt_set_entry_size(cpfile, cpsize, | ||
959 | sizeof(struct nilfs_cpfile_header)); | ||
960 | |||
961 | err = nilfs_read_inode_common(cpfile, raw_inode); | ||
962 | if (err) | ||
963 | goto failed; | ||
964 | |||
965 | unlock_new_inode(cpfile); | ||
966 | out: | ||
967 | *inodep = cpfile; | ||
968 | return 0; | ||
969 | failed: | ||
970 | iget_failed(cpfile); | ||
971 | return err; | ||
959 | } | 972 | } |