summaryrefslogtreecommitdiff
path: root/fs/coda
diff options
context:
space:
mode:
Diffstat (limited to 'fs/coda')
-rw-r--r--fs/coda/cache.c2
-rw-r--r--fs/coda/dir.c26
-rw-r--r--fs/coda/inode.c2
3 files changed, 14 insertions, 16 deletions
diff --git a/fs/coda/cache.c b/fs/coda/cache.c
index 970f0022ec52..245131296300 100644
--- a/fs/coda/cache.c
+++ b/fs/coda/cache.c
@@ -93,12 +93,14 @@ static void coda_flag_children(struct dentry *parent, int flag)
struct dentry *de;
spin_lock(&parent->d_lock);
+ rcu_read_lock();
hlist_for_each_entry(de, &parent->d_children, d_sib) {
struct inode *inode = d_inode_rcu(de);
/* don't know what to do with negative dentries */
if (inode)
coda_flag_inode(inode, flag);
}
+ rcu_read_unlock();
spin_unlock(&parent->d_lock);
}
diff --git a/fs/coda/dir.c b/fs/coda/dir.c
index c64b8cd81568..67148edfadee 100644
--- a/fs/coda/dir.c
+++ b/fs/coda/dir.c
@@ -134,7 +134,7 @@ static inline void coda_dir_drop_nlink(struct inode *dir)
/* creation routines: create, mknod, mkdir, link, symlink */
static int coda_create(struct mnt_idmap *idmap, struct inode *dir,
- struct dentry *de, umode_t mode, bool excl)
+ struct dentry *de, umode_t mode)
{
int error;
const char *name=de->d_name.name;
@@ -179,7 +179,12 @@ static struct dentry *coda_mkdir(struct mnt_idmap *idmap, struct inode *dir,
if (is_root_inode(dir) && coda_iscontrol(name, len))
return ERR_PTR(-EPERM);
- attrs.va_mode = mode;
+ /*
+ * vfs_mkdir() now passes S_IFDIR in @mode, but @mode is forwarded
+ * verbatim to userspace, which has only ever been given the permission
+ * bits. Strip the type bit until venus is known to cope with it.
+ */
+ attrs.va_mode = mode & ~S_IFDIR;
error = venus_mkdir(dir->i_sb, coda_i2f(dir),
name, len, &newfid, &attrs);
if (error)
@@ -449,8 +454,6 @@ static int coda_dentry_revalidate(struct inode *dir, const struct qstr *name,
inode = d_inode(de);
if (!inode || is_root_inode(inode))
goto out;
- if (is_bad_inode(inode))
- goto bad;
cii = ITOC(d_inode(de));
if (!(cii->c_flags & (C_PURGE | C_FLUSH)))
@@ -470,7 +473,6 @@ static int coda_dentry_revalidate(struct inode *dir, const struct qstr *name,
spin_lock(&cii->c_lock);
cii->c_flags &= ~(C_VATTR | C_PURGE | C_FLUSH);
spin_unlock(&cii->c_lock);
-bad:
return 0;
out:
return 1;
@@ -482,18 +484,12 @@ out:
*/
static int coda_dentry_delete(const struct dentry * dentry)
{
- struct inode *inode;
- struct coda_inode_info *cii;
+ struct inode *inode = d_inode(dentry);
- if (d_really_is_negative(dentry))
+ if (!inode)
return 0;
- inode = d_inode(dentry);
- if (!inode || is_bad_inode(inode))
- return 1;
-
- cii = ITOC(inode);
- if (cii->c_flags & C_PURGE)
+ if (ITOC(inode)->c_flags & C_PURGE)
return 1;
return 0;
@@ -533,7 +529,7 @@ int coda_revalidate_inode(struct inode *inode)
coda_vattr_to_iattr(inode, &attr);
if ((old_mode & S_IFMT) != (inode->i_mode & S_IFMT)) {
- pr_warn("inode %ld, fid %s changed type!\n",
+ pr_warn("inode %llu, fid %s changed type!\n",
inode->i_ino, coda_f2s(&(cii->c_fid)));
}
diff --git a/fs/coda/inode.c b/fs/coda/inode.c
index ad1654f3adf8..40b43866e6a5 100644
--- a/fs/coda/inode.c
+++ b/fs/coda/inode.c
@@ -257,7 +257,7 @@ static int coda_fill_super(struct super_block *sb, struct fs_context *fc)
goto error;
}
- pr_info("%s: rootinode is %ld dev %s\n",
+ pr_info("%s: rootinode is %llu dev %s\n",
__func__, root->i_ino, root->i_sb->s_id);
sb->s_root = d_make_root(root);
if (!sb->s_root) {