From 36504627419ae94d5c429ed5af5b970150f766c3 Mon Sep 17 00:00:00 2001 From: Evgeniy Polyakov Date: Tue, 6 Mar 2012 14:18:54 +0400 Subject: [PATCH] Made file/dir operations synchronous and locked --- fs/pohmelfs/dir.c | 54 +++++++++++++++++++++++++++-------------------------- fs/pohmelfs/file.c | 2 +- fs/pohmelfs/super.c | 2 +- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/fs/pohmelfs/dir.c b/fs/pohmelfs/dir.c index 350e629137b..0fe1235212b 100644 --- a/fs/pohmelfs/dir.c +++ b/fs/pohmelfs/dir.c @@ -331,7 +331,7 @@ static int pohmelfs_create(struct inode *dir, struct dentry *dentry, umode_t mod pohmelfs_http_compat_id(pi); pohmelfs_inode_dirty(parent, pi); - err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 0); + err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 1); if (err) goto err_out_exit; @@ -369,7 +369,7 @@ static struct pohmelfs_inode *pohmelfs_lookup_group(struct inode *dir, struct de req.group_id = group_id; req.sync = 1; - req.cflags = DNET_FLAGS_NOLOCK; + req.cflags = 0; err = pohmelfs_send_script_request(parent, &req); if (err) @@ -432,7 +432,7 @@ static int pohmelfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode pohmelfs_http_compat_id(pi); pohmelfs_inode_dirty(parent, pi); - err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 0); + err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 1); if (err) goto err_out_dir; @@ -468,7 +468,7 @@ static int pohmelfs_unlink(struct inode *dir, struct dentry *dentry) req.id = &parent->id; req.complete = pohmelfs_send_dentry_complete; - req.sync = 0; + req.sync = 1; err = pohmelfs_send_script_request(parent, &req); if (err) @@ -535,7 +535,7 @@ static int pohmelfs_rename(struct inode *old_dir, struct dentry *old_dentry, req.binary = r; req.binary_size = size; - req.sync = 0; + req.sync = 1; req.group_id = 0; req.id = &old_parent->id; req.complete = pohmelfs_send_dentry_complete; @@ -576,7 +576,7 @@ static int pohmelfs_symlink(struct inode *dir, struct dentry *dentry, const char if (psb->http_compat) pohmelfs_http_compat_id(pi); pohmelfs_inode_dirty(pohmelfs_inode(dir), pi); - err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 0); + err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 1); if (err) goto err_out_exit; @@ -625,7 +625,7 @@ static int pohmelfs_link(struct dentry *old_dentry, struct inode *dir, struct de req.id = &pi->id; req.complete = pohmelfs_send_dentry_complete; - req.sync = 0; + req.sync = 1; err = pohmelfs_send_script_request(parent, &req); if (err) @@ -676,7 +676,7 @@ static int pohmelfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode pohmelfs_http_compat_id(pi); pohmelfs_inode_dirty(pohmelfs_inode(dir), pi); - err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 0); + err = pohmelfs_send_dentry(pi, &pi->parent_id, dentry->d_name.name, dentry->d_name.len, 1); if (err) goto err_out_exit; @@ -931,7 +931,6 @@ static int pohmelfs_readdir_process(void *data, int size, struct file *filp, voi struct pohmelfs_inode *pi; int want_fill = 1; int err = 0; - umode_t mode; while (size > 0) { struct pohmelfs_dentry_disk *d = data; @@ -949,22 +948,18 @@ static int pohmelfs_readdir_process(void *data, int size, struct file *filp, voi if (want_fill) { err = filldir(dirent, d->name, d->len, filp->f_pos, le64_to_cpu(d->ino), d->type); if (err) - want_fill = 0; - filp->f_pos++; + break; + filp->f_pos += 1; } - mode = d->type; - mode <<= 12; - - +#if 0 pi = pohmelfs_sb_inode_lookup(psb, &d->id); if (!pi) { pohmelfs_fetch_inode_info(pohmelfs_inode(dir), d); } else { iput(&pi->vfs_inode); } - - filp->f_pos += 1; +#endif size -= sizeof(struct pohmelfs_dentry_disk) + d->len; data += sizeof(struct pohmelfs_dentry_disk) + d->len; } @@ -978,7 +973,7 @@ struct pohmelfs_readdir { int fpos; }; -static int pohmelfs_readdir_group(int group_id, struct file *filp, void *dirent, filldir_t filldir) +static void *pohmelfs_readdir_group(int group_id, struct file *filp, int *sizep) { struct dentry *dentry = filp->f_path.dentry; struct inode *dir = dentry->d_inode; @@ -1007,7 +1002,7 @@ static int pohmelfs_readdir_group(int group_id, struct file *filp, void *dirent, req.id = &parent->id; req.complete = pohmelfs_readdir_complete; - req.cflags = DNET_FLAGS_NOLOCK; + req.cflags = 0; req.group_id = group_id; req.sync = 1; @@ -1023,12 +1018,11 @@ static int pohmelfs_readdir_group(int group_id, struct file *filp, void *dirent, goto err_out_exit; } - err = pohmelfs_readdir_process(data + sizeof(struct dnet_attr), size - sizeof(struct dnet_attr), filp, dirent, filldir); - - kfree(data); + *sizep = size; + return data; err_out_exit: - return err; + return ERR_PTR(err); } static int pohmelfs_dir_open(struct inode *dir, struct file *filp) @@ -1076,12 +1070,20 @@ static int pohmelfs_readdir(struct file *filp, void *dirent, filldir_t filldir) } for (i = 0; i < psb->group_num; ++i) { - err = pohmelfs_readdir_group(psb->groups[i], filp, dirent, filldir); - if (err) + int size; + void *data; + + data = pohmelfs_readdir_group(psb->groups[i], filp, &size); + if (IS_ERR(data)) { + err = PTR_ERR(data); continue; + } pi->update = get_seconds(); - return 0; + err = pohmelfs_readdir_process(data + sizeof(struct dnet_attr), size - sizeof(struct dnet_attr), filp, dirent, filldir); + kfree(data); + + break; } return err; diff --git a/fs/pohmelfs/file.c b/fs/pohmelfs/file.c index 9b42071b305..c4315438be8 100644 --- a/fs/pohmelfs/file.c +++ b/fs/pohmelfs/file.c @@ -362,7 +362,7 @@ static int pohmelfs_read_latest_group(struct pohmelfs_inode *pi, struct pohmelfs req.id = &pi->id; req.group_id = group_id; req.sync = 1; - req.cflags = DNET_FLAGS_NOLOCK; + req.cflags = 0; req.complete = pohmelfs_read_latest_complete; return pohmelfs_send_script_request(pi, &req); diff --git a/fs/pohmelfs/super.c b/fs/pohmelfs/super.c index 372284d9bd9..959c2e69fc9 100644 --- a/fs/pohmelfs/super.c +++ b/fs/pohmelfs/super.c @@ -325,7 +325,7 @@ static int pohmelfs_write_inode(struct inode *inode, struct writeback_control *w struct pohmelfs_inode_info_binary_package *bin; struct pohmelfs_sb *psb = pohmelfs_sb(inode->i_sb); struct pohmelfs_io *pio; - int sync = 0; + int sync = 1; long ret; int err; -- 2.11.4.GIT