From c13bee42a13ecdb963c0d174f6b8d870179afd0f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 21 Jan 2008 21:46:13 -0800 Subject: [PATCH] vfs create() is just OP_MKNOD with rdev=0... make OP_CREATE openc (mknod+open), even tho linux won't use it (yet?) --- src/kernel/dir.c | 20 ++++++++++---------- src/mds/Server.cc | 42 +++++++++++++++--------------------------- src/mds/Server.h | 2 +- 3 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 6e2c41d029e59..f0a76a20eceea 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -249,7 +249,7 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry, ino_t ino; int found = 0; - dout(5, "dir_lookup dirinode %p dentry %p '%s'\n", dir, dentry, dentry->d_name.name); + dout(5, "dir_lookup in dir %p dentry %p '%s'\n", dir, dentry, dentry->d_name.name); path = ceph_build_dentry_path(dentry, &pathlen); if (IS_ERR(path)) return ERR_PTR(PTR_ERR(path)); @@ -312,7 +312,7 @@ static int ceph_dir_mknod(struct inode *dir, struct dentry *dentry, int mode, de int pathlen; int err; - dout(5, "dir_mknod dir %p dentry %p mode %d rdev %d\n", dir, dentry, mode, rdev); + dout(5, "dir_mknod in dir %p dentry %p mode %d rdev %d\n", dir, dentry, mode, rdev); path = ceph_build_dentry_path(dentry, &pathlen); if (IS_ERR(path)) return PTR_ERR(path); @@ -361,7 +361,7 @@ static int ceph_dir_symlink(struct inode *dir, struct dentry *dentry, const char int pathlen; int err; - dout(5, "dir_symlink dir %p dentry %p to '%s'\n", dir, dentry, dest); + dout(5, "dir_symlink in dir %p dentry %p to '%s'\n", dir, dentry, dest); path = ceph_build_dentry_path(dentry, &pathlen); if (IS_ERR(path)) return PTR_ERR(path); @@ -408,7 +408,7 @@ static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode) int pathlen; int err; - dout(5, "dir_mkdir dir %p dentry %p mode %d\n", dir, dentry, mode); + dout(5, "dir_mkdir in dir %p dentry %p mode %d\n", dir, dentry, mode); path = ceph_build_dentry_path(dentry, &pathlen); if (IS_ERR(path)) return PTR_ERR(path); @@ -459,7 +459,7 @@ static int ceph_dir_unlink(struct inode *dir, struct dentry *dentry) int err; int op = ((dentry->d_inode->i_mode & S_IFMT) == S_IFDIR) ? CEPH_MDS_OP_RMDIR:CEPH_MDS_OP_UNLINK; - dout(5, "dir_unlink/rmdir dir %p dentry %p inode %p\n", dir, dentry, inode); + dout(5, "dir_unlink/rmdir in dir %p dentry %p inode %p\n", dir, dentry, inode); path = ceph_build_dentry_path(dentry, &pathlen); if (IS_ERR(path)) return PTR_ERR(path); @@ -491,7 +491,7 @@ static int ceph_dir_rename(struct inode *old_dir, struct dentry *old_dentry, int oldpathlen, newpathlen; int err; - dout(5, "dir_newname dir %p dentry %p to dir %p dentry %p\n", + dout(5, "dir_rename in dir %p dentry %p to dir %p dentry %p\n", old_dir, old_dentry, new_dir, new_dentry); oldpath = ceph_build_dentry_path(old_dentry, &oldpathlen); if (IS_ERR(oldpath)) @@ -533,18 +533,18 @@ ceph_dir_create(struct inode *dir, struct dentry *dentry, int mode, int err; struct inode *inode; - dout(5, "create dir %p dentry %p name '%s' flags %d\n", dir, dentry, dentry->d_name.name, mode); + dout(5, "create in dir %p dentry %p name '%s' flags %d\n", dir, dentry, dentry->d_name.name, mode); pathbase = dir->i_sb->s_root->d_inode->i_ino; path = ceph_build_dentry_path(dentry, &pathlen); if (IS_ERR(path)) return PTR_ERR(path); - req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_CREATE, pathbase, path, 0, 0); + req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_MKNOD, pathbase, path, 0, 0); kfree(path); if (IS_ERR(req)) return PTR_ERR(req); rhead = req->front.iov_base; - rhead->args.open.flags = O_CREAT; - rhead->args.open.mode = mode; + rhead->args.mknod.mode = cpu_to_le32(mode); + rhead->args.mknod.rdev = 0; if ((err = ceph_mdsc_do_request(mdsc, req, &rinfo, &session)) < 0) return err; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 0ef579916da3c..053e6549e7ada 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -670,15 +670,14 @@ void Server::dispatch_client_request(MDRequest *mdr) // funky. case CEPH_MDS_OP_OPEN: - if (req->head.args.open.flags & O_CREAT) - handle_client_openc(mdr, true); - else + if ((req->head.args.open.flags & O_CREAT) == 0) { handle_client_open(mdr); - break; - + break; + } case CEPH_MDS_OP_CREATE: - handle_client_openc(mdr, false); + handle_client_openc(mdr); break; + // namespace. // no prior locks. case CEPH_MDS_OP_MKNOD: @@ -4033,11 +4032,10 @@ class C_MDS_openc_finish : public Context { MDRequest *mdr; CDentry *dn; CInode *newi; - bool should_open; version_t pv; public: - C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, bool open) : - mds(m), mdr(r), dn(d), newi(ni), should_open(open), + C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni) : + mds(m), mdr(r), dn(d), newi(ni), pv(d->get_projected_version()) {} void finish(int r) { assert(r == 0); @@ -4051,22 +4049,17 @@ public: // downgrade xlock to rdlock //mds->locker->dentry_xlock_downgrade_to_rdlock(dn, mdr); - if (should_open) { - // set/pin ref inode for open() - mdr->ref = newi; - mdr->pin(newi); + // set/pin ref inode for open() + mdr->ref = newi; + mdr->pin(newi); - // ok, do the open. - mds->server->handle_client_open(mdr); - } else { - MClientReply *reply = new MClientReply(mdr->client_request); - mds->server->reply_request(mdr, reply, newi); - } + // ok, do the open. + mds->server->handle_client_open(mdr); } }; -void Server::handle_client_openc(MDRequest *mdr, bool open) +void Server::handle_client_openc(MDRequest *mdr) { MClientRequest *req = mdr->client_request; @@ -4085,12 +4078,7 @@ void Server::handle_client_openc(MDRequest *mdr, bool open) } // pass to regular open handler. - if (open) { - handle_client_open(mdr); - } else { - MClientReply *reply = new MClientReply(req); - reply_request(mdr, reply, dn->get_dir()->get_inode()); - } + handle_client_open(mdr); return; } @@ -4107,7 +4095,7 @@ void Server::handle_client_openc(MDRequest *mdr, bool open) in->inode.version = dn->pre_dirty() - 1; // prepare finisher - C_MDS_openc_finish *fin = new C_MDS_openc_finish(mds, mdr, dn, in, open); + C_MDS_openc_finish *fin = new C_MDS_openc_finish(mds, mdr, dn, in); mdr->ls = mdlog->get_current_segment(); EUpdate *le = new EUpdate(mdlog, "openc"); le->metablob.add_client_req(req->get_reqid()); diff --git a/src/mds/Server.h b/src/mds/Server.h index 220f81d746f16..10e96870c4c3b 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -110,7 +110,7 @@ public: // open void handle_client_open(MDRequest *mdr); - void handle_client_openc(MDRequest *mdr, bool open); // O_CREAT variant. + void handle_client_openc(MDRequest *mdr); // O_CREAT variant. void handle_client_opent(MDRequest *mdr); // O_TRUNC variant. void _do_open(MDRequest *mdr, CInode *ref); -- 2.39.5