if (dentry->d_name.len > NAME_MAX)
return -ENAMETOOLONG;
-- - err = ceph_init_dentry(dentry);
-- - if (err < 0)
-- - return err;
-- -
if (flags & O_CREAT) {
err = ceph_pre_init_acls(dir, &mode, &acls);
if (err < 0)
statret = __ceph_do_getattr(inode, page,
CEPH_STAT_CAP_INLINE_DATA, !!page);
if (statret < 0) {
- __free_page(page);
+ if (page)
+ __free_page(page);
if (statret == -ENODATA) {
BUG_ON(retry_op != READ_INLINE);
goto again;
.fsync = ceph_fsync,
.lock = ceph_lock,
.flock = ceph_flock,
- .splice_read = generic_file_splice_read,
.splice_write = iter_file_splice_write,
.unlocked_ioctl = ceph_ioctl,
.compat_ioctl = ceph_ioctl,
long unsigned half_ttl = from_time + (duration * HZ / 2) / 1000;
struct inode *dir;
-- - /* only track leases on regular dentries */
-- - if (dentry->d_op != &ceph_dentry_ops)
-- - return;
-- -
spin_lock(&dentry->d_lock);
dout("update_dentry_lease %p duration %lu ms ttl %lu\n",
dentry, duration, ttl);
/* make lease_rdcache_gen match directory */
dir = d_inode(dentry->d_parent);
++ +
++ + /* only track leases on regular dentries */
++ + if (ceph_snap(dir) != CEPH_NOSNAP)
++ + goto out_unlock;
++ +
di->lease_shared_gen = ceph_inode(dir)->i_shared_gen;
if (duration == 0)
err = -ENOMEM;
goto done;
}
-- - err = ceph_init_dentry(dn);
-- - if (err < 0) {
-- - dput(dn);
-- - dput(parent);
-- - goto done;
-- - }
++ + err = 0;
} else if (d_really_is_positive(dn) &&
(ceph_ino(d_inode(dn)) != vino.ino ||
ceph_snap(d_inode(dn)) != vino.snap)) {
ceph_fill_dirfrag(d_inode(parent), rinfo->dir_dir);
}
- if (ceph_frag_is_leftmost(frag) && req->r_readdir_offset == 2) {
+ if (ceph_frag_is_leftmost(frag) && req->r_readdir_offset == 2 &&
+ !(rinfo->hash_order && req->r_path2)) {
/* note dir version at start of readdir so we can tell
* if any dentries get dropped */
req->r_dir_release_cnt = atomic64_read(&ci->i_release_count);
err = -ENOMEM;
goto out;
}
-- - ret = ceph_init_dentry(dn);
-- - if (ret < 0) {
-- - dput(dn);
-- - err = ret;
-- - goto out;
-- - }
} else if (d_really_is_positive(dn) &&
(ceph_ino(d_inode(dn)) != vino.ino ||
ceph_snap(d_inode(dn)) != vino.snap)) {
root = ERR_PTR(-ENOMEM);
goto out;
}
-- - ceph_init_dentry(root);
dout("open_root_inode success, root dentry is %p\n", root);
} else {
root = ERR_PTR(err);
err = ceph_fs_debugfs_init(fsc);
if (err < 0)
goto fail;
+ } else {
+ root = dget(fsc->sb->s_root);
}
fsc->mount_state = CEPH_MOUNT_MOUNTED;
fsc->sb = s;
s->s_op = &ceph_super_ops;
++ + s->s_d_op = &ceph_dentry_ops;
s->s_export_op = &ceph_export_ops;
s->s_time_gran = 1000; /* 1000 ns == 1 us */