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 | } |
