From 47b26d78887f589dbc1d0618fd5c9d6d19a33c04 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Thu, 13 Jul 2017 10:42:10 -0700 Subject: [PATCH] scoutfs: add end to _item_delete Add the end argument to scoutfs_item_delete() to limit how many items it will read into the cache. Signed-off-by: Zach Brown --- kmod/src/data.c | 6 +++--- kmod/src/dir.c | 4 ++-- kmod/src/inode.c | 8 ++++---- kmod/src/item.c | 15 ++++----------- kmod/src/item.h | 3 ++- kmod/src/xattr.c | 2 +- 6 files changed, 16 insertions(+), 22 deletions(-) diff --git a/kmod/src/data.c b/kmod/src/data.c index ca437490..cc6ef98f 100644 --- a/kmod/src/data.c +++ b/kmod/src/data.c @@ -351,16 +351,16 @@ static int modify_items(struct super_block *sb, struct native_extent *ext, init_extent_key(&key, key_bytes, ext, arg, type); ret = create ? scoutfs_item_create(sb, &key, NULL) : - scoutfs_item_delete(sb, &key); + scoutfs_item_delete(sb, &key, NULL); if (ret == 0 && type == SCOUTFS_FREE_EXTENT_BLKNO_TYPE) { init_extent_key(&key, key_bytes, ext, arg, SCOUTFS_FREE_EXTENT_BLOCKS_TYPE); ret = create ? scoutfs_item_create(sb, &key, NULL) : - scoutfs_item_delete(sb, &key); + scoutfs_item_delete(sb, &key, NULL); if (ret) { init_extent_key(&key, key_bytes, ext, arg, type); - err = create ? scoutfs_item_delete(sb, &key) : + err = create ? scoutfs_item_delete(sb, &key, NULL) : scoutfs_item_create(sb, &key, NULL); BUG_ON(err); } diff --git a/kmod/src/dir.c b/kmod/src/dir.c index eab2afe7..1266b67b 100644 --- a/kmod/src/dir.c +++ b/kmod/src/dir.c @@ -443,7 +443,7 @@ static int add_entry_items(struct inode *dir, struct dentry *dentry, ret = 0; out: while (ret < 0 && --del >= 0) { - err = scoutfs_item_delete(sb, del_keys[del]); + err = scoutfs_item_delete(sb, del_keys[del], NULL); /* can always delete dirty while holding */ BUG_ON(err); } @@ -692,7 +692,7 @@ static int symlink_item_ops(struct super_block *sb, int op, u64 ino, ret = scoutfs_item_lookup_exact(sb, &key, val, bytes, NULL); else if (op == SYM_DELETE) - ret = scoutfs_item_delete(sb, &key); + ret = scoutfs_item_delete(sb, &key, NULL); if (ret) break; diff --git a/kmod/src/inode.c b/kmod/src/inode.c index 57d5e23d..ac877938 100644 --- a/kmod/src/inode.c +++ b/kmod/src/inode.c @@ -498,9 +498,9 @@ static int update_index(struct inode *inode, u8 type, u64 now_major, del_ikey.ino = cpu_to_be64(scoutfs_ino(inode)); scoutfs_key_init(&del, &del_ikey, sizeof(del_ikey)); - ret = scoutfs_item_delete(sb, &del); + ret = scoutfs_item_delete(sb, &del, NULL); if (ret) { - err = scoutfs_item_delete(sb, &ins); + err = scoutfs_item_delete(sb, &ins, NULL); BUG_ON(err); } @@ -775,7 +775,7 @@ static int remove_orphan_item(struct super_block *sb, u64 ino) init_orphan_key(&key, &okey, sbi->node_id, ino); - ret = scoutfs_item_delete(sb, &key); + ret = scoutfs_item_delete(sb, &key, NULL); if (ret == -ENOENT) ret = 0; @@ -811,7 +811,7 @@ static int __delete_inode(struct super_block *sb, struct scoutfs_key_buf *key, goto out; #endif - ret = scoutfs_item_delete(sb, key); + ret = scoutfs_item_delete(sb, key, NULL); if (ret) goto out; diff --git a/kmod/src/item.c b/kmod/src/item.c index 8824c945..e91a6dd3 100644 --- a/kmod/src/item.c +++ b/kmod/src/item.c @@ -1353,11 +1353,11 @@ out: * there are any ways for userspace to overwhelm the system with * deletion items for items that didn't exist in the first place. */ -int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key) +int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key, + struct scoutfs_key_buf *end) { struct scoutfs_sb_info *sbi = SCOUTFS_SB(sb); struct item_cache *cac = sbi->item_cache; - struct scoutfs_key_buf *end; struct cached_item *item; SCOUTFS_DECLARE_KVEC(del_val); unsigned long flags; @@ -1365,12 +1365,6 @@ int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key) scoutfs_kvec_init_null(del_val); - end = scoutfs_key_alloc(sb, SCOUTFS_MAX_KEY_SIZE); - if (!end) { - ret = -ENOMEM; - goto out; - } - do { spin_lock_irqsave(&cac->lock, flags); @@ -1378,7 +1372,7 @@ int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key) if (item) { become_deletion_item(sb, cac, item, del_val); ret = 0; - } else if (check_range(sb, &cac->ranges, key, end)) { + } else if (check_range(sb, &cac->ranges, key, NULL)) { ret = -ENOENT; } else { ret = -ENODATA; @@ -1389,9 +1383,8 @@ int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key) } while (ret == -ENODATA && (ret = scoutfs_manifest_read_items(sb, key, end)) == 0); - scoutfs_key_free(sb, end); scoutfs_kvec_kfree(del_val); -out: + trace_printk("ret %d\n", ret); return ret; } diff --git a/kmod/src/item.h b/kmod/src/item.h index 33f13d35..cb50e805 100644 --- a/kmod/src/item.h +++ b/kmod/src/item.h @@ -39,7 +39,8 @@ void scoutfs_item_delete_dirty(struct super_block *sb, int scoutfs_item_delete_many(struct super_block *sb, struct scoutfs_key_buf **keys, unsigned nr, struct scoutfs_key_buf *end); -int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key); +int scoutfs_item_delete(struct super_block *sb, struct scoutfs_key_buf *key, + struct scoutfs_key_buf *end); int scoutfs_item_add_batch(struct super_block *sb, struct list_head *list, struct scoutfs_key_buf *key, struct kvec *val); diff --git a/kmod/src/xattr.c b/kmod/src/xattr.c index 9c91da3c..85d42557 100644 --- a/kmod/src/xattr.c +++ b/kmod/src/xattr.c @@ -483,7 +483,7 @@ int scoutfs_xattr_drop(struct super_block *sb, u64 ino) break; } - ret = scoutfs_item_delete(sb, key); + ret = scoutfs_item_delete(sb, key, lck->end); if (ret) break;