aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r--fs/btrfs/super.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 8970e9a82156..a2db05594695 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -199,7 +199,7 @@ static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry,
199 btrfs_init_path(&path); 199 btrfs_init_path(&path);
200 ret = btrfs_lookup_dir_item(NULL, root, &path, dir->i_ino, name, 200 ret = btrfs_lookup_dir_item(NULL, root, &path, dir->i_ino, name,
201 namelen, 0); 201 namelen, 0);
202 if (ret) { 202 if (ret || !btrfs_match_dir_item_name(root, &path, name, namelen)) {
203 *ino = 0; 203 *ino = 0;
204 goto out; 204 goto out;
205 } 205 }
@@ -247,7 +247,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
247 int slot; 247 int slot;
248 int advance; 248 int advance;
249 unsigned char d_type = DT_UNKNOWN; 249 unsigned char d_type = DT_UNKNOWN;
250 int over; 250 int over = 0;
251 251
252 key.objectid = inode->i_ino; 252 key.objectid = inode->i_ino;
253 key.flags = 0; 253 key.flags = 0;
@@ -258,7 +258,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
258 if (ret < 0) { 258 if (ret < 0) {
259 goto err; 259 goto err;
260 } 260 }
261 advance = filp->f_pos > 0 && ret != 0; 261 advance = 0;
262 while(1) { 262 while(1) {
263 leaf = btrfs_buffer_leaf(path.nodes[0]); 263 leaf = btrfs_buffer_leaf(path.nodes[0]);
264 nritems = btrfs_header_nritems(&leaf->header); 264 nritems = btrfs_header_nritems(&leaf->header);
@@ -282,13 +282,17 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
282 break; 282 break;
283 if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_ITEM_KEY) 283 if (btrfs_disk_key_type(&item->key) != BTRFS_DIR_ITEM_KEY)
284 continue; 284 continue;
285 if (btrfs_disk_key_offset(&item->key) < filp->f_pos)
286 continue;
285 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); 287 di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
286 over = filldir(dirent, (const char *)(di + 1), 288 over = filldir(dirent, (const char *)(di + 1),
287 btrfs_dir_name_len(di), 289 btrfs_dir_name_len(di),
288 btrfs_disk_key_offset(&item->key), 290 btrfs_disk_key_offset(&item->key),
289 btrfs_dir_objectid(di), d_type); 291 btrfs_dir_objectid(di), d_type);
290 if (over) 292 if (over) {
293 filp->f_pos = btrfs_disk_key_offset(&item->key);
291 break; 294 break;
295 }
292 filp->f_pos = btrfs_disk_key_offset(&item->key) + 1; 296 filp->f_pos = btrfs_disk_key_offset(&item->key) + 1;
293 } 297 }
294 ret = 0; 298 ret = 0;
@@ -425,7 +429,6 @@ static int btrfs_add_link(struct btrfs_trans_handle *trans,
425 dentry->d_name.name, dentry->d_name.len, 429 dentry->d_name.name, dentry->d_name.len,
426 dentry->d_parent->d_inode->i_ino, 430 dentry->d_parent->d_inode->i_ino,
427 inode->i_ino, 0); 431 inode->i_ino, 0);
428 BUG_ON(ret);
429 return ret; 432 return ret;
430} 433}
431 434
@@ -466,6 +469,7 @@ static void btrfs_write_super(struct super_block *sb)
466{ 469{
467 sb->s_dirt = 0; 470 sb->s_dirt = 0;
468printk("btrfs write_super!\n"); 471printk("btrfs write_super!\n");
472 filemap_flush(sb->s_bdev->bd_inode->i_mapping);
469} 473}
470 474
471static int btrfs_sync_fs(struct super_block *sb, int wait) 475static int btrfs_sync_fs(struct super_block *sb, int wait)