From 90ca43536c1a72edbca567524de91aacbffa7a45 Mon Sep 17 00:00:00 2001 From: wangdi <wangdi> Date: Sun, 18 Jan 2004 17:16:31 +0000 Subject: [PATCH] 1) some minor fix in copy_back_pages 2)add snap_delete 3) some minor fix --- lustre/snapfs/file.c | 12 ++--- lustre/snapfs/snaptable.c | 93 +++++++++++++++++----------------- lustre/snapfs/utils/snapconf.c | 2 + lustre/snapfs/utils/snapctl.c | 43 ++++++++++++++++ lustre/snapfs/utils/snapctl.h | 1 + 5 files changed, 99 insertions(+), 52 deletions(-) diff --git a/lustre/snapfs/file.c b/lustre/snapfs/file.c index f819aa190f..25eea668a9 100644 --- a/lustre/snapfs/file.c +++ b/lustre/snapfs/file.c @@ -48,11 +48,11 @@ static int copy_back_page(struct inode *dst, int err = 0; ENTRY; - index = start >> PAGE_CACHE_SHIFT; + offset = (start & (PAGE_CACHE_SIZE -1)); /* Within page */ bytes = end - start; - offset = start & PAGE_CACHE_MASK; + index = start >> PAGE_CACHE_SHIFT; - if (!has_pages(src, index)) + if (!has_pages(src, index) || bytes > 4096) RETURN(0); cache = snap_find_cache(src->i_dev); @@ -89,13 +89,13 @@ static int copy_back_page(struct inode *dst, } kaddr_dst = kmap(dst_page); - err = c_aops->prepare_write(NULL, dst_page, offset, bytes); + err = c_aops->prepare_write(NULL, dst_page, offset, offset + bytes); if (err) goto unlock_dst_page; memcpy(kaddr_dst, kaddr_src, PAGE_CACHE_SIZE); flush_dcache_page(dst_page); - err = c_aops->commit_write(NULL, dst_page, offset, bytes); + err = c_aops->commit_write(NULL, dst_page, offset, offset + bytes); if (err) goto unlock_dst_page; err = 1; @@ -221,7 +221,7 @@ static int currentfs_readpage(struct file *file, struct page *page) c_aops = filter_c2cfaops(cache->cache_filter); - block = page->index >> inode->i_sb->s_blocksize_bits; + block = (page->index << PAGE_CACHE_SHIFT) >> inode->i_sb->s_blocksize_bits; /* if there is a block in the cache, return the cache readpage */ if(c_aops->bmap(inode->i_mapping, block) ) { diff --git a/lustre/snapfs/snaptable.c b/lustre/snapfs/snaptable.c index c16a5f0dea..5788524d6b 100644 --- a/lustre/snapfs/snaptable.c +++ b/lustre/snapfs/snaptable.c @@ -262,36 +262,39 @@ static int delete_inode(struct inode *primary, void *param) struct inode *next_ind = NULL; int my_table[SNAP_MAX]; - if(!primary) return 0; + ENTRY; + + if(!primary) RETURN(0); data = (struct snap_iterdata*) param; - if(data) { + if (data) { index = data->index; tableno = data->tableno; } - CDEBUG(D_INODE, "delete_inode ino %lu, index %d\n", primary->i_ino, index); + CDEBUG(D_SNAP, "delete_inode ino %lu, index %d\n", primary->i_ino, index); table = &snap_tables[tableno]; redirect = snap_get_indirect(primary, NULL, index); - if(!redirect) - return 0; - + if (!redirect) { + CDEBUG(D_SNAP, "redirect inode index %d not exist \n", index); + RETURN(0); + } old_ind = redirect->i_ino; iput(redirect); slot = snap_index2slot(table, index) - 1; - if( slot > 0 ) { + if (slot > 0) { this_index = table->snap_items[slot].index; redirect = snap_get_indirect(primary, NULL, this_index); - if(redirect) + if (redirect) { iput(redirect); - else { + } else { snap_set_indirect(primary, old_ind, this_index, 0); snap_set_indirect(primary, 0, index, 0); - return 0; + RETURN(0); } } @@ -299,30 +302,29 @@ static int delete_inode(struct inode *primary, void *param) /* used for destroy_indirect and block level cow */ /* XXX fix this later, now use tbl_count, not NOW */ delete_slot = snap_index2slot(table, index); - for(slot = table->tbl_count; slot > delete_slot; slot --) - { + for (slot = table->tbl_count; slot > delete_slot; slot --) { my_table[slot - delete_slot] = table->snap_items[slot].index; } next_ind = snap_get_indirect (primary, my_table, table->tbl_count - delete_slot ); - if( next_ind && (next_ind->i_ino == primary->i_ino) ) { + if (next_ind && (next_ind->i_ino == primary->i_ino)) { iput(next_ind); next_ind = NULL; } - if( next_ind && (next_ind->i_ino == old_ind) ) { + if (next_ind && (next_ind->i_ino == old_ind)) { iput(next_ind); next_ind = NULL; } rc = snap_destroy_indirect(primary, index, next_ind); - if(next_ind) iput(next_ind); + if (next_ind) iput(next_ind); - if(rc != 0) + if (rc != 0) CERROR("snap_destroy_indirect(ino %lu,index %d),ret %d\n", primary->i_ino, index, rc); - return 0; + RETURN(0); } static int snap_delete(struct super_block *sb, struct snap_iterdata *data) @@ -725,59 +727,58 @@ int snap_get_index_from_name(int tableno, char *name) return -EINVAL; } -int snap_iterate_func(int len, struct snap_ioc_data *ioc_data, unsigned int cmd) +int snap_iterate_func( struct ioc_snap_tbl_data *data, unsigned int cmd) { - struct snap_iterdata data; + struct snapshot_operations *snapops; + struct snap_iterdata iterate_data; struct super_block *sb; struct snap_cache *cache; struct snap_table *table; - char name[SNAP_MAX_NAMELEN]; - int index, tableno, name_len, slot, rc; - - kdev_t dev ; + int index, tableno, slot, rc; ENTRY; + + if (!(cache = snap_find_cache((kdev_t)data->dev))) + RETURN(-ENODEV); - dev = ioc_data->dev; - cache = snap_find_cache(dev); - if ( !cache ) - RETURN(-EINVAL); + snapops = filter_c2csnapops(cache->cache_filter); + if (!snapops || !snapops->set_meta_attr) + RETURN(-EINVAL); + + tableno = data->no; + if (tableno < 0 || tableno > SNAP_MAX_TABLES) { + CERROR("invalid table number %d\n", tableno); + RETURN(-EINVAL); + } sb = cache->cache_sb; - tableno = cache->cache_snap_tableno; table = &snap_tables[tableno]; - - name_len = len - sizeof(kdev_t); - memset(name, 0, SNAP_MAX_NAMELEN); - if(name_len > SNAP_MAX_NAMELEN) - name_len = SNAP_MAX_NAMELEN; - if(name_len < 0 ) - name_len = 0; - memcpy(name, ioc_data->name, name_len); - if ((index = snap_get_index_from_name (tableno, name)) < 0) + index = get_index_of_item(table, data->snaps[0].name); + if (index < 0) RETURN(-EINVAL); - data.dev = dev; - data.index = index; - data.tableno = tableno; + iterate_data.dev = (kdev_t)data->dev; + iterate_data.index = index; + iterate_data.tableno = tableno; slot = snap_index2slot (table, index); if( slot < 0 ) RETURN(-EINVAL); - data.time = table->snap_items[slot].time; + iterate_data.time = table->snap_items[slot].time; CDEBUG(D_SNAP, "dev %d, tableno %d, index %d, time %lu\n", - data.dev, data.tableno, data.index, data.time ); + iterate_data.dev, iterate_data.tableno, + iterate_data.index, iterate_data.time); switch (cmd) { case IOC_SNAP_DEBUG: - rc = snap_print(sb, &data); + rc = snap_print(sb, &iterate_data); break; case IOC_SNAP_DELETE: - rc = snaptable_delete_item(sb, &data); + rc = snaptable_delete_item(sb, &iterate_data); break; case IOC_SNAP_RESTORE: - rc = snap_restore(sb, &data); + rc = snap_restore(sb, &iterate_data); break; default: CERROR("unrecognized cmd %d \n", cmd); @@ -931,7 +932,7 @@ int snap_ioctl (struct inode * inode, struct file * filp, case IOC_SNAP_DELETE: case IOC_SNAP_RESTORE: case IOC_SNAP_DEBUG: - rc = snap_iterate_func(input.ioc_inlen, karg, cmd); + rc = snap_iterate_func(karg, cmd); break; #ifdef SNAP_DEBUG case IOC_SNAP_DEVFAIL: diff --git a/lustre/snapfs/utils/snapconf.c b/lustre/snapfs/utils/snapconf.c index 4aad130d8f..1b22b8ded5 100644 --- a/lustre/snapfs/utils/snapconf.c +++ b/lustre/snapfs/utils/snapconf.c @@ -41,6 +41,8 @@ command_t cmdlist[] = { "dev <device> open available snap device\n"}, {"add", snap_snap_add, 0, "add [table_no] <snap_name> add snapshot to the device\n"}, + {"del", snap_snap_del, 0, + "del [table_no] <snap_name> del snapshot to the device\n"}, {"snap_list", snap_snap_list, 0, "snap_list [table_no] list all the snapshots on the device\n"}, diff --git a/lustre/snapfs/utils/snapctl.c b/lustre/snapfs/utils/snapctl.c index 5edb4fa8bd..78415ccaf4 100644 --- a/lustre/snapfs/utils/snapctl.c +++ b/lustre/snapfs/utils/snapctl.c @@ -279,6 +279,49 @@ int snap_snap_list(int argc, char **argv) } return rc; } +int snap_snap_del(int argc, char **argv) +{ + int rc = 0, i; + + if (argc != 3 && argc !=2) { + fprintf(stderr, "The argument count is not right \n"); + return CMD_HELP; + } + + if (open_device_table.count == 0) { + fprintf(stderr, "Please open a snapdevice first\n"); + return (-EINVAL); + } + for (i = 0; i < open_device_table.count; i++) { + struct ioc_snap_tbl_data *snap_ioc_data; + + IOC_INIT(snap_ioc_data); + + snap_ioc_data->count = 1; + snap_ioc_data->dev = open_device_table.device[i].dev; + + if (argc == 3) { + snap_ioc_data->no = atoi(argv[1]); + memcpy(snap_ioc_data->snaps[0].name, + argv[2], strlen(argv[2])); + } else { + snap_ioc_data->no = 0; + memcpy(snap_ioc_data->snaps[0].name, + argv[1], strlen(argv[1])); + } + snap_ioc_data->snaps[0].time = time(NULL); + + IOC_PACK(sizeof(struct ioc_snap_tbl_data) + sizeof(struct snap)); + + if ((rc = ioctl(open_device_table.device[i].fd, + IOC_SNAP_DELETE, buf))) { + fprintf(stderr, "del %s failed \n", argv[1]); + } else { + fprintf(stderr, "del %s success\n", argv[1]); + } + } + return rc; +} int snap_snap_add(int argc, char **argv) { int rc = 0, i; diff --git a/lustre/snapfs/utils/snapctl.h b/lustre/snapfs/utils/snapctl.h index fe9eb5d043..6640b4a598 100644 --- a/lustre/snapfs/utils/snapctl.h +++ b/lustre/snapfs/utils/snapctl.h @@ -19,4 +19,5 @@ extern void init_snap_list(void); extern int snap_dev_open(int argc, char **argv); extern int snap_dev_list(int argc, char **argv); extern int snap_snap_add(int argc, char **argv); +extern int snap_snap_del(int argc, char **argv); extern int snap_snap_list(int argc, char **argv); -- GitLab