Whamcloud - gitweb
LU-4416 osd: using set_nlink to calm down WARN_ON message
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index 0c5a07d..b656a79 100644 (file)
@@ -2809,17 +2809,15 @@ static int osd_object_ref_add(const struct lu_env *env,
         * This also has to properly handle the case of inodes with nlink == 0
         * in case they are being linked into the PENDING directory
         */
         * This also has to properly handle the case of inodes with nlink == 0
         * in case they are being linked into the PENDING directory
         */
-#ifdef I_LINKABLE
-       /* This is necessary to increment from i_nlink == 0 */
-       spin_lock(&inode->i_lock);
-       inode->i_state |= I_LINKABLE;
-       spin_unlock(&inode->i_lock);
-#endif
-
        spin_lock(&obj->oo_guard);
        spin_lock(&obj->oo_guard);
-       ldiskfs_inc_count(oh->ot_handle, inode);
-       if (!S_ISDIR(inode->i_mode))
-               LASSERT(inode->i_nlink <= LDISKFS_LINK_MAX);
+       if (unlikely(inode->i_nlink == 0))
+               /* inc_nlink from 0 may cause WARN_ON */
+               set_nlink(inode, 1);
+       else {
+               ldiskfs_inc_count(oh->ot_handle, inode);
+               if (!S_ISDIR(inode->i_mode))
+                       LASSERT(inode->i_nlink <= LDISKFS_LINK_MAX);
+       }
        spin_unlock(&obj->oo_guard);
 
        ll_dirty_inode(inode, I_DIRTY_DATASYNC);
        spin_unlock(&obj->oo_guard);
 
        ll_dirty_inode(inode, I_DIRTY_DATASYNC);