Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2: (22 commits) nilfs2: support contiguous lookup of blocks nilfs2: add sync_page method to page caches of meta data nilfs2: use device's backing_dev_info for btree node caches nilfs2: return EBUSY against delete request on snapshot nilfs2: modify list of unsupported features in caveats nilfs2: enable sync_page method nilfs2: set bio unplug flag for the last bio in segment nilfs2: allow future expansion of metadata read out via get info ioctl NILFS2: Pagecache usage optimization on NILFS2 nilfs2: remove nilfs_btree_operations from btree mapping nilfs2: remove nilfs_direct_operations from direct mapping nilfs2: remove bmap pointer operations nilfs2: remove useless b_low and b_high fields from nilfs_bmap struct nilfs2: remove pointless NULL check of bpop_commit_alloc_ptr function nilfs2: move get block functions in bmap.c into btree codes nilfs2: remove nilfs_bmap_delete_block nilfs2: remove nilfs_bmap_put_block nilfs2: remove header file for segment list operations nilfs2: eliminate removal list of segments nilfs2: add sufile function that can modify multiple segment usages ...
This commit is contained in:
@@ -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);
|
||||
@@ -384,9 +380,10 @@ static void nilfs_cpfile_checkpoint_to_cpinfo(struct inode *cpfile,
|
||||
}
|
||||
|
||||
static ssize_t nilfs_cpfile_do_get_cpinfo(struct inode *cpfile, __u64 *cnop,
|
||||
struct nilfs_cpinfo *ci, size_t nci)
|
||||
void *buf, unsigned cisz, size_t nci)
|
||||
{
|
||||
struct nilfs_checkpoint *cp;
|
||||
struct nilfs_cpinfo *ci = buf;
|
||||
struct buffer_head *bh;
|
||||
size_t cpsz = NILFS_MDT(cpfile)->mi_entry_size;
|
||||
__u64 cur_cno = nilfs_mdt_cno(cpfile), cno = *cnop;
|
||||
@@ -410,17 +407,22 @@ static ssize_t nilfs_cpfile_do_get_cpinfo(struct inode *cpfile, __u64 *cnop,
|
||||
kaddr = kmap_atomic(bh->b_page, KM_USER0);
|
||||
cp = nilfs_cpfile_block_get_checkpoint(cpfile, cno, bh, kaddr);
|
||||
for (i = 0; i < ncps && n < nci; i++, cp = (void *)cp + cpsz) {
|
||||
if (!nilfs_checkpoint_invalid(cp))
|
||||
nilfs_cpfile_checkpoint_to_cpinfo(
|
||||
cpfile, cp, &ci[n++]);
|
||||
if (!nilfs_checkpoint_invalid(cp)) {
|
||||
nilfs_cpfile_checkpoint_to_cpinfo(cpfile, cp,
|
||||
ci);
|
||||
ci = (void *)ci + cisz;
|
||||
n++;
|
||||
}
|
||||
}
|
||||
kunmap_atomic(kaddr, KM_USER0);
|
||||
brelse(bh);
|
||||
}
|
||||
|
||||
ret = n;
|
||||
if (n > 0)
|
||||
*cnop = ci[n - 1].ci_cno + 1;
|
||||
if (n > 0) {
|
||||
ci = (void *)ci - cisz;
|
||||
*cnop = ci->ci_cno + 1;
|
||||
}
|
||||
|
||||
out:
|
||||
up_read(&NILFS_MDT(cpfile)->mi_sem);
|
||||
@@ -428,11 +430,12 @@ static ssize_t nilfs_cpfile_do_get_cpinfo(struct inode *cpfile, __u64 *cnop,
|
||||
}
|
||||
|
||||
static ssize_t nilfs_cpfile_do_get_ssinfo(struct inode *cpfile, __u64 *cnop,
|
||||
struct nilfs_cpinfo *ci, size_t nci)
|
||||
void *buf, unsigned cisz, size_t nci)
|
||||
{
|
||||
struct buffer_head *bh;
|
||||
struct nilfs_cpfile_header *header;
|
||||
struct nilfs_checkpoint *cp;
|
||||
struct nilfs_cpinfo *ci = buf;
|
||||
__u64 curr = *cnop, next;
|
||||
unsigned long curr_blkoff, next_blkoff;
|
||||
void *kaddr;
|
||||
@@ -472,7 +475,9 @@ static ssize_t nilfs_cpfile_do_get_ssinfo(struct inode *cpfile, __u64 *cnop,
|
||||
if (unlikely(nilfs_checkpoint_invalid(cp) ||
|
||||
!nilfs_checkpoint_snapshot(cp)))
|
||||
break;
|
||||
nilfs_cpfile_checkpoint_to_cpinfo(cpfile, cp, &ci[n++]);
|
||||
nilfs_cpfile_checkpoint_to_cpinfo(cpfile, cp, ci);
|
||||
ci = (void *)ci + cisz;
|
||||
n++;
|
||||
next = le64_to_cpu(cp->cp_snapshot_list.ssl_next);
|
||||
if (next == 0)
|
||||
break; /* reach end of the snapshot list */
|
||||
@@ -511,13 +516,13 @@ static ssize_t nilfs_cpfile_do_get_ssinfo(struct inode *cpfile, __u64 *cnop,
|
||||
*/
|
||||
|
||||
ssize_t nilfs_cpfile_get_cpinfo(struct inode *cpfile, __u64 *cnop, int mode,
|
||||
struct nilfs_cpinfo *ci, size_t nci)
|
||||
void *buf, unsigned cisz, size_t nci)
|
||||
{
|
||||
switch (mode) {
|
||||
case NILFS_CHECKPOINT:
|
||||
return nilfs_cpfile_do_get_cpinfo(cpfile, cnop, ci, nci);
|
||||
return nilfs_cpfile_do_get_cpinfo(cpfile, cnop, buf, cisz, nci);
|
||||
case NILFS_SNAPSHOT:
|
||||
return nilfs_cpfile_do_get_ssinfo(cpfile, cnop, ci, nci);
|
||||
return nilfs_cpfile_do_get_ssinfo(cpfile, cnop, buf, cisz, nci);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -533,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, 1);
|
||||
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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user