Commit 30c25be7 authored by Ryusuke Konishi's avatar Ryusuke Konishi

nilfs2: return EBUSY against delete request on snapshot

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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
parent fb6e7113
...@@ -295,10 +295,6 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, ...@@ -295,10 +295,6 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile,
return -EINVAL; return -EINVAL;
} }
/* cannot delete the latest checkpoint */
if (start == nilfs_mdt_cno(cpfile) - 1)
return -EPERM;
down_write(&NILFS_MDT(cpfile)->mi_sem); down_write(&NILFS_MDT(cpfile)->mi_sem);
ret = nilfs_cpfile_get_header_block(cpfile, &header_bh); ret = nilfs_cpfile_get_header_block(cpfile, &header_bh);
...@@ -542,20 +538,14 @@ int nilfs_cpfile_delete_checkpoint(struct inode *cpfile, __u64 cno) ...@@ -542,20 +538,14 @@ int nilfs_cpfile_delete_checkpoint(struct inode *cpfile, __u64 cno)
struct nilfs_cpinfo ci; struct nilfs_cpinfo ci;
__u64 tcno = cno; __u64 tcno = cno;
ssize_t nci; ssize_t nci;
int ret;
nci = nilfs_cpfile_do_get_cpinfo(cpfile, &tcno, &ci, sizeof(ci), 1); nci = nilfs_cpfile_do_get_cpinfo(cpfile, &tcno, &ci, sizeof(ci), 1);
if (nci < 0) if (nci < 0)
return nci; return nci;
else if (nci == 0 || ci.ci_cno != cno) else if (nci == 0 || ci.ci_cno != cno)
return -ENOENT; return -ENOENT;
else if (nilfs_cpinfo_snapshot(&ci))
/* cannot delete the latest checkpoint nor snapshots */ return -EBUSY;
ret = nilfs_cpinfo_snapshot(&ci);
if (ret < 0)
return ret;
else if (ret > 0 || cno == nilfs_mdt_cno(cpfile) - 1)
return -EPERM;
return nilfs_cpfile_delete_checkpoints(cpfile, cno, cno + 1); return nilfs_cpfile_delete_checkpoints(cpfile, cno, cno + 1);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment