aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/dir.c
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-07-31 14:27:36 -0400
committerSage Weil <sage@inktank.com>2012-08-02 12:11:19 -0400
commit5ef50c3bec20060bc114f62d6503c5d86d70bdd7 (patch)
tree0777f7c9bef358fe7778e11874a6a750e0d2ceab /fs/ceph/dir.c
parent1a9b4993b70fb1884716902774dc9025b457760d (diff)
ceph: simplify+fix atomic_open
The initial ->atomic_open op was carried over from the old intent code, which was incomplete and didn't really work. Replace it with a fresh method. In particular: * always attempt to do an atomic open+lookup, both for the create case and for lookups of existing files. * fix symlink handling by returning 1 to the VFS so that we can follow the link to its destination. This fixes a longstanding ceph bug (#2392). Signed-off-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'fs/ceph/dir.c')
-rw-r--r--fs/ceph/dir.c38
1 files changed, 0 insertions, 38 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index f391f1e75414..e5b77319c97b 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -633,44 +633,6 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
633 return dentry; 633 return dentry;
634} 634}
635 635
636int ceph_atomic_open(struct inode *dir, struct dentry *dentry,
637 struct file *file, unsigned flags, umode_t mode,
638 int *opened)
639{
640 int err;
641 struct dentry *res = NULL;
642
643 if (!(flags & O_CREAT)) {
644 if (dentry->d_name.len > NAME_MAX)
645 return -ENAMETOOLONG;
646
647 err = ceph_init_dentry(dentry);
648 if (err < 0)
649 return err;
650
651 return ceph_lookup_open(dir, dentry, file, flags, mode, opened);
652 }
653
654 if (d_unhashed(dentry)) {
655 res = ceph_lookup(dir, dentry, 0);
656 if (IS_ERR(res))
657 return PTR_ERR(res);
658
659 if (res)
660 dentry = res;
661 }
662
663 /* We don't deal with positive dentries here */
664 if (dentry->d_inode)
665 return finish_no_open(file, res);
666
667 *opened |= FILE_CREATED;
668 err = ceph_lookup_open(dir, dentry, file, flags, mode, opened);
669 dput(res);
670
671 return err;
672}
673
674/* 636/*
675 * If we do a create but get no trace back from the MDS, follow up with 637 * If we do a create but get no trace back from the MDS, follow up with
676 * a lookup (the VFS expects us to link up the provided dentry). 638 * a lookup (the VFS expects us to link up the provided dentry).