diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-05-30 06:08:09 -0400 |
---|---|---|
committer | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-06-10 10:41:12 -0400 |
commit | 30c25be71fcbd87fd33518045cc014e69bff3d6f (patch) | |
tree | 89b9ea993834f57b7390a24fdfacf6099b854b54 /fs | |
parent | fb6e7113ae3ba6c7d0de77c6ccbcfa659899ff0f (diff) |
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: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nilfs2/cpfile.c | 14 |
1 files changed, 2 insertions, 12 deletions
diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c index b5a8cd6b474f..4184c1c2992c 100644 --- a/fs/nilfs2/cpfile.c +++ b/fs/nilfs2/cpfile.c | |||
@@ -295,10 +295,6 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, | |||
295 | return -EINVAL; | 295 | return -EINVAL; |
296 | } | 296 | } |
297 | 297 | ||
298 | /* cannot delete the latest checkpoint */ | ||
299 | if (start == nilfs_mdt_cno(cpfile) - 1) | ||
300 | return -EPERM; | ||
301 | |||
302 | down_write(&NILFS_MDT(cpfile)->mi_sem); | 298 | down_write(&NILFS_MDT(cpfile)->mi_sem); |
303 | 299 | ||
304 | ret = nilfs_cpfile_get_header_block(cpfile, &header_bh); | 300 | ret = nilfs_cpfile_get_header_block(cpfile, &header_bh); |
@@ -542,20 +538,14 @@ int nilfs_cpfile_delete_checkpoint(struct inode *cpfile, __u64 cno) | |||
542 | struct nilfs_cpinfo ci; | 538 | struct nilfs_cpinfo ci; |
543 | __u64 tcno = cno; | 539 | __u64 tcno = cno; |
544 | ssize_t nci; | 540 | ssize_t nci; |
545 | int ret; | ||
546 | 541 | ||
547 | nci = nilfs_cpfile_do_get_cpinfo(cpfile, &tcno, &ci, sizeof(ci), 1); | 542 | nci = nilfs_cpfile_do_get_cpinfo(cpfile, &tcno, &ci, sizeof(ci), 1); |
548 | if (nci < 0) | 543 | if (nci < 0) |
549 | return nci; | 544 | return nci; |
550 | else if (nci == 0 || ci.ci_cno != cno) | 545 | else if (nci == 0 || ci.ci_cno != cno) |
551 | return -ENOENT; | 546 | return -ENOENT; |
552 | 547 | else if (nilfs_cpinfo_snapshot(&ci)) | |
553 | /* cannot delete the latest checkpoint nor snapshots */ | 548 | return -EBUSY; |
554 | ret = nilfs_cpinfo_snapshot(&ci); | ||
555 | if (ret < 0) | ||
556 | return ret; | ||
557 | else if (ret > 0 || cno == nilfs_mdt_cno(cpfile) - 1) | ||
558 | return -EPERM; | ||
559 | 549 | ||
560 | return nilfs_cpfile_delete_checkpoints(cpfile, cno, cno + 1); | 550 | return nilfs_cpfile_delete_checkpoints(cpfile, cno, cno + 1); |
561 | } | 551 | } |