]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/nilfs2/cpfile.c
Merge branch 'master' into tk71
[mv-sheeva.git] / fs / nilfs2 / cpfile.c
index 18737818db63c63875db8a414e7f415a0217f014..5ff15a8a10242d883c78e69bb54ed9f0ac17c43d 100644 (file)
@@ -863,26 +863,19 @@ int nilfs_cpfile_is_snapshot(struct inode *cpfile, __u64 cno)
  */
 int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode)
 {
-       struct the_nilfs *nilfs;
        int ret;
 
-       nilfs = NILFS_MDT(cpfile)->mi_nilfs;
-
        switch (mode) {
        case NILFS_CHECKPOINT:
-               /*
-                * Check for protecting existing snapshot mounts:
-                * ns_mount_mutex is used to make this operation atomic and
-                * exclusive with a new mount job.  Though it doesn't cover
-                * umount, it's enough for the purpose.
-                */
-               if (nilfs_checkpoint_is_mounted(nilfs, cno, 1)) {
-                       /* Current implementation does not have to protect
-                          plain read-only mounts since they are exclusive
-                          with a read/write mount and are protected from the
-                          cleaner. */
+               if (nilfs_checkpoint_is_mounted(cpfile->i_sb, cno))
+                       /*
+                        * Current implementation does not have to protect
+                        * plain read-only mounts since they are exclusive
+                        * with a read/write mount and are protected from the
+                        * cleaner.
+                        */
                        ret = -EBUSY;
-               else
+               else
                        ret = nilfs_cpfile_clear_snapshot(cpfile, cno);
                return ret;
        case NILFS_SNAPSHOT:
@@ -933,27 +926,40 @@ int nilfs_cpfile_get_stat(struct inode *cpfile, struct nilfs_cpstat *cpstat)
 }
 
 /**
- * nilfs_cpfile_read - read cpfile inode
- * @cpfile: cpfile inode
- * @raw_inode: on-disk cpfile inode
- */
-int nilfs_cpfile_read(struct inode *cpfile, struct nilfs_inode *raw_inode)
-{
-       return nilfs_read_inode_common(cpfile, raw_inode);
-}
-
-/**
- * nilfs_cpfile_new - create cpfile
- * @nilfs: nilfs object
+ * nilfs_cpfile_read - read or get cpfile inode
+ * @sb: super block instance
  * @cpsize: size of a checkpoint entry
+ * @raw_inode: on-disk cpfile inode
+ * @inodep: buffer to store the inode
  */
-struct inode *nilfs_cpfile_new(struct the_nilfs *nilfs, size_t cpsize)
+int nilfs_cpfile_read(struct super_block *sb, size_t cpsize,
+                     struct nilfs_inode *raw_inode, struct inode **inodep)
 {
        struct inode *cpfile;
+       int err;
+
+       cpfile = nilfs_iget_locked(sb, NULL, NILFS_CPFILE_INO);
+       if (unlikely(!cpfile))
+               return -ENOMEM;
+       if (!(cpfile->i_state & I_NEW))
+               goto out;
+
+       err = nilfs_mdt_init(cpfile, NILFS_MDT_GFP, 0);
+       if (err)
+               goto failed;
 
-       cpfile = nilfs_mdt_new(nilfs, NULL, NILFS_CPFILE_INO, 0);
-       if (cpfile)
-               nilfs_mdt_set_entry_size(cpfile, cpsize,
-                                        sizeof(struct nilfs_cpfile_header));
-       return cpfile;
+       nilfs_mdt_set_entry_size(cpfile, cpsize,
+                                sizeof(struct nilfs_cpfile_header));
+
+       err = nilfs_read_inode_common(cpfile, raw_inode);
+       if (err)
+               goto failed;
+
+       unlock_new_inode(cpfile);
+ out:
+       *inodep = cpfile;
+       return 0;
+ failed:
+       iget_failed(cpfile);
+       return err;
 }