Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 35486
b: refs/heads/master
c: 379dfe9
h: refs/heads/master
v: v3
  • Loading branch information
Mark Fasheh committed Sep 24, 2006
1 parent 64cdbd0 commit f604691
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 42 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 80c05846f604bab6d61e9732c262420ee9f5f358
refs/heads/master: 379dfe9d0db99ed33fb089fcb9c07f5f92566e9e
5 changes: 4 additions & 1 deletion trunk/fs/ocfs2/cluster/tcp_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,14 @@
* locking semantics of the file system using the protocol. It should
* be somewhere else, I'm sure, but right now it isn't.
*
* New in version 3:
* - Replace dentry votes with a cluster lock
*
* New in version 2:
* - full 64 bit i_size in the metadata lock lvbs
* - introduction of "rw" lock and pushing meta/data locking down
*/
#define O2NET_PROTOCOL_VERSION 2ULL
#define O2NET_PROTOCOL_VERSION 3ULL
struct o2net_handshake {
__be64 protocol_version;
__be64 connector_id;
Expand Down
4 changes: 4 additions & 0 deletions trunk/fs/ocfs2/export.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

#include "dir.h"
#include "dlmglue.h"
#include "dcache.h"
#include "export.h"
#include "inode.h"

Expand Down Expand Up @@ -77,6 +78,7 @@ static struct dentry *ocfs2_get_dentry(struct super_block *sb, void *vobjp)
mlog_errno(-ENOMEM);
return ERR_PTR(-ENOMEM);
}
result->d_op = &ocfs2_dentry_ops;

mlog_exit_ptr(result);
return result;
Expand Down Expand Up @@ -127,6 +129,8 @@ static struct dentry *ocfs2_get_parent(struct dentry *child)
parent = ERR_PTR(-ENOMEM);
}

parent->d_op = &ocfs2_dentry_ops;

bail_unlock:
ocfs2_meta_unlock(dir, 0);

Expand Down
10 changes: 4 additions & 6 deletions trunk/fs/ocfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1025,12 +1025,10 @@ void ocfs2_drop_inode(struct inode *inode)
/* Testing ip_orphaned_slot here wouldn't work because we may
* not have gotten a delete_inode vote from any other nodes
* yet. */
if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED) {
mlog(0, "Inode was orphaned on another node, clearing nlink.\n");
inode->i_nlink = 0;
}

generic_drop_inode(inode);
if (oi->ip_flags & OCFS2_INODE_MAYBE_ORPHANED)
generic_delete_inode(inode);
else
generic_drop_inode(inode);

mlog_exit_void();
}
Expand Down
116 changes: 82 additions & 34 deletions trunk/fs/ocfs2/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,32 @@ static struct dentry *ocfs2_lookup(struct inode *dir, struct dentry *dentry,
spin_unlock(&oi->ip_lock);

bail_add:

dentry->d_op = &ocfs2_dentry_ops;
ret = d_splice_alias(inode, dentry);

if (inode) {
/*
* If d_splice_alias() finds a DCACHE_DISCONNECTED
* dentry, it will d_move() it on top of ourse. The
* return value will indicate this however, so in
* those cases, we switch them around for the locking
* code.
*
* NOTE: This dentry already has ->d_op set from
* ocfs2_get_parent() and ocfs2_get_dentry()
*/
if (ret)
dentry = ret;

status = ocfs2_dentry_attach_lock(dentry, inode,
OCFS2_I(dir)->ip_blkno, 0);
if (status) {
mlog_errno(status);
ret = ERR_PTR(status);
goto bail_unlock;
}
}

bail_unlock:
/* Don't drop the cluster lock until *after* the d_add --
* unlink on another node will message us to remove that
Expand Down Expand Up @@ -418,6 +440,13 @@ static int ocfs2_mknod(struct inode *dir,
goto leave;
}

status = ocfs2_dentry_attach_lock(dentry, inode,
OCFS2_I(dir)->ip_blkno, 1);
if (status) {
mlog_errno(status);
goto leave;
}

insert_inode_hash(inode);
dentry->d_op = &ocfs2_dentry_ops;
d_instantiate(dentry, inode);
Expand Down Expand Up @@ -725,6 +754,13 @@ static int ocfs2_link(struct dentry *old_dentry,
goto bail;
}

err = ocfs2_dentry_attach_lock(dentry, inode, OCFS2_I(dir)->ip_blkno,
0);
if (err) {
mlog_errno(err);
goto bail;
}

atomic_inc(&inode->i_count);
dentry->d_op = &ocfs2_dentry_ops;
d_instantiate(dentry, inode);
Expand All @@ -743,6 +779,23 @@ static int ocfs2_link(struct dentry *old_dentry,
return err;
}

/*
* Takes and drops an exclusive lock on the given dentry. This will
* force other nodes to drop it.
*/
static int ocfs2_remote_dentry_delete(struct dentry *dentry)
{
int ret;

ret = ocfs2_dentry_lock(dentry, 1);
if (ret)
mlog_errno(ret);
else
ocfs2_dentry_unlock(dentry, 1);

return ret;
}

static int ocfs2_unlink(struct inode *dir,
struct dentry *dentry)
{
Expand Down Expand Up @@ -832,8 +885,7 @@ static int ocfs2_unlink(struct inode *dir,
else
inode->i_nlink--;

status = ocfs2_request_unlink_vote(inode, dentry,
(unsigned int) inode->i_nlink);
status = ocfs2_remote_dentry_delete(dentry);
if (status < 0) {
/* This vote should succeed under all normal
* circumstances. */
Expand Down Expand Up @@ -1019,7 +1071,6 @@ static int ocfs2_rename(struct inode *old_dir,
struct buffer_head *old_inode_de_bh = NULL; // if old_dentry is a dir,
// this is the 1st dirent bh
nlink_t old_dir_nlink = old_dir->i_nlink, new_dir_nlink = new_dir->i_nlink;
unsigned int links_count;

/* At some point it might be nice to break this function up a
* bit. */
Expand Down Expand Up @@ -1093,23 +1144,26 @@ static int ocfs2_rename(struct inode *old_dir,
}
}

if (S_ISDIR(old_inode->i_mode)) {
/* Directories actually require metadata updates to
* the directory info so we can't get away with not
* doing node locking on it. */
status = ocfs2_meta_lock(old_inode, handle, NULL, 1);
if (status < 0) {
if (status != -ENOENT)
mlog_errno(status);
goto bail;
}

status = ocfs2_request_rename_vote(old_inode, old_dentry);
if (status < 0) {
/*
* Though we don't require an inode meta data update if
* old_inode is not a directory, we lock anyway here to ensure
* the vote thread on other nodes won't have to concurrently
* downconvert the inode and the dentry locks.
*/
status = ocfs2_meta_lock(old_inode, handle, NULL, 1);
if (status < 0) {
if (status != -ENOENT)
mlog_errno(status);
goto bail;
}
goto bail;
}

status = ocfs2_remote_dentry_delete(old_dentry);
if (status < 0) {
mlog_errno(status);
goto bail;
}

if (S_ISDIR(old_inode->i_mode)) {
status = -EIO;
old_inode_de_bh = ocfs2_bread(old_inode, 0, &status, 0);
if (!old_inode_de_bh)
Expand All @@ -1123,14 +1177,6 @@ static int ocfs2_rename(struct inode *old_dir,
if (!new_inode && new_dir!=old_dir &&
new_dir->i_nlink >= OCFS2_LINK_MAX)
goto bail;
} else {
/* Ah, the simple case - we're a file so just send a
* message. */
status = ocfs2_request_rename_vote(old_inode, old_dentry);
if (status < 0) {
mlog_errno(status);
goto bail;
}
}

status = -ENOENT;
Expand Down Expand Up @@ -1202,13 +1248,7 @@ static int ocfs2_rename(struct inode *old_dir,
goto bail;
}

if (S_ISDIR(new_inode->i_mode))
links_count = 0;
else
links_count = (unsigned int) (new_inode->i_nlink - 1);

status = ocfs2_request_unlink_vote(new_inode, new_dentry,
links_count);
status = ocfs2_remote_dentry_delete(new_dentry);
if (status < 0) {
mlog_errno(status);
goto bail;
Expand Down Expand Up @@ -1387,6 +1427,7 @@ static int ocfs2_rename(struct inode *old_dir,
}
}

ocfs2_dentry_move(old_dentry, new_dentry, old_dir, new_dir);
status = 0;
bail:
if (rename_lock)
Expand Down Expand Up @@ -1675,6 +1716,13 @@ static int ocfs2_symlink(struct inode *dir,
goto bail;
}

status = ocfs2_dentry_attach_lock(dentry, inode,
OCFS2_I(dir)->ip_blkno, 1);
if (status) {
mlog_errno(status);
goto bail;
}

insert_inode_hash(inode);
dentry->d_op = &ocfs2_dentry_ops;
d_instantiate(dentry, inode);
Expand Down

0 comments on commit f604691

Please sign in to comment.