Skip to content

Commit

Permalink
nilfs2: return EBUSY against delete request on snapshot
Browse files Browse the repository at this point in the history
This helps userland programs like the rmcp command to distinguish
error codes returned against a checkpoint removal request.

Previously -EPERM was returned, and not discriminable from real
permission errors.  This also allows removal of the latest checkpoint
because the deletion leads to create a new checkpoint, and thus it's
harmless for the filesystem.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
  • Loading branch information
Ryusuke Konishi committed Jun 10, 2009
1 parent fb6e711 commit 30c25be
Showing 1 changed file with 2 additions and 12 deletions.
14 changes: 2 additions & 12 deletions fs/nilfs2/cpfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -295,10 +295,6 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
return -EINVAL;
}

/* cannot delete the latest checkpoint */
if (start == nilfs_mdt_cno(cpfile) - 1)
return -EPERM;

down_write(&NILFS_MDT(cpfile)->mi_sem);

ret = nilfs_cpfile_get_header_block(cpfile, &header_bh);
Expand Down Expand Up @@ -542,20 +538,14 @@ int nilfs_cpfile_delete_checkpoint(struct inode *cpfile, __u64 cno)
struct nilfs_cpinfo ci;
__u64 tcno = cno;
ssize_t nci;
int ret;

nci = nilfs_cpfile_do_get_cpinfo(cpfile, &tcno, &ci, sizeof(ci), 1);
if (nci < 0)
return nci;
else if (nci == 0 || ci.ci_cno != cno)
return -ENOENT;

/* cannot delete the latest checkpoint nor snapshots */
ret = nilfs_cpinfo_snapshot(&ci);
if (ret < 0)
return ret;
else if (ret > 0 || cno == nilfs_mdt_cno(cpfile) - 1)
return -EPERM;
else if (nilfs_cpinfo_snapshot(&ci))
return -EBUSY;

return nilfs_cpfile_delete_checkpoints(cpfile, cno, cno + 1);
}
Expand Down

0 comments on commit 30c25be

Please sign in to comment.