Revert "Bluetooth: Store advertising handle so it can be re-enabled"
[platform/kernel/linux-rpi.git] / fs / gfs2 / inode.c
index a21ac41..4e63fbb 100644 (file)
@@ -276,10 +276,16 @@ struct inode *gfs2_lookup_simple(struct inode *dip, const char *name)
         * gfs2_lookup_simple callers expect ENOENT
         * and do not check for NULL.
         */
-       if (inode == NULL)
-               return ERR_PTR(-ENOENT);
-       else
-               return inode;
+       if (IS_ERR_OR_NULL(inode))
+               return inode ? inode : ERR_PTR(-ENOENT);
+
+       /*
+        * Must not call back into the filesystem when allocating
+        * pages in the metadata inode's address space.
+        */
+       mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
+
+       return inode;
 }
 
 
@@ -1860,16 +1866,24 @@ out:
 int gfs2_permission(struct mnt_idmap *idmap, struct inode *inode,
                    int mask)
 {
+       int may_not_block = mask & MAY_NOT_BLOCK;
        struct gfs2_inode *ip;
        struct gfs2_holder i_gh;
+       struct gfs2_glock *gl;
        int error;
 
        gfs2_holder_mark_uninitialized(&i_gh);
        ip = GFS2_I(inode);
-       if (gfs2_glock_is_locked_by_me(ip->i_gl) == NULL) {
-               if (mask & MAY_NOT_BLOCK)
+       gl = rcu_dereference_check(ip->i_gl, !may_not_block);
+       if (unlikely(!gl)) {
+               /* inode is getting torn down, must be RCU mode */
+               WARN_ON_ONCE(!may_not_block);
+               return -ECHILD;
+        }
+       if (gfs2_glock_is_locked_by_me(gl) == NULL) {
+               if (may_not_block)
                        return -ECHILD;
-               error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
+               error = gfs2_glock_nq_init(gl, LM_ST_SHARED, LM_FLAG_ANY, &i_gh);
                if (error)
                        return error;
        }