ocfs2: fix ocfs2 read inode data panic in ocfs2_iget
[sfrench/cifs-2.6.git] / fs / nsfs.c
index 60702d677bd4e5b11add7dce14e37967a4998355..e3bf08c5af4114b88a26f507c3679a3418ed40c5 100644 (file)
--- a/fs/nsfs.c
+++ b/fs/nsfs.c
@@ -85,13 +85,12 @@ slow:
        inode->i_fop = &ns_file_operations;
        inode->i_private = ns;
 
-       dentry = d_alloc_pseudo(mnt->mnt_sb, &empty_name);
+       dentry = d_alloc_anon(mnt->mnt_sb);
        if (!dentry) {
                iput(inode);
                return ERR_PTR(-ENOMEM);
        }
        d_instantiate(dentry, inode);
-       dentry->d_flags |= DCACHE_RCUACCESS;
        dentry->d_fsdata = (void *)ns->ops;
        d = atomic_long_cmpxchg(&ns->stashed, 0, (unsigned long)dentry);
        if (d) {
@@ -106,17 +105,16 @@ slow:
 void *ns_get_path_cb(struct path *path, ns_get_path_helper_t *ns_get_cb,
                     void *private_data)
 {
-       struct ns_common *ns;
        void *ret;
 
-again:
-       ns = ns_get_cb(private_data);
-       if (!ns)
-               return ERR_PTR(-ENOENT);
+       do {
+               struct ns_common *ns = ns_get_cb(private_data);
+               if (!ns)
+                       return ERR_PTR(-ENOENT);
+
+               ret = __ns_get_path(path, ns);
+       } while (ret == ERR_PTR(-EAGAIN));
 
-       ret = __ns_get_path(path, ns);
-       if (IS_ERR(ret) && PTR_ERR(ret) == -EAGAIN)
-               goto again;
        return ret;
 }
 
@@ -155,7 +153,7 @@ int open_related_ns(struct ns_common *ns,
        if (fd < 0)
                return fd;
 
-       while (1) {
+       do {
                struct ns_common *relative;
 
                relative = get_ns(ns);
@@ -165,10 +163,8 @@ int open_related_ns(struct ns_common *ns,
                }
 
                err = __ns_get_path(&path, relative);
-               if (IS_ERR(err) && PTR_ERR(err) == -EAGAIN)
-                       continue;
-               break;
-       }
+       } while (err == ERR_PTR(-EAGAIN));
+
        if (IS_ERR(err)) {
                put_unused_fd(fd);
                return PTR_ERR(err);