All of lore.kernel.org
 help / color / mirror / Atom feed
* [driver-core:debugfs_cleanup 32/55] fs/ocfs2/dlmglue.c:3291:30: error: void value not ignored as it ought to be
@ 2019-07-19 21:08 kbuild test robot
  0 siblings, 0 replies; only message in thread
From: kbuild test robot @ 2019-07-19 21:08 UTC (permalink / raw)


tree:   https://kernel.googlesource.com/pub/scm/linux/kernel/git/gregkh/driver-core.git debugfs_cleanup
head:   88ff756ea1e770a5a0dab006b06b969c4cda7a24
commit: f47591daba68ef329112264bfa0d0b9f904b82a3 [32/55] debugfs: remove return value of debugfs_create_u32()
config: x86_64-rhel (attached as .config)
compiler: gcc-7 (Debian 7.4.0-10) 7.4.0
reproduce:
        git checkout f47591daba68ef329112264bfa0d0b9f904b82a3
        # save the attached .config to linux build tree
        make ARCH=x86_64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp at intel.com>

All errors (new ones prefixed by >>):

   fs/ocfs2/dlmglue.c: In function 'ocfs2_dlm_init_debug':
>> fs/ocfs2/dlmglue.c:3291:30: error: void value not ignored as it ought to be
     dlm_debug->d_locking_filter = debugfs_create_u32("locking_filter",
                                 ^

vim +3291 fs/ocfs2/dlmglue.c

ccd979bdbce9fba Mark Fasheh         2005-12-15  3280  
e581595ea29c737 Greg Kroah-Hartman  2019-07-11  3281  static void ocfs2_dlm_init_debug(struct ocfs2_super *osb)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3282  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3283  	struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3284  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3285  	dlm_debug->d_locking_state = debugfs_create_file("locking_state",
ccd979bdbce9fba Mark Fasheh         2005-12-15  3286  							 S_IFREG|S_IRUSR,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3287  							 osb->osb_debug_root,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3288  							 osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3289  							 &ocfs2_dlm_debug_fops);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3290  
8056773ac4b42f3 Gang He             2019-07-11 @3291  	dlm_debug->d_locking_filter = debugfs_create_u32("locking_filter",
8056773ac4b42f3 Gang He             2019-07-11  3292  						0600,
8056773ac4b42f3 Gang He             2019-07-11  3293  						osb->osb_debug_root,
8056773ac4b42f3 Gang He             2019-07-11  3294  						&dlm_debug->d_filter_secs);
3fc0b81326f3284 Greg Kroah-Hartman  2019-01-04  3295  
3fc0b81326f3284 Greg Kroah-Hartman  2019-01-04  3296  	ocfs2_get_dlm_debug(dlm_debug);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3297  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3298  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3299  static void ocfs2_dlm_shutdown_debug(struct ocfs2_super *osb)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3300  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3301  	struct ocfs2_dlm_debug *dlm_debug = osb->osb_dlm_debug;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3302  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3303  	if (dlm_debug) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3304  		debugfs_remove(dlm_debug->d_locking_state);
8056773ac4b42f3 Gang He             2019-07-11  3305  		debugfs_remove(dlm_debug->d_locking_filter);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3306  		ocfs2_put_dlm_debug(dlm_debug);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3307  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3308  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3309  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3310  int ocfs2_dlm_init(struct ocfs2_super *osb)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3311  {
c271c5c22b0a7ca Sunil Mushran       2006-12-05  3312  	int status = 0;
4670c46ded9a182 Joel Becker         2008-02-01  3313  	struct ocfs2_cluster_connection *conn = NULL;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3314  
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3315  	if (ocfs2_mount_local(osb)) {
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3316  		osb->node_num = 0;
c271c5c22b0a7ca Sunil Mushran       2006-12-05  3317  		goto local;
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3318  	}
c271c5c22b0a7ca Sunil Mushran       2006-12-05  3319  
e581595ea29c737 Greg Kroah-Hartman  2019-07-11  3320  	ocfs2_dlm_init_debug(osb);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3321  
34d024f84345807 Mark Fasheh         2007-09-24  3322  	/* launch downconvert thread */
5afc44e2e9678c0 Joseph Qi           2015-11-05  3323  	osb->dc_task = kthread_run(ocfs2_downconvert_thread, osb, "ocfs2dc-%s",
5afc44e2e9678c0 Joseph Qi           2015-11-05  3324  			osb->uuid_str);
34d024f84345807 Mark Fasheh         2007-09-24  3325  	if (IS_ERR(osb->dc_task)) {
34d024f84345807 Mark Fasheh         2007-09-24  3326  		status = PTR_ERR(osb->dc_task);
34d024f84345807 Mark Fasheh         2007-09-24  3327  		osb->dc_task = NULL;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3328  		mlog_errno(status);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3329  		goto bail;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3330  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3331  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3332  	/* for now, uuid == domain */
9c6c877c04ce17d Joel Becker         2008-02-01  3333  	status = ocfs2_cluster_connect(osb->osb_cluster_stack,
c74a3bdd9b529d9 Goldwyn Rodrigues   2014-01-21  3334  				       osb->osb_cluster_name,
c74a3bdd9b529d9 Goldwyn Rodrigues   2014-01-21  3335  				       strlen(osb->osb_cluster_name),
9c6c877c04ce17d Joel Becker         2008-02-01  3336  				       osb->uuid_str,
4670c46ded9a182 Joel Becker         2008-02-01  3337  				       strlen(osb->uuid_str),
553b5eb91abd5f8 Joel Becker         2010-01-29  3338  				       &lproto, ocfs2_do_node_down, osb,
4670c46ded9a182 Joel Becker         2008-02-01  3339  				       &conn);
4670c46ded9a182 Joel Becker         2008-02-01  3340  	if (status) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3341  		mlog_errno(status);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3342  		goto bail;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3343  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3344  
3e8341516409d02 Goldwyn Rodrigues   2014-01-21  3345  	status = ocfs2_cluster_this_node(conn, &osb->node_num);
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3346  	if (status < 0) {
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3347  		mlog_errno(status);
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3348  		mlog(ML_ERROR,
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3349  		     "could not find this host's node number\n");
286eaa95c5c5915 Joel Becker         2008-02-01  3350  		ocfs2_cluster_disconnect(conn, 0);
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3351  		goto bail;
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3352  	}
0abd6d1803b01c7 Mark Fasheh         2008-01-29  3353  
c271c5c22b0a7ca Sunil Mushran       2006-12-05  3354  local:
ccd979bdbce9fba Mark Fasheh         2005-12-15  3355  	ocfs2_super_lock_res_init(&osb->osb_super_lockres, osb);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3356  	ocfs2_rename_lock_res_init(&osb->osb_rename_lockres, osb);
6ca497a83e592d6 wengang wang        2009-03-06  3357  	ocfs2_nfs_sync_lock_res_init(&osb->osb_nfs_sync_lockres, osb);
83273932fbefb6c Srinivas Eeda       2009-06-03  3358  	ocfs2_orphan_scan_lock_res_init(&osb->osb_orphan_scan.os_lockres, osb);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3359  
4670c46ded9a182 Joel Becker         2008-02-01  3360  	osb->cconn = conn;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3361  bail:
ccd979bdbce9fba Mark Fasheh         2005-12-15  3362  	if (status < 0) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3363  		ocfs2_dlm_shutdown_debug(osb);
34d024f84345807 Mark Fasheh         2007-09-24  3364  		if (osb->dc_task)
34d024f84345807 Mark Fasheh         2007-09-24  3365  			kthread_stop(osb->dc_task);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3366  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3367  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3368  	return status;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3369  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3370  
286eaa95c5c5915 Joel Becker         2008-02-01  3371  void ocfs2_dlm_shutdown(struct ocfs2_super *osb,
286eaa95c5c5915 Joel Becker         2008-02-01  3372  			int hangup_pending)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3373  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3374  	ocfs2_drop_osb_locks(osb);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3375  
4670c46ded9a182 Joel Becker         2008-02-01  3376  	/*
4670c46ded9a182 Joel Becker         2008-02-01  3377  	 * Now that we have dropped all locks and ocfs2_dismount_volume()
4670c46ded9a182 Joel Becker         2008-02-01  3378  	 * has disabled recovery, the DLM won't be talking to us.  It's
4670c46ded9a182 Joel Becker         2008-02-01  3379  	 * safe to tear things down before disconnecting the cluster.
4670c46ded9a182 Joel Becker         2008-02-01  3380  	 */
4670c46ded9a182 Joel Becker         2008-02-01  3381  
34d024f84345807 Mark Fasheh         2007-09-24  3382  	if (osb->dc_task) {
34d024f84345807 Mark Fasheh         2007-09-24  3383  		kthread_stop(osb->dc_task);
34d024f84345807 Mark Fasheh         2007-09-24  3384  		osb->dc_task = NULL;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3385  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3386  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3387  	ocfs2_lock_res_free(&osb->osb_super_lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3388  	ocfs2_lock_res_free(&osb->osb_rename_lockres);
6ca497a83e592d6 wengang wang        2009-03-06  3389  	ocfs2_lock_res_free(&osb->osb_nfs_sync_lockres);
83273932fbefb6c Srinivas Eeda       2009-06-03  3390  	ocfs2_lock_res_free(&osb->osb_orphan_scan.os_lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3391  
286eaa95c5c5915 Joel Becker         2008-02-01  3392  	ocfs2_cluster_disconnect(osb->cconn, hangup_pending);
4670c46ded9a182 Joel Becker         2008-02-01  3393  	osb->cconn = NULL;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3394  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3395  	ocfs2_dlm_shutdown_debug(osb);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3396  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3397  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3398  static int ocfs2_drop_lock(struct ocfs2_super *osb,
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3399  			   struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3400  {
7431cd7e8dd0e46 Joel Becker         2008-02-01  3401  	int ret;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3402  	unsigned long flags;
bd3e76105d4478a Joel Becker         2008-02-01  3403  	u32 lkm_flags = 0;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3404  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3405  	/* We didn't get anywhere near actually using this lockres. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3406  	if (!(lockres->l_flags & OCFS2_LOCK_INITIALIZED))
ccd979bdbce9fba Mark Fasheh         2005-12-15  3407  		goto out;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3408  
b80fc012e03f8f2 Mark Fasheh         2006-09-12  3409  	if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB)
bd3e76105d4478a Joel Becker         2008-02-01  3410  		lkm_flags |= DLM_LKF_VALBLK;
b80fc012e03f8f2 Mark Fasheh         2006-09-12  3411  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3412  	spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3413  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3414  	mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_FREEING),
ccd979bdbce9fba Mark Fasheh         2005-12-15  3415  			"lockres %s, flags 0x%lx\n",
ccd979bdbce9fba Mark Fasheh         2005-12-15  3416  			lockres->l_name, lockres->l_flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3417  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3418  	while (lockres->l_flags & OCFS2_LOCK_BUSY) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3419  		mlog(0, "waiting on busy lock \"%s\": flags = %lx, action = "
ccd979bdbce9fba Mark Fasheh         2005-12-15  3420  		     "%u, unlock_action = %u\n",
ccd979bdbce9fba Mark Fasheh         2005-12-15  3421  		     lockres->l_name, lockres->l_flags, lockres->l_action,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3422  		     lockres->l_unlock_action);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3423  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3424  		spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3425  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3426  		/* XXX: Today we just wait on any busy
ccd979bdbce9fba Mark Fasheh         2005-12-15  3427  		 * locks... Perhaps we need to cancel converts in the
ccd979bdbce9fba Mark Fasheh         2005-12-15  3428  		 * future? */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3429  		ocfs2_wait_on_busy_lock(lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3430  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3431  		spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3432  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3433  
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3434  	if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) {
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3435  		if (lockres->l_flags & OCFS2_LOCK_ATTACHED &&
bd3e76105d4478a Joel Becker         2008-02-01  3436  		    lockres->l_level == DLM_LOCK_EX &&
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3437  		    !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH))
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3438  			lockres->l_ops->set_lvb(lockres);
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3439  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3440  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3441  	if (lockres->l_flags & OCFS2_LOCK_BUSY)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3442  		mlog(ML_ERROR, "destroying busy lock: \"%s\"\n",
ccd979bdbce9fba Mark Fasheh         2005-12-15  3443  		     lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3444  	if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3445  		mlog(0, "destroying blocked lock: \"%s\"\n", lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3446  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3447  	if (!(lockres->l_flags & OCFS2_LOCK_ATTACHED)) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3448  		spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3449  		goto out;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3450  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3451  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3452  	lockres_clear_flags(lockres, OCFS2_LOCK_ATTACHED);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3453  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3454  	/* make sure we never get here while waiting for an ast to
ccd979bdbce9fba Mark Fasheh         2005-12-15  3455  	 * fire. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3456  	BUG_ON(lockres->l_action != OCFS2_AST_INVALID);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3457  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3458  	/* is this necessary? */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3459  	lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3460  	lockres->l_unlock_action = OCFS2_UNLOCK_DROP_LOCK;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3461  	spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3462  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3463  	mlog(0, "lock %s\n", lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3464  
a796d2862aed811 Joel Becker         2010-01-28  3465  	ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb, lkm_flags);
7431cd7e8dd0e46 Joel Becker         2008-02-01  3466  	if (ret) {
7431cd7e8dd0e46 Joel Becker         2008-02-01  3467  		ocfs2_log_dlm_error("ocfs2_dlm_unlock", ret, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3468  		mlog(ML_ERROR, "lockres flags: %lu\n", lockres->l_flags);
cf0acdcd640e946 Joel Becker         2008-01-29  3469  		ocfs2_dlm_dump_lksb(&lockres->l_lksb);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3470  		BUG();
ccd979bdbce9fba Mark Fasheh         2005-12-15  3471  	}
73ac36ea14fd18e Coly Li             2009-01-07  3472  	mlog(0, "lock %s, successful return from ocfs2_dlm_unlock\n",
ccd979bdbce9fba Mark Fasheh         2005-12-15  3473  	     lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3474  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3475  	ocfs2_wait_on_busy_lock(lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3476  out:
ccd979bdbce9fba Mark Fasheh         2005-12-15  3477  	return 0;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3478  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3479  
84d86f83f9d0e84 Jan Kara            2014-04-03  3480  static void ocfs2_process_blocked_lock(struct ocfs2_super *osb,
84d86f83f9d0e84 Jan Kara            2014-04-03  3481  				       struct ocfs2_lock_res *lockres);
84d86f83f9d0e84 Jan Kara            2014-04-03  3482  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3483  /* Mark the lockres as being dropped. It will no longer be
ccd979bdbce9fba Mark Fasheh         2005-12-15  3484   * queued if blocking, but we still may have to wait on it
34d024f84345807 Mark Fasheh         2007-09-24  3485   * being dequeued from the downconvert thread before we can consider
ccd979bdbce9fba Mark Fasheh         2005-12-15  3486   * it safe to drop.
ccd979bdbce9fba Mark Fasheh         2005-12-15  3487   *
ccd979bdbce9fba Mark Fasheh         2005-12-15  3488   * You can *not* attempt to call cluster_lock on this lockres anymore. */
84d86f83f9d0e84 Jan Kara            2014-04-03  3489  void ocfs2_mark_lockres_freeing(struct ocfs2_super *osb,
84d86f83f9d0e84 Jan Kara            2014-04-03  3490  				struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3491  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3492  	int status;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3493  	struct ocfs2_mask_waiter mw;
84d86f83f9d0e84 Jan Kara            2014-04-03  3494  	unsigned long flags, flags2;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3495  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3496  	ocfs2_init_mask_waiter(&mw);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3497  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3498  	spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3499  	lockres->l_flags |= OCFS2_LOCK_FREEING;
84d86f83f9d0e84 Jan Kara            2014-04-03  3500  	if (lockres->l_flags & OCFS2_LOCK_QUEUED && current == osb->dc_task) {
84d86f83f9d0e84 Jan Kara            2014-04-03  3501  		/*
84d86f83f9d0e84 Jan Kara            2014-04-03  3502  		 * We know the downconvert is queued but not in progress
84d86f83f9d0e84 Jan Kara            2014-04-03  3503  		 * because we are the downconvert thread and processing
84d86f83f9d0e84 Jan Kara            2014-04-03  3504  		 * different lock. So we can just remove the lock from the
84d86f83f9d0e84 Jan Kara            2014-04-03  3505  		 * queue. This is not only an optimization but also a way
84d86f83f9d0e84 Jan Kara            2014-04-03  3506  		 * to avoid the following deadlock:
84d86f83f9d0e84 Jan Kara            2014-04-03  3507  		 *   ocfs2_dentry_post_unlock()
84d86f83f9d0e84 Jan Kara            2014-04-03  3508  		 *     ocfs2_dentry_lock_put()
84d86f83f9d0e84 Jan Kara            2014-04-03  3509  		 *       ocfs2_drop_dentry_lock()
84d86f83f9d0e84 Jan Kara            2014-04-03  3510  		 *         iput()
84d86f83f9d0e84 Jan Kara            2014-04-03  3511  		 *           ocfs2_evict_inode()
84d86f83f9d0e84 Jan Kara            2014-04-03  3512  		 *             ocfs2_clear_inode()
84d86f83f9d0e84 Jan Kara            2014-04-03  3513  		 *               ocfs2_mark_lockres_freeing()
84d86f83f9d0e84 Jan Kara            2014-04-03  3514  		 *                 ... blocks waiting for OCFS2_LOCK_QUEUED
84d86f83f9d0e84 Jan Kara            2014-04-03  3515  		 *                 since we are the downconvert thread which
84d86f83f9d0e84 Jan Kara            2014-04-03  3516  		 *                 should clear the flag.
84d86f83f9d0e84 Jan Kara            2014-04-03  3517  		 */
84d86f83f9d0e84 Jan Kara            2014-04-03  3518  		spin_unlock_irqrestore(&lockres->l_lock, flags);
84d86f83f9d0e84 Jan Kara            2014-04-03  3519  		spin_lock_irqsave(&osb->dc_task_lock, flags2);
84d86f83f9d0e84 Jan Kara            2014-04-03  3520  		list_del_init(&lockres->l_blocked_list);
84d86f83f9d0e84 Jan Kara            2014-04-03  3521  		osb->blocked_lock_count--;
84d86f83f9d0e84 Jan Kara            2014-04-03  3522  		spin_unlock_irqrestore(&osb->dc_task_lock, flags2);
84d86f83f9d0e84 Jan Kara            2014-04-03  3523  		/*
84d86f83f9d0e84 Jan Kara            2014-04-03  3524  		 * Warn if we recurse into another post_unlock call.  Strictly
84d86f83f9d0e84 Jan Kara            2014-04-03  3525  		 * speaking it isn't a problem but we need to be careful if
84d86f83f9d0e84 Jan Kara            2014-04-03  3526  		 * that happens (stack overflow, deadlocks, ...) so warn if
84d86f83f9d0e84 Jan Kara            2014-04-03  3527  		 * ocfs2 grows a path for which this can happen.
84d86f83f9d0e84 Jan Kara            2014-04-03  3528  		 */
84d86f83f9d0e84 Jan Kara            2014-04-03  3529  		WARN_ON_ONCE(lockres->l_ops->post_unlock);
84d86f83f9d0e84 Jan Kara            2014-04-03  3530  		/* Since the lock is freeing we don't do much in the fn below */
84d86f83f9d0e84 Jan Kara            2014-04-03  3531  		ocfs2_process_blocked_lock(osb, lockres);
84d86f83f9d0e84 Jan Kara            2014-04-03  3532  		return;
84d86f83f9d0e84 Jan Kara            2014-04-03  3533  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3534  	while (lockres->l_flags & OCFS2_LOCK_QUEUED) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3535  		lockres_add_mask_waiter(lockres, &mw, OCFS2_LOCK_QUEUED, 0);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3536  		spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3537  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3538  		mlog(0, "Waiting on lockres %s\n", lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3539  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3540  		status = ocfs2_wait_for_mask(&mw);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3541  		if (status)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3542  			mlog_errno(status);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3543  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3544  		spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3545  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3546  	spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3547  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3548  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3549  void ocfs2_simple_drop_lockres(struct ocfs2_super *osb,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3550  			       struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3551  {
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3552  	int ret;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3553  
84d86f83f9d0e84 Jan Kara            2014-04-03  3554  	ocfs2_mark_lockres_freeing(osb, lockres);
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3555  	ret = ocfs2_drop_lock(osb, lockres);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3556  	if (ret)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3557  		mlog_errno(ret);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3558  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3559  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3560  static void ocfs2_drop_osb_locks(struct ocfs2_super *osb)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3561  {
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3562  	ocfs2_simple_drop_lockres(osb, &osb->osb_super_lockres);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3563  	ocfs2_simple_drop_lockres(osb, &osb->osb_rename_lockres);
6ca497a83e592d6 wengang wang        2009-03-06  3564  	ocfs2_simple_drop_lockres(osb, &osb->osb_nfs_sync_lockres);
83273932fbefb6c Srinivas Eeda       2009-06-03  3565  	ocfs2_simple_drop_lockres(osb, &osb->osb_orphan_scan.os_lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3566  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3567  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3568  int ocfs2_drop_inode_locks(struct inode *inode)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3569  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3570  	int status, err;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3571  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3572  	/* No need to call ocfs2_mark_lockres_freeing here -
ccd979bdbce9fba Mark Fasheh         2005-12-15  3573  	 * ocfs2_clear_inode has done it for us. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3574  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3575  	err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
500086300e6dc53 Tiger Yang          2007-03-20  3576  			      &OCFS2_I(inode)->ip_open_lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3577  	if (err < 0)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3578  		mlog_errno(err);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3579  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3580  	status = err;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3581  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3582  	err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
e63aecb651ba73d Mark Fasheh         2007-10-18  3583  			      &OCFS2_I(inode)->ip_inode_lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3584  	if (err < 0)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3585  		mlog_errno(err);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3586  	if (err < 0 && !status)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3587  		status = err;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3588  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3589  	err = ocfs2_drop_lock(OCFS2_SB(inode->i_sb),
0d5dc6c2dd7a3cd Mark Fasheh         2006-09-14  3590  			      &OCFS2_I(inode)->ip_rw_lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3591  	if (err < 0)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3592  		mlog_errno(err);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3593  	if (err < 0 && !status)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3594  		status = err;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3595  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3596  	return status;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3597  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3598  
de551246e7bc555 Joel Becker         2008-02-01  3599  static unsigned int ocfs2_prepare_downconvert(struct ocfs2_lock_res *lockres,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3600  					      int new_level)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3601  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3602  	assert_spin_locked(&lockres->l_lock);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3603  
bd3e76105d4478a Joel Becker         2008-02-01  3604  	BUG_ON(lockres->l_blocking <= DLM_LOCK_NL);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3605  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3606  	if (lockres->l_level <= new_level) {
9b915181af0a99f Sunil Mushran       2010-02-26  3607  		mlog(ML_ERROR, "lockres %s, lvl %d <= %d, blcklst %d, mask %d, "
9b915181af0a99f Sunil Mushran       2010-02-26  3608  		     "type %d, flags 0x%lx, hold %d %d, act %d %d, req %d, "
9b915181af0a99f Sunil Mushran       2010-02-26  3609  		     "block %d, pgen %d\n", lockres->l_name, lockres->l_level,
9b915181af0a99f Sunil Mushran       2010-02-26  3610  		     new_level, list_empty(&lockres->l_blocked_list),
9b915181af0a99f Sunil Mushran       2010-02-26  3611  		     list_empty(&lockres->l_mask_waiters), lockres->l_type,
9b915181af0a99f Sunil Mushran       2010-02-26  3612  		     lockres->l_flags, lockres->l_ro_holders,
9b915181af0a99f Sunil Mushran       2010-02-26  3613  		     lockres->l_ex_holders, lockres->l_action,
9b915181af0a99f Sunil Mushran       2010-02-26  3614  		     lockres->l_unlock_action, lockres->l_requested,
9b915181af0a99f Sunil Mushran       2010-02-26  3615  		     lockres->l_blocking, lockres->l_pending_gen);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3616  		BUG();
ccd979bdbce9fba Mark Fasheh         2005-12-15  3617  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3618  
9b915181af0a99f Sunil Mushran       2010-02-26  3619  	mlog(ML_BASTS, "lockres %s, level %d => %d, blocking %d\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3620  	     lockres->l_name, lockres->l_level, new_level, lockres->l_blocking);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3621  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3622  	lockres->l_action = OCFS2_AST_DOWNCONVERT;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3623  	lockres->l_requested = new_level;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3624  	lockres_or_flags(lockres, OCFS2_LOCK_BUSY);
de551246e7bc555 Joel Becker         2008-02-01  3625  	return lockres_set_pending(lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3626  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3627  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3628  static int ocfs2_downconvert_lock(struct ocfs2_super *osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3629  				  struct ocfs2_lock_res *lockres,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3630  				  int new_level,
de551246e7bc555 Joel Becker         2008-02-01  3631  				  int lvb,
de551246e7bc555 Joel Becker         2008-02-01  3632  				  unsigned int generation)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3633  {
bd3e76105d4478a Joel Becker         2008-02-01  3634  	int ret;
bd3e76105d4478a Joel Becker         2008-02-01  3635  	u32 dlm_flags = DLM_LKF_CONVERT;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3636  
9b915181af0a99f Sunil Mushran       2010-02-26  3637  	mlog(ML_BASTS, "lockres %s, level %d => %d\n", lockres->l_name,
9b915181af0a99f Sunil Mushran       2010-02-26  3638  	     lockres->l_level, new_level);
9b915181af0a99f Sunil Mushran       2010-02-26  3639  
e7ee2c089e94067 Eric Ren            2017-01-10  3640  	/*
e7ee2c089e94067 Eric Ren            2017-01-10  3641  	 * On DLM_LKF_VALBLK, fsdlm behaves differently with o2cb. It always
e7ee2c089e94067 Eric Ren            2017-01-10  3642  	 * expects DLM_LKF_VALBLK being set if the LKB has LVB, so that
e7ee2c089e94067 Eric Ren            2017-01-10  3643  	 * we can recover correctly from node failure. Otherwise, we may get
793057e1c7272a4 Ingo Molnar         2018-02-28  3644  	 * invalid LVB in LKB, but without DLM_SBF_VALNOTVALID being set.
e7ee2c089e94067 Eric Ren            2017-01-10  3645  	 */
a634644751c4623 Gang He             2018-11-02  3646  	if (ocfs2_userspace_stack(osb) &&
e7ee2c089e94067 Eric Ren            2017-01-10  3647  	    lockres->l_ops->flags & LOCK_TYPE_USES_LVB)
e7ee2c089e94067 Eric Ren            2017-01-10  3648  		lvb = 1;
e7ee2c089e94067 Eric Ren            2017-01-10  3649  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3650  	if (lvb)
bd3e76105d4478a Joel Becker         2008-02-01  3651  		dlm_flags |= DLM_LKF_VALBLK;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3652  
4670c46ded9a182 Joel Becker         2008-02-01  3653  	ret = ocfs2_dlm_lock(osb->cconn,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3654  			     new_level,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3655  			     &lockres->l_lksb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3656  			     dlm_flags,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3657  			     lockres->l_name,
a796d2862aed811 Joel Becker         2010-01-28  3658  			     OCFS2_LOCK_ID_MAX_LEN - 1);
de551246e7bc555 Joel Becker         2008-02-01  3659  	lockres_clear_pending(lockres, generation, osb);
7431cd7e8dd0e46 Joel Becker         2008-02-01  3660  	if (ret) {
7431cd7e8dd0e46 Joel Becker         2008-02-01  3661  		ocfs2_log_dlm_error("ocfs2_dlm_lock", ret, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3662  		ocfs2_recover_from_dlm_error(lockres, 1);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3663  		goto bail;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3664  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3665  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3666  	ret = 0;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3667  bail:
ccd979bdbce9fba Mark Fasheh         2005-12-15  3668  	return ret;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3669  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3670  
24ef1815e5e13e5 Joel Becker         2008-01-29  3671  /* returns 1 when the caller should unlock and call ocfs2_dlm_unlock */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3672  static int ocfs2_prepare_cancel_convert(struct ocfs2_super *osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3673  				        struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3674  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3675  	assert_spin_locked(&lockres->l_lock);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3676  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3677  	if (lockres->l_unlock_action == OCFS2_UNLOCK_CANCEL_CONVERT) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3678  		/* If we're already trying to cancel a lock conversion
ccd979bdbce9fba Mark Fasheh         2005-12-15  3679  		 * then just drop the spinlock and allow the caller to
ccd979bdbce9fba Mark Fasheh         2005-12-15  3680  		 * requeue this lock. */
9b915181af0a99f Sunil Mushran       2010-02-26  3681  		mlog(ML_BASTS, "lockres %s, skip convert\n", lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3682  		return 0;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3683  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3684  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3685  	/* were we in a convert when we got the bast fire? */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3686  	BUG_ON(lockres->l_action != OCFS2_AST_CONVERT &&
ccd979bdbce9fba Mark Fasheh         2005-12-15  3687  	       lockres->l_action != OCFS2_AST_DOWNCONVERT);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3688  	/* set things up for the unlockast to know to just
ccd979bdbce9fba Mark Fasheh         2005-12-15  3689  	 * clear out the ast_action and unset busy, etc. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3690  	lockres->l_unlock_action = OCFS2_UNLOCK_CANCEL_CONVERT;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3691  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3692  	mlog_bug_on_msg(!(lockres->l_flags & OCFS2_LOCK_BUSY),
ccd979bdbce9fba Mark Fasheh         2005-12-15  3693  			"lock %s, invalid flags: 0x%lx\n",
ccd979bdbce9fba Mark Fasheh         2005-12-15  3694  			lockres->l_name, lockres->l_flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3695  
9b915181af0a99f Sunil Mushran       2010-02-26  3696  	mlog(ML_BASTS, "lockres %s\n", lockres->l_name);
9b915181af0a99f Sunil Mushran       2010-02-26  3697  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3698  	return 1;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3699  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3700  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3701  static int ocfs2_cancel_convert(struct ocfs2_super *osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3702  				struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3703  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3704  	int ret;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3705  
4670c46ded9a182 Joel Becker         2008-02-01  3706  	ret = ocfs2_dlm_unlock(osb->cconn, &lockres->l_lksb,
a796d2862aed811 Joel Becker         2010-01-28  3707  			       DLM_LKF_CANCEL);
7431cd7e8dd0e46 Joel Becker         2008-02-01  3708  	if (ret) {
7431cd7e8dd0e46 Joel Becker         2008-02-01  3709  		ocfs2_log_dlm_error("ocfs2_dlm_unlock", ret, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3710  		ocfs2_recover_from_dlm_error(lockres, 0);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3711  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3712  
9b915181af0a99f Sunil Mushran       2010-02-26  3713  	mlog(ML_BASTS, "lockres %s\n", lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3714  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3715  	return ret;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3716  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3717  
b5e500e23e53279 Mark Fasheh         2006-09-13  3718  static int ocfs2_unblock_lock(struct ocfs2_super *osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3719  			      struct ocfs2_lock_res *lockres,
cc567d89b3af429 Mark Fasheh         2006-09-13  3720  			      struct ocfs2_unblock_ctl *ctl)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3721  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3722  	unsigned long flags;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3723  	int blocking;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3724  	int new_level;
079b805782f94f4 Sunil Mushran       2010-02-03  3725  	int level;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3726  	int ret = 0;
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3727  	int set_lvb = 0;
de551246e7bc555 Joel Becker         2008-02-01  3728  	unsigned int gen;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3729  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3730  	spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3731  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3732  recheck:
db0f6ce69776370 Sunil Mushran       2010-02-01  3733  	/*
db0f6ce69776370 Sunil Mushran       2010-02-01  3734  	 * Is it still blocking? If not, we have no more work to do.
db0f6ce69776370 Sunil Mushran       2010-02-01  3735  	 */
db0f6ce69776370 Sunil Mushran       2010-02-01  3736  	if (!(lockres->l_flags & OCFS2_LOCK_BLOCKED)) {
db0f6ce69776370 Sunil Mushran       2010-02-01  3737  		BUG_ON(lockres->l_blocking != DLM_LOCK_NL);
db0f6ce69776370 Sunil Mushran       2010-02-01  3738  		spin_unlock_irqrestore(&lockres->l_lock, flags);
db0f6ce69776370 Sunil Mushran       2010-02-01  3739  		ret = 0;
db0f6ce69776370 Sunil Mushran       2010-02-01  3740  		goto leave;
db0f6ce69776370 Sunil Mushran       2010-02-01  3741  	}
db0f6ce69776370 Sunil Mushran       2010-02-01  3742  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3743  	if (lockres->l_flags & OCFS2_LOCK_BUSY) {
de551246e7bc555 Joel Becker         2008-02-01  3744  		/* XXX
de551246e7bc555 Joel Becker         2008-02-01  3745  		 * This is a *big* race.  The OCFS2_LOCK_PENDING flag
de551246e7bc555 Joel Becker         2008-02-01  3746  		 * exists entirely for one reason - another thread has set
de551246e7bc555 Joel Becker         2008-02-01  3747  		 * OCFS2_LOCK_BUSY, but has *NOT* yet called dlm_lock().
de551246e7bc555 Joel Becker         2008-02-01  3748  		 *
de551246e7bc555 Joel Becker         2008-02-01  3749  		 * If we do ocfs2_cancel_convert() before the other thread
de551246e7bc555 Joel Becker         2008-02-01  3750  		 * calls dlm_lock(), our cancel will do nothing.  We will
de551246e7bc555 Joel Becker         2008-02-01  3751  		 * get no ast, and we will have no way of knowing the
de551246e7bc555 Joel Becker         2008-02-01  3752  		 * cancel failed.  Meanwhile, the other thread will call
de551246e7bc555 Joel Becker         2008-02-01  3753  		 * into dlm_lock() and wait...forever.
de551246e7bc555 Joel Becker         2008-02-01  3754  		 *
de551246e7bc555 Joel Becker         2008-02-01  3755  		 * Why forever?  Because another node has asked for the
de551246e7bc555 Joel Becker         2008-02-01  3756  		 * lock first; that's why we're here in unblock_lock().
de551246e7bc555 Joel Becker         2008-02-01  3757  		 *
de551246e7bc555 Joel Becker         2008-02-01  3758  		 * The solution is OCFS2_LOCK_PENDING.  When PENDING is
de551246e7bc555 Joel Becker         2008-02-01  3759  		 * set, we just requeue the unblock.  Only when the other
de551246e7bc555 Joel Becker         2008-02-01  3760  		 * thread has called dlm_lock() and cleared PENDING will
de551246e7bc555 Joel Becker         2008-02-01  3761  		 * we then cancel their request.
de551246e7bc555 Joel Becker         2008-02-01  3762  		 *
de551246e7bc555 Joel Becker         2008-02-01  3763  		 * All callers of dlm_lock() must set OCFS2_DLM_PENDING
de551246e7bc555 Joel Becker         2008-02-01  3764  		 * at the same time they set OCFS2_DLM_BUSY.  They must
de551246e7bc555 Joel Becker         2008-02-01  3765  		 * clear OCFS2_DLM_PENDING after dlm_lock() returns.
de551246e7bc555 Joel Becker         2008-02-01  3766  		 */
9b915181af0a99f Sunil Mushran       2010-02-26  3767  		if (lockres->l_flags & OCFS2_LOCK_PENDING) {
9b915181af0a99f Sunil Mushran       2010-02-26  3768  			mlog(ML_BASTS, "lockres %s, ReQ: Pending\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3769  			     lockres->l_name);
de551246e7bc555 Joel Becker         2008-02-01  3770  			goto leave_requeue;
9b915181af0a99f Sunil Mushran       2010-02-26  3771  		}
de551246e7bc555 Joel Becker         2008-02-01  3772  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3773  		ctl->requeue = 1;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3774  		ret = ocfs2_prepare_cancel_convert(osb, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3775  		spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3776  		if (ret) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3777  			ret = ocfs2_cancel_convert(osb, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3778  			if (ret < 0)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3779  				mlog_errno(ret);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3780  		}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3781  		goto leave;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3782  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3783  
a19128260107f95 Sunil Mushran       2010-01-21  3784  	/*
a19128260107f95 Sunil Mushran       2010-01-21  3785  	 * This prevents livelocks. OCFS2_LOCK_UPCONVERT_FINISHING flag is
a19128260107f95 Sunil Mushran       2010-01-21  3786  	 * set when the ast is received for an upconvert just before the
a19128260107f95 Sunil Mushran       2010-01-21  3787  	 * OCFS2_LOCK_BUSY flag is cleared. Now if the fs received a bast
a19128260107f95 Sunil Mushran       2010-01-21  3788  	 * on the heels of the ast, we want to delay the downconvert just
a19128260107f95 Sunil Mushran       2010-01-21  3789  	 * enough to allow the up requestor to do its task. Because this
a19128260107f95 Sunil Mushran       2010-01-21  3790  	 * lock is in the blocked queue, the lock will be downconverted
a19128260107f95 Sunil Mushran       2010-01-21  3791  	 * as soon as the requestor is done with the lock.
a19128260107f95 Sunil Mushran       2010-01-21  3792  	 */
a19128260107f95 Sunil Mushran       2010-01-21  3793  	if (lockres->l_flags & OCFS2_LOCK_UPCONVERT_FINISHING)
a19128260107f95 Sunil Mushran       2010-01-21  3794  		goto leave_requeue;
a19128260107f95 Sunil Mushran       2010-01-21  3795  
0d74125a6a68d4f Sunil Mushran       2010-01-29  3796  	/*
0d74125a6a68d4f Sunil Mushran       2010-01-29  3797  	 * How can we block and yet be at NL?  We were trying to upconvert
0d74125a6a68d4f Sunil Mushran       2010-01-29  3798  	 * from NL and got canceled.  The code comes back here, and now
0d74125a6a68d4f Sunil Mushran       2010-01-29  3799  	 * we notice and clear BLOCKING.
0d74125a6a68d4f Sunil Mushran       2010-01-29  3800  	 */
0d74125a6a68d4f Sunil Mushran       2010-01-29  3801  	if (lockres->l_level == DLM_LOCK_NL) {
0d74125a6a68d4f Sunil Mushran       2010-01-29  3802  		BUG_ON(lockres->l_ex_holders || lockres->l_ro_holders);
9b915181af0a99f Sunil Mushran       2010-02-26  3803  		mlog(ML_BASTS, "lockres %s, Aborting dc\n", lockres->l_name);
0d74125a6a68d4f Sunil Mushran       2010-01-29  3804  		lockres->l_blocking = DLM_LOCK_NL;
0d74125a6a68d4f Sunil Mushran       2010-01-29  3805  		lockres_clear_flags(lockres, OCFS2_LOCK_BLOCKED);
0d74125a6a68d4f Sunil Mushran       2010-01-29  3806  		spin_unlock_irqrestore(&lockres->l_lock, flags);
0d74125a6a68d4f Sunil Mushran       2010-01-29  3807  		goto leave;
0d74125a6a68d4f Sunil Mushran       2010-01-29  3808  	}
0d74125a6a68d4f Sunil Mushran       2010-01-29  3809  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3810  	/* if we're blocking an exclusive and we have *any* holders,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3811  	 * then requeue. */
bd3e76105d4478a Joel Becker         2008-02-01  3812  	if ((lockres->l_blocking == DLM_LOCK_EX)
9b915181af0a99f Sunil Mushran       2010-02-26  3813  	    && (lockres->l_ex_holders || lockres->l_ro_holders)) {
9b915181af0a99f Sunil Mushran       2010-02-26  3814  		mlog(ML_BASTS, "lockres %s, ReQ: EX/PR Holders %u,%u\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3815  		     lockres->l_name, lockres->l_ex_holders,
9b915181af0a99f Sunil Mushran       2010-02-26  3816  		     lockres->l_ro_holders);
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3817  		goto leave_requeue;
9b915181af0a99f Sunil Mushran       2010-02-26  3818  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3819  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3820  	/* If it's a PR we're blocking, then only
ccd979bdbce9fba Mark Fasheh         2005-12-15  3821  	 * requeue if we've got any EX holders */
bd3e76105d4478a Joel Becker         2008-02-01  3822  	if (lockres->l_blocking == DLM_LOCK_PR &&
9b915181af0a99f Sunil Mushran       2010-02-26  3823  	    lockres->l_ex_holders) {
9b915181af0a99f Sunil Mushran       2010-02-26  3824  		mlog(ML_BASTS, "lockres %s, ReQ: EX Holders %u\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3825  		     lockres->l_name, lockres->l_ex_holders);
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3826  		goto leave_requeue;
9b915181af0a99f Sunil Mushran       2010-02-26  3827  	}
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3828  
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3829  	/*
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3830  	 * Can we get a lock in this state if the holder counts are
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3831  	 * zero? The meta data unblock code used to check this.
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3832  	 */
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3833  	if ((lockres->l_ops->flags & LOCK_TYPE_REQUIRES_REFRESH)
9b915181af0a99f Sunil Mushran       2010-02-26  3834  	    && (lockres->l_flags & OCFS2_LOCK_REFRESHING)) {
9b915181af0a99f Sunil Mushran       2010-02-26  3835  		mlog(ML_BASTS, "lockres %s, ReQ: Lock Refreshing\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3836  		     lockres->l_name);
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3837  		goto leave_requeue;
9b915181af0a99f Sunil Mushran       2010-02-26  3838  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3839  
16d5b9567ad5241 Mark Fasheh         2006-09-13  3840  	new_level = ocfs2_highest_compat_lock_level(lockres->l_blocking);
16d5b9567ad5241 Mark Fasheh         2006-09-13  3841  
16d5b9567ad5241 Mark Fasheh         2006-09-13  3842  	if (lockres->l_ops->check_downconvert
9b915181af0a99f Sunil Mushran       2010-02-26  3843  	    && !lockres->l_ops->check_downconvert(lockres, new_level)) {
9b915181af0a99f Sunil Mushran       2010-02-26  3844  		mlog(ML_BASTS, "lockres %s, ReQ: Checkpointing\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3845  		     lockres->l_name);
16d5b9567ad5241 Mark Fasheh         2006-09-13  3846  		goto leave_requeue;
9b915181af0a99f Sunil Mushran       2010-02-26  3847  	}
16d5b9567ad5241 Mark Fasheh         2006-09-13  3848  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3849  	/* If we get here, then we know that there are no more
ccd979bdbce9fba Mark Fasheh         2005-12-15  3850  	 * incompatible holders (and anyone asking for an incompatible
ccd979bdbce9fba Mark Fasheh         2005-12-15  3851  	 * lock is blocked). We can now downconvert the lock */
cc567d89b3af429 Mark Fasheh         2006-09-13  3852  	if (!lockres->l_ops->downconvert_worker)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3853  		goto downconvert;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3854  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3855  	/* Some lockres types want to do a bit of work before
ccd979bdbce9fba Mark Fasheh         2005-12-15  3856  	 * downconverting a lock. Allow that here. The worker function
ccd979bdbce9fba Mark Fasheh         2005-12-15  3857  	 * may sleep, so we save off a copy of what we're blocking as
ccd979bdbce9fba Mark Fasheh         2005-12-15  3858  	 * it may change while we're not holding the spin lock. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3859  	blocking = lockres->l_blocking;
079b805782f94f4 Sunil Mushran       2010-02-03  3860  	level = lockres->l_level;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3861  	spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3862  
cc567d89b3af429 Mark Fasheh         2006-09-13  3863  	ctl->unblock_action = lockres->l_ops->downconvert_worker(lockres, blocking);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3864  
9b915181af0a99f Sunil Mushran       2010-02-26  3865  	if (ctl->unblock_action == UNBLOCK_STOP_POST) {
9b915181af0a99f Sunil Mushran       2010-02-26  3866  		mlog(ML_BASTS, "lockres %s, UNBLOCK_STOP_POST\n",
9b915181af0a99f Sunil Mushran       2010-02-26  3867  		     lockres->l_name);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3868  		goto leave;
9b915181af0a99f Sunil Mushran       2010-02-26  3869  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3870  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3871  	spin_lock_irqsave(&lockres->l_lock, flags);
079b805782f94f4 Sunil Mushran       2010-02-03  3872  	if ((blocking != lockres->l_blocking) || (level != lockres->l_level)) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3873  		/* If this changed underneath us, then we can't drop
ccd979bdbce9fba Mark Fasheh         2005-12-15  3874  		 * it just yet. */
9b915181af0a99f Sunil Mushran       2010-02-26  3875  		mlog(ML_BASTS, "lockres %s, block=%d:%d, level=%d:%d, "
9b915181af0a99f Sunil Mushran       2010-02-26  3876  		     "Recheck\n", lockres->l_name, blocking,
9b915181af0a99f Sunil Mushran       2010-02-26  3877  		     lockres->l_blocking, level, lockres->l_level);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3878  		goto recheck;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3879  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3880  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3881  downconvert:
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3882  	ctl->requeue = 0;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3883  
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3884  	if (lockres->l_ops->flags & LOCK_TYPE_USES_LVB) {
bd3e76105d4478a Joel Becker         2008-02-01  3885  		if (lockres->l_level == DLM_LOCK_EX)
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3886  			set_lvb = 1;
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3887  
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3888  		/*
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3889  		 * We only set the lvb if the lock has been fully
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3890  		 * refreshed - otherwise we risk setting stale
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3891  		 * data. Otherwise, there's no need to actually clear
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3892  		 * out the lvb here as it's value is still valid.
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3893  		 */
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3894  		if (set_lvb && !(lockres->l_flags & OCFS2_LOCK_NEEDS_REFRESH))
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3895  			lockres->l_ops->set_lvb(lockres);
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3896  	}
5ef0d4ea0877409 Mark Fasheh         2006-09-13  3897  
de551246e7bc555 Joel Becker         2008-02-01  3898  	gen = ocfs2_prepare_downconvert(lockres, new_level);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3899  	spin_unlock_irqrestore(&lockres->l_lock, flags);
de551246e7bc555 Joel Becker         2008-02-01  3900  	ret = ocfs2_downconvert_lock(osb, lockres, new_level, set_lvb,
de551246e7bc555 Joel Becker         2008-02-01  3901  				     gen);
de551246e7bc555 Joel Becker         2008-02-01  3902  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3903  leave:
c1e8d35ef5ffb39 Tao Ma              2011-03-07  3904  	if (ret)
c1e8d35ef5ffb39 Tao Ma              2011-03-07  3905  		mlog_errno(ret);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3906  	return ret;
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3907  
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3908  leave_requeue:
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3909  	spin_unlock_irqrestore(&lockres->l_lock, flags);
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3910  	ctl->requeue = 1;
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3911  
f7fbfdd1fc91543 Mark Fasheh         2006-09-13  3912  	return 0;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3913  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3914  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3915  static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,
ccd979bdbce9fba Mark Fasheh         2005-12-15  3916  				     int blocking)
ccd979bdbce9fba Mark Fasheh         2005-12-15  3917  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3918  	struct inode *inode;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3919  	struct address_space *mapping;
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3920  	struct ocfs2_inode_info *oi;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3921  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3922         	inode = ocfs2_lock_res_inode(lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3923  	mapping = inode->i_mapping;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3924  
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3925  	if (S_ISDIR(inode->i_mode)) {
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3926  		oi = OCFS2_I(inode);
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3927  		oi->ip_dir_lock_gen++;
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3928  		mlog(0, "generation: %u\n", oi->ip_dir_lock_gen);
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3929  		goto out;
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3930  	}
5e98d492406818e Goldwyn Rodrigues   2010-06-28  3931  
1044e401af9a309 Mark Fasheh         2008-02-28  3932  	if (!S_ISREG(inode->i_mode))
f1f540688eae66c Mark Fasheh         2007-10-18  3933  		goto out;
f1f540688eae66c Mark Fasheh         2007-10-18  3934  
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3935  	/*
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3936  	 * We need this before the filemap_fdatawrite() so that it can
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3937  	 * transfer the dirty bit from the PTE to the
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3938  	 * page. Unfortunately this means that even for EX->PR
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3939  	 * downconverts, we'll lose our mappings and have to build
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3940  	 * them up again.
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3941  	 */
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3942  	unmap_mapping_range(mapping, 0, 0, 0);
7f4a2a97e324e8c Mark Fasheh         2006-12-11  3943  
ccd979bdbce9fba Mark Fasheh         2005-12-15  3944  	if (filemap_fdatawrite(mapping)) {
b0697053f9e8de9 Mark Fasheh         2006-03-03  3945  		mlog(ML_ERROR, "Could not sync inode %llu for downconvert!",
b0697053f9e8de9 Mark Fasheh         2006-03-03  3946  		     (unsigned long long)OCFS2_I(inode)->ip_blkno);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3947  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3948  	sync_mapping_buffers(mapping);
bd3e76105d4478a Joel Becker         2008-02-01  3949  	if (blocking == DLM_LOCK_EX) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3950  		truncate_inode_pages(mapping, 0);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3951  	} else {
ccd979bdbce9fba Mark Fasheh         2005-12-15  3952  		/* We only need to wait on the I/O if we're not also
ccd979bdbce9fba Mark Fasheh         2005-12-15  3953  		 * truncating pages because truncate_inode_pages waits
ccd979bdbce9fba Mark Fasheh         2005-12-15  3954  		 * for us above. We don't truncate pages if we're
ccd979bdbce9fba Mark Fasheh         2005-12-15  3955  		 * blocking anything < EXMODE because we want to keep
ccd979bdbce9fba Mark Fasheh         2005-12-15  3956  		 * them around in that case. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  3957  		filemap_fdatawait(mapping);
ccd979bdbce9fba Mark Fasheh         2005-12-15  3958  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  3959  
b8a7a3a6674725d Andreas Gruenbacher 2016-03-24  3960  	forget_all_cached_acls(inode);
b8a7a3a6674725d Andreas Gruenbacher 2016-03-24  3961  
f1f540688eae66c Mark Fasheh         2007-10-18  3962  out:
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3963  	return UNBLOCK_CONTINUE;
ccd979bdbce9fba Mark Fasheh         2005-12-15  3964  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  3965  
a433848132d8cdf Tao Ma              2009-08-18  3966  static int ocfs2_ci_checkpointed(struct ocfs2_caching_info *ci,
a433848132d8cdf Tao Ma              2009-08-18  3967  				 struct ocfs2_lock_res *lockres,
810d5aeba18825c Mark Fasheh         2006-09-13  3968  				 int new_level)
810d5aeba18825c Mark Fasheh         2006-09-13  3969  {
a433848132d8cdf Tao Ma              2009-08-18  3970  	int checkpointed = ocfs2_ci_fully_checkpointed(ci);
810d5aeba18825c Mark Fasheh         2006-09-13  3971  
bd3e76105d4478a Joel Becker         2008-02-01  3972  	BUG_ON(new_level != DLM_LOCK_NL && new_level != DLM_LOCK_PR);
bd3e76105d4478a Joel Becker         2008-02-01  3973  	BUG_ON(lockres->l_level != DLM_LOCK_EX && !checkpointed);
810d5aeba18825c Mark Fasheh         2006-09-13  3974  
810d5aeba18825c Mark Fasheh         2006-09-13  3975  	if (checkpointed)
810d5aeba18825c Mark Fasheh         2006-09-13  3976  		return 1;
810d5aeba18825c Mark Fasheh         2006-09-13  3977  
a433848132d8cdf Tao Ma              2009-08-18  3978  	ocfs2_start_checkpoint(OCFS2_SB(ocfs2_metadata_cache_get_super(ci)));
810d5aeba18825c Mark Fasheh         2006-09-13  3979  	return 0;
810d5aeba18825c Mark Fasheh         2006-09-13  3980  }
810d5aeba18825c Mark Fasheh         2006-09-13  3981  
a433848132d8cdf Tao Ma              2009-08-18  3982  static int ocfs2_check_meta_downconvert(struct ocfs2_lock_res *lockres,
a433848132d8cdf Tao Ma              2009-08-18  3983  					int new_level)
a433848132d8cdf Tao Ma              2009-08-18  3984  {
a433848132d8cdf Tao Ma              2009-08-18  3985  	struct inode *inode = ocfs2_lock_res_inode(lockres);
a433848132d8cdf Tao Ma              2009-08-18  3986  
a433848132d8cdf Tao Ma              2009-08-18  3987  	return ocfs2_ci_checkpointed(INODE_CACHE(inode), lockres, new_level);
a433848132d8cdf Tao Ma              2009-08-18  3988  }
a433848132d8cdf Tao Ma              2009-08-18  3989  
810d5aeba18825c Mark Fasheh         2006-09-13  3990  static void ocfs2_set_meta_lvb(struct ocfs2_lock_res *lockres)
810d5aeba18825c Mark Fasheh         2006-09-13  3991  {
810d5aeba18825c Mark Fasheh         2006-09-13  3992  	struct inode *inode = ocfs2_lock_res_inode(lockres);
810d5aeba18825c Mark Fasheh         2006-09-13  3993  
810d5aeba18825c Mark Fasheh         2006-09-13  3994  	__ocfs2_stuff_meta_lvb(inode);
810d5aeba18825c Mark Fasheh         2006-09-13  3995  }
810d5aeba18825c Mark Fasheh         2006-09-13  3996  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3997  /*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  3998   * Does the final reference drop on our dentry lock. Right now this
34d024f84345807 Mark Fasheh         2007-09-24  3999   * happens in the downconvert thread, but we could choose to simplify the
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4000   * dlmglue API and push these off to the ocfs2_wq in the future.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4001   */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4002  static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4003  				     struct ocfs2_lock_res *lockres)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4004  {
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4005  	struct ocfs2_dentry_lock *dl = ocfs2_lock_res_dl(lockres);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4006  	ocfs2_dentry_lock_put(osb, dl);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4007  }
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4008  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4009  /*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4010   * d_delete() matching dentries before the lock downconvert.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4011   *
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4012   * At this point, any process waiting to destroy the
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4013   * dentry_lock due to last ref count is stopped by the
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4014   * OCFS2_LOCK_QUEUED flag.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4015   *
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4016   * We have two potential problems
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4017   *
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4018   * 1) If we do the last reference drop on our dentry_lock (via dput)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4019   *    we'll wind up in ocfs2_release_dentry_lock(), waiting on
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4020   *    the downconvert to finish. Instead we take an elevated
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4021   *    reference and push the drop until after we've completed our
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4022   *    unblock processing.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4023   *
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4024   * 2) There might be another process with a final reference,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4025   *    waiting on us to finish processing. If this is the case, we
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4026   *    detect it and exit out - there's no more dentries anyway.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4027   */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4028  static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4029  				       int blocking)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4030  {
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4031  	struct ocfs2_dentry_lock *dl = ocfs2_lock_res_dl(lockres);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4032  	struct ocfs2_inode_info *oi = OCFS2_I(dl->dl_inode);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4033  	struct dentry *dentry;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4034  	unsigned long flags;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4035  	int extra_ref = 0;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4036  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4037  	/*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4038  	 * This node is blocking another node from getting a read
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4039  	 * lock. This happens when we've renamed within a
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4040  	 * directory. We've forced the other nodes to d_delete(), but
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4041  	 * we never actually dropped our lock because it's still
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4042  	 * valid. The downconvert code will retain a PR for this node,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4043  	 * so there's no further work to do.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4044  	 */
bd3e76105d4478a Joel Becker         2008-02-01  4045  	if (blocking == DLM_LOCK_PR)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4046  		return UNBLOCK_CONTINUE;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4047  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4048  	/*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4049  	 * Mark this inode as potentially orphaned. The code in
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4050  	 * ocfs2_delete_inode() will figure out whether it actually
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4051  	 * needs to be freed or not.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4052  	 */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4053  	spin_lock(&oi->ip_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4054  	oi->ip_flags |= OCFS2_INODE_MAYBE_ORPHANED;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4055  	spin_unlock(&oi->ip_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4056  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4057  	/*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4058  	 * Yuck. We need to make sure however that the check of
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4059  	 * OCFS2_LOCK_FREEING and the extra reference are atomic with
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4060  	 * respect to a reference decrement or the setting of that
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4061  	 * flag.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4062  	 */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4063  	spin_lock_irqsave(&lockres->l_lock, flags);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4064  	spin_lock(&dentry_attach_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4065  	if (!(lockres->l_flags & OCFS2_LOCK_FREEING)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4066  	    && dl->dl_count) {
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4067  		dl->dl_count++;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4068  		extra_ref = 1;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4069  	}
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4070  	spin_unlock(&dentry_attach_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4071  	spin_unlock_irqrestore(&lockres->l_lock, flags);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4072  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4073  	mlog(0, "extra_ref = %d\n", extra_ref);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4074  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4075  	/*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4076  	 * We have a process waiting on us in ocfs2_dentry_iput(),
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4077  	 * which means we can't have any more outstanding
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4078  	 * aliases. There's no need to do any more work.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4079  	 */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4080  	if (!extra_ref)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4081  		return UNBLOCK_CONTINUE;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4082  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4083  	spin_lock(&dentry_attach_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4084  	while (1) {
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4085  		dentry = ocfs2_find_local_alias(dl->dl_inode,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4086  						dl->dl_parent_blkno, 1);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4087  		if (!dentry)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4088  			break;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4089  		spin_unlock(&dentry_attach_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4090  
10ab88117d069a5 alex chen           2015-02-10  4091  		if (S_ISDIR(dl->dl_inode->i_mode))
10ab88117d069a5 alex chen           2015-02-10  4092  			shrink_dcache_parent(dentry);
10ab88117d069a5 alex chen           2015-02-10  4093  
a455589f181e604 Al Viro             2014-10-21  4094  		mlog(0, "d_delete(%pd);\n", dentry);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4095  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4096  		/*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4097  		 * The following dcache calls may do an
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4098  		 * iput(). Normally we don't want that from the
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4099  		 * downconverting thread, but in this case it's ok
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4100  		 * because the requesting node already has an
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4101  		 * exclusive lock on the inode, so it can't be queued
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4102  		 * for a downconvert.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4103  		 */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4104  		d_delete(dentry);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4105  		dput(dentry);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4106  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4107  		spin_lock(&dentry_attach_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4108  	}
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4109  	spin_unlock(&dentry_attach_lock);
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4110  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4111  	/*
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4112  	 * If we are the last holder of this dentry lock, there is no
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4113  	 * reason to downconvert so skip straight to the unlock.
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4114  	 */
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4115  	if (dl->dl_count == 1)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4116  		return UNBLOCK_STOP_POST;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4117  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4118  	return UNBLOCK_CONTINUE_POST;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4119  }
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4120  
8dec98edfe9684c Tao Ma              2009-08-18  4121  static int ocfs2_check_refcount_downconvert(struct ocfs2_lock_res *lockres,
8dec98edfe9684c Tao Ma              2009-08-18  4122  					    int new_level)
8dec98edfe9684c Tao Ma              2009-08-18  4123  {
8dec98edfe9684c Tao Ma              2009-08-18  4124  	struct ocfs2_refcount_tree *tree =
8dec98edfe9684c Tao Ma              2009-08-18  4125  				ocfs2_lock_res_refcount_tree(lockres);
8dec98edfe9684c Tao Ma              2009-08-18  4126  
8dec98edfe9684c Tao Ma              2009-08-18  4127  	return ocfs2_ci_checkpointed(&tree->rf_ci, lockres, new_level);
8dec98edfe9684c Tao Ma              2009-08-18  4128  }
8dec98edfe9684c Tao Ma              2009-08-18  4129  
8dec98edfe9684c Tao Ma              2009-08-18  4130  static int ocfs2_refcount_convert_worker(struct ocfs2_lock_res *lockres,
8dec98edfe9684c Tao Ma              2009-08-18  4131  					 int blocking)
8dec98edfe9684c Tao Ma              2009-08-18  4132  {
8dec98edfe9684c Tao Ma              2009-08-18  4133  	struct ocfs2_refcount_tree *tree =
8dec98edfe9684c Tao Ma              2009-08-18  4134  				ocfs2_lock_res_refcount_tree(lockres);
8dec98edfe9684c Tao Ma              2009-08-18  4135  
8dec98edfe9684c Tao Ma              2009-08-18  4136  	ocfs2_metadata_cache_purge(&tree->rf_ci);
8dec98edfe9684c Tao Ma              2009-08-18  4137  
8dec98edfe9684c Tao Ma              2009-08-18  4138  	return UNBLOCK_CONTINUE;
8dec98edfe9684c Tao Ma              2009-08-18  4139  }
8dec98edfe9684c Tao Ma              2009-08-18  4140  
9e33d69f553aaf1 Jan Kara            2008-08-25  4141  static void ocfs2_set_qinfo_lvb(struct ocfs2_lock_res *lockres)
9e33d69f553aaf1 Jan Kara            2008-08-25  4142  {
9e33d69f553aaf1 Jan Kara            2008-08-25  4143  	struct ocfs2_qinfo_lvb *lvb;
9e33d69f553aaf1 Jan Kara            2008-08-25  4144  	struct ocfs2_mem_dqinfo *oinfo = ocfs2_lock_res_qinfo(lockres);
9e33d69f553aaf1 Jan Kara            2008-08-25  4145  	struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb,
9e33d69f553aaf1 Jan Kara            2008-08-25  4146  					    oinfo->dqi_gi.dqi_type);
9e33d69f553aaf1 Jan Kara            2008-08-25  4147  
a641dc2a5a1445e Mark Fasheh         2008-12-24  4148  	lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
9e33d69f553aaf1 Jan Kara            2008-08-25  4149  	lvb->lvb_version = OCFS2_QINFO_LVB_VERSION;
9e33d69f553aaf1 Jan Kara            2008-08-25  4150  	lvb->lvb_bgrace = cpu_to_be32(info->dqi_bgrace);
9e33d69f553aaf1 Jan Kara            2008-08-25  4151  	lvb->lvb_igrace = cpu_to_be32(info->dqi_igrace);
9e33d69f553aaf1 Jan Kara            2008-08-25  4152  	lvb->lvb_syncms = cpu_to_be32(oinfo->dqi_syncms);
9e33d69f553aaf1 Jan Kara            2008-08-25  4153  	lvb->lvb_blocks = cpu_to_be32(oinfo->dqi_gi.dqi_blocks);
9e33d69f553aaf1 Jan Kara            2008-08-25  4154  	lvb->lvb_free_blk = cpu_to_be32(oinfo->dqi_gi.dqi_free_blk);
9e33d69f553aaf1 Jan Kara            2008-08-25  4155  	lvb->lvb_free_entry = cpu_to_be32(oinfo->dqi_gi.dqi_free_entry);
9e33d69f553aaf1 Jan Kara            2008-08-25  4156  }
9e33d69f553aaf1 Jan Kara            2008-08-25  4157  
9e33d69f553aaf1 Jan Kara            2008-08-25  4158  void ocfs2_qinfo_unlock(struct ocfs2_mem_dqinfo *oinfo, int ex)
9e33d69f553aaf1 Jan Kara            2008-08-25  4159  {
9e33d69f553aaf1 Jan Kara            2008-08-25  4160  	struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
9e33d69f553aaf1 Jan Kara            2008-08-25  4161  	struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb);
9e33d69f553aaf1 Jan Kara            2008-08-25  4162  	int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
9e33d69f553aaf1 Jan Kara            2008-08-25  4163  
9e33d69f553aaf1 Jan Kara            2008-08-25  4164  	if (!ocfs2_is_hard_readonly(osb) && !ocfs2_mount_local(osb))
9e33d69f553aaf1 Jan Kara            2008-08-25  4165  		ocfs2_cluster_unlock(osb, lockres, level);
9e33d69f553aaf1 Jan Kara            2008-08-25  4166  }
9e33d69f553aaf1 Jan Kara            2008-08-25  4167  
9e33d69f553aaf1 Jan Kara            2008-08-25  4168  static int ocfs2_refresh_qinfo(struct ocfs2_mem_dqinfo *oinfo)
9e33d69f553aaf1 Jan Kara            2008-08-25  4169  {
9e33d69f553aaf1 Jan Kara            2008-08-25  4170  	struct mem_dqinfo *info = sb_dqinfo(oinfo->dqi_gi.dqi_sb,
9e33d69f553aaf1 Jan Kara            2008-08-25  4171  					    oinfo->dqi_gi.dqi_type);
9e33d69f553aaf1 Jan Kara            2008-08-25  4172  	struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
9e33d69f553aaf1 Jan Kara            2008-08-25  4173  	struct ocfs2_qinfo_lvb *lvb = ocfs2_dlm_lvb(&lockres->l_lksb);
85eb8b73d66530b Joel Becker         2008-11-25  4174  	struct buffer_head *bh = NULL;
9e33d69f553aaf1 Jan Kara            2008-08-25  4175  	struct ocfs2_global_disk_dqinfo *gdinfo;
9e33d69f553aaf1 Jan Kara            2008-08-25  4176  	int status = 0;
9e33d69f553aaf1 Jan Kara            2008-08-25  4177  
1c520dfbf391e16 Joel Becker         2009-06-19  4178  	if (ocfs2_dlm_lvb_valid(&lockres->l_lksb) &&
1c520dfbf391e16 Joel Becker         2009-06-19  4179  	    lvb->lvb_version == OCFS2_QINFO_LVB_VERSION) {
9e33d69f553aaf1 Jan Kara            2008-08-25  4180  		info->dqi_bgrace = be32_to_cpu(lvb->lvb_bgrace);
9e33d69f553aaf1 Jan Kara            2008-08-25  4181  		info->dqi_igrace = be32_to_cpu(lvb->lvb_igrace);
9e33d69f553aaf1 Jan Kara            2008-08-25  4182  		oinfo->dqi_syncms = be32_to_cpu(lvb->lvb_syncms);
9e33d69f553aaf1 Jan Kara            2008-08-25  4183  		oinfo->dqi_gi.dqi_blocks = be32_to_cpu(lvb->lvb_blocks);
9e33d69f553aaf1 Jan Kara            2008-08-25  4184  		oinfo->dqi_gi.dqi_free_blk = be32_to_cpu(lvb->lvb_free_blk);
9e33d69f553aaf1 Jan Kara            2008-08-25  4185  		oinfo->dqi_gi.dqi_free_entry =
9e33d69f553aaf1 Jan Kara            2008-08-25  4186  					be32_to_cpu(lvb->lvb_free_entry);
9e33d69f553aaf1 Jan Kara            2008-08-25  4187  	} else {
ae4f6ef13417dea Jan Kara            2010-04-28  4188  		status = ocfs2_read_quota_phys_block(oinfo->dqi_gqinode,
ae4f6ef13417dea Jan Kara            2010-04-28  4189  						     oinfo->dqi_giblk, &bh);
85eb8b73d66530b Joel Becker         2008-11-25  4190  		if (status) {
9e33d69f553aaf1 Jan Kara            2008-08-25  4191  			mlog_errno(status);
9e33d69f553aaf1 Jan Kara            2008-08-25  4192  			goto bail;
9e33d69f553aaf1 Jan Kara            2008-08-25  4193  		}
9e33d69f553aaf1 Jan Kara            2008-08-25  4194  		gdinfo = (struct ocfs2_global_disk_dqinfo *)
9e33d69f553aaf1 Jan Kara            2008-08-25  4195  					(bh->b_data + OCFS2_GLOBAL_INFO_OFF);
9e33d69f553aaf1 Jan Kara            2008-08-25  4196  		info->dqi_bgrace = le32_to_cpu(gdinfo->dqi_bgrace);
9e33d69f553aaf1 Jan Kara            2008-08-25  4197  		info->dqi_igrace = le32_to_cpu(gdinfo->dqi_igrace);
9e33d69f553aaf1 Jan Kara            2008-08-25  4198  		oinfo->dqi_syncms = le32_to_cpu(gdinfo->dqi_syncms);
9e33d69f553aaf1 Jan Kara            2008-08-25  4199  		oinfo->dqi_gi.dqi_blocks = le32_to_cpu(gdinfo->dqi_blocks);
9e33d69f553aaf1 Jan Kara            2008-08-25  4200  		oinfo->dqi_gi.dqi_free_blk = le32_to_cpu(gdinfo->dqi_free_blk);
9e33d69f553aaf1 Jan Kara            2008-08-25  4201  		oinfo->dqi_gi.dqi_free_entry =
9e33d69f553aaf1 Jan Kara            2008-08-25  4202  					le32_to_cpu(gdinfo->dqi_free_entry);
9e33d69f553aaf1 Jan Kara            2008-08-25  4203  		brelse(bh);
9e33d69f553aaf1 Jan Kara            2008-08-25  4204  		ocfs2_track_lock_refresh(lockres);
9e33d69f553aaf1 Jan Kara            2008-08-25  4205  	}
9e33d69f553aaf1 Jan Kara            2008-08-25  4206  
9e33d69f553aaf1 Jan Kara            2008-08-25  4207  bail:
9e33d69f553aaf1 Jan Kara            2008-08-25  4208  	return status;
9e33d69f553aaf1 Jan Kara            2008-08-25  4209  }
9e33d69f553aaf1 Jan Kara            2008-08-25  4210  
9e33d69f553aaf1 Jan Kara            2008-08-25  4211  /* Lock quota info, this function expects at least shared lock on the quota file
9e33d69f553aaf1 Jan Kara            2008-08-25  4212   * so that we can safely refresh quota info from disk. */
9e33d69f553aaf1 Jan Kara            2008-08-25  4213  int ocfs2_qinfo_lock(struct ocfs2_mem_dqinfo *oinfo, int ex)
9e33d69f553aaf1 Jan Kara            2008-08-25  4214  {
9e33d69f553aaf1 Jan Kara            2008-08-25  4215  	struct ocfs2_lock_res *lockres = &oinfo->dqi_gqlock;
9e33d69f553aaf1 Jan Kara            2008-08-25  4216  	struct ocfs2_super *osb = OCFS2_SB(oinfo->dqi_gi.dqi_sb);
9e33d69f553aaf1 Jan Kara            2008-08-25  4217  	int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
9e33d69f553aaf1 Jan Kara            2008-08-25  4218  	int status = 0;
9e33d69f553aaf1 Jan Kara            2008-08-25  4219  
9e33d69f553aaf1 Jan Kara            2008-08-25  4220  	/* On RO devices, locking really isn't needed... */
9e33d69f553aaf1 Jan Kara            2008-08-25  4221  	if (ocfs2_is_hard_readonly(osb)) {
9e33d69f553aaf1 Jan Kara            2008-08-25  4222  		if (ex)
9e33d69f553aaf1 Jan Kara            2008-08-25  4223  			status = -EROFS;
9e33d69f553aaf1 Jan Kara            2008-08-25  4224  		goto bail;
9e33d69f553aaf1 Jan Kara            2008-08-25  4225  	}
9e33d69f553aaf1 Jan Kara            2008-08-25  4226  	if (ocfs2_mount_local(osb))
9e33d69f553aaf1 Jan Kara            2008-08-25  4227  		goto bail;
9e33d69f553aaf1 Jan Kara            2008-08-25  4228  
9e33d69f553aaf1 Jan Kara            2008-08-25  4229  	status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
9e33d69f553aaf1 Jan Kara            2008-08-25  4230  	if (status < 0) {
9e33d69f553aaf1 Jan Kara            2008-08-25  4231  		mlog_errno(status);
9e33d69f553aaf1 Jan Kara            2008-08-25  4232  		goto bail;
9e33d69f553aaf1 Jan Kara            2008-08-25  4233  	}
9e33d69f553aaf1 Jan Kara            2008-08-25  4234  	if (!ocfs2_should_refresh_lock_res(lockres))
9e33d69f553aaf1 Jan Kara            2008-08-25  4235  		goto bail;
9e33d69f553aaf1 Jan Kara            2008-08-25  4236  	/* OK, we have the lock but we need to refresh the quota info */
9e33d69f553aaf1 Jan Kara            2008-08-25  4237  	status = ocfs2_refresh_qinfo(oinfo);
9e33d69f553aaf1 Jan Kara            2008-08-25  4238  	if (status)
9e33d69f553aaf1 Jan Kara            2008-08-25  4239  		ocfs2_qinfo_unlock(oinfo, ex);
9e33d69f553aaf1 Jan Kara            2008-08-25  4240  	ocfs2_complete_lock_res_refresh(lockres, status);
9e33d69f553aaf1 Jan Kara            2008-08-25  4241  bail:
9e33d69f553aaf1 Jan Kara            2008-08-25  4242  	return status;
9e33d69f553aaf1 Jan Kara            2008-08-25  4243  }
9e33d69f553aaf1 Jan Kara            2008-08-25  4244  
8dec98edfe9684c Tao Ma              2009-08-18  4245  int ocfs2_refcount_lock(struct ocfs2_refcount_tree *ref_tree, int ex)
8dec98edfe9684c Tao Ma              2009-08-18  4246  {
8dec98edfe9684c Tao Ma              2009-08-18  4247  	int status;
8dec98edfe9684c Tao Ma              2009-08-18  4248  	int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
8dec98edfe9684c Tao Ma              2009-08-18  4249  	struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres;
8dec98edfe9684c Tao Ma              2009-08-18  4250  	struct ocfs2_super *osb = lockres->l_priv;
8dec98edfe9684c Tao Ma              2009-08-18  4251  
8dec98edfe9684c Tao Ma              2009-08-18  4252  
8dec98edfe9684c Tao Ma              2009-08-18  4253  	if (ocfs2_is_hard_readonly(osb))
8dec98edfe9684c Tao Ma              2009-08-18  4254  		return -EROFS;
8dec98edfe9684c Tao Ma              2009-08-18  4255  
8dec98edfe9684c Tao Ma              2009-08-18  4256  	if (ocfs2_mount_local(osb))
8dec98edfe9684c Tao Ma              2009-08-18  4257  		return 0;
8dec98edfe9684c Tao Ma              2009-08-18  4258  
8dec98edfe9684c Tao Ma              2009-08-18  4259  	status = ocfs2_cluster_lock(osb, lockres, level, 0, 0);
8dec98edfe9684c Tao Ma              2009-08-18  4260  	if (status < 0)
8dec98edfe9684c Tao Ma              2009-08-18  4261  		mlog_errno(status);
8dec98edfe9684c Tao Ma              2009-08-18  4262  
8dec98edfe9684c Tao Ma              2009-08-18  4263  	return status;
8dec98edfe9684c Tao Ma              2009-08-18  4264  }
8dec98edfe9684c Tao Ma              2009-08-18  4265  
8dec98edfe9684c Tao Ma              2009-08-18  4266  void ocfs2_refcount_unlock(struct ocfs2_refcount_tree *ref_tree, int ex)
8dec98edfe9684c Tao Ma              2009-08-18  4267  {
8dec98edfe9684c Tao Ma              2009-08-18  4268  	int level = ex ? DLM_LOCK_EX : DLM_LOCK_PR;
8dec98edfe9684c Tao Ma              2009-08-18  4269  	struct ocfs2_lock_res *lockres = &ref_tree->rf_lockres;
8dec98edfe9684c Tao Ma              2009-08-18  4270  	struct ocfs2_super *osb = lockres->l_priv;
8dec98edfe9684c Tao Ma              2009-08-18  4271  
8dec98edfe9684c Tao Ma              2009-08-18  4272  	if (!ocfs2_mount_local(osb))
8dec98edfe9684c Tao Ma              2009-08-18  4273  		ocfs2_cluster_unlock(osb, lockres, level);
8dec98edfe9684c Tao Ma              2009-08-18  4274  }
8dec98edfe9684c Tao Ma              2009-08-18  4275  
006000566d4e95b Adrian Bunk         2008-01-29  4276  static void ocfs2_process_blocked_lock(struct ocfs2_super *osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  4277  				       struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  4278  {
ccd979bdbce9fba Mark Fasheh         2005-12-15  4279  	int status;
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4280  	struct ocfs2_unblock_ctl ctl = {0, 0,};
ccd979bdbce9fba Mark Fasheh         2005-12-15  4281  	unsigned long flags;
ccd979bdbce9fba Mark Fasheh         2005-12-15  4282  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4283  	/* Our reference to the lockres in this function can be
ccd979bdbce9fba Mark Fasheh         2005-12-15  4284  	 * considered valid until we remove the OCFS2_LOCK_QUEUED
ccd979bdbce9fba Mark Fasheh         2005-12-15  4285  	 * flag. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  4286  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4287  	BUG_ON(!lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4288  	BUG_ON(!lockres->l_ops);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4289  
9b915181af0a99f Sunil Mushran       2010-02-26  4290  	mlog(ML_BASTS, "lockres %s blocked\n", lockres->l_name);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4291  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4292  	/* Detect whether a lock has been marked as going away while
34d024f84345807 Mark Fasheh         2007-09-24  4293  	 * the downconvert thread was processing other things. A lock can
ccd979bdbce9fba Mark Fasheh         2005-12-15  4294  	 * still be marked with OCFS2_LOCK_FREEING after this check,
ccd979bdbce9fba Mark Fasheh         2005-12-15  4295  	 * but short circuiting here will still save us some
ccd979bdbce9fba Mark Fasheh         2005-12-15  4296  	 * performance. */
ccd979bdbce9fba Mark Fasheh         2005-12-15  4297  	spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4298  	if (lockres->l_flags & OCFS2_LOCK_FREEING)
ccd979bdbce9fba Mark Fasheh         2005-12-15  4299  		goto unqueue;
ccd979bdbce9fba Mark Fasheh         2005-12-15  4300  	spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4301  
b5e500e23e53279 Mark Fasheh         2006-09-13  4302  	status = ocfs2_unblock_lock(osb, lockres, &ctl);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4303  	if (status < 0)
ccd979bdbce9fba Mark Fasheh         2005-12-15  4304  		mlog_errno(status);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4305  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4306  	spin_lock_irqsave(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4307  unqueue:
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4308  	if (lockres->l_flags & OCFS2_LOCK_FREEING || !ctl.requeue) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  4309  		lockres_clear_flags(lockres, OCFS2_LOCK_QUEUED);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4310  	} else
ccd979bdbce9fba Mark Fasheh         2005-12-15  4311  		ocfs2_schedule_blocked_lock(osb, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4312  
9b915181af0a99f Sunil Mushran       2010-02-26  4313  	mlog(ML_BASTS, "lockres %s, requeue = %s.\n", lockres->l_name,
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4314  	     ctl.requeue ? "yes" : "no");
ccd979bdbce9fba Mark Fasheh         2005-12-15  4315  	spin_unlock_irqrestore(&lockres->l_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4316  
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4317  	if (ctl.unblock_action != UNBLOCK_CONTINUE
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4318  	    && lockres->l_ops->post_unlock)
d680efe9d8fe0eb Mark Fasheh         2006-09-08  4319  		lockres->l_ops->post_unlock(osb, lockres);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4320  }
ccd979bdbce9fba Mark Fasheh         2005-12-15  4321  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4322  static void ocfs2_schedule_blocked_lock(struct ocfs2_super *osb,
ccd979bdbce9fba Mark Fasheh         2005-12-15  4323  					struct ocfs2_lock_res *lockres)
ccd979bdbce9fba Mark Fasheh         2005-12-15  4324  {
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4325  	unsigned long flags;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4326  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4327  	assert_spin_locked(&lockres->l_lock);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4328  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4329  	if (lockres->l_flags & OCFS2_LOCK_FREEING) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  4330  		/* Do not schedule a lock for downconvert when it's on
ccd979bdbce9fba Mark Fasheh         2005-12-15  4331  		 * the way to destruction - any nodes wanting access
ccd979bdbce9fba Mark Fasheh         2005-12-15  4332  		 * to the resource will get it soon. */
9b915181af0a99f Sunil Mushran       2010-02-26  4333  		mlog(ML_BASTS, "lockres %s won't be scheduled: flags 0x%lx\n",
ccd979bdbce9fba Mark Fasheh         2005-12-15  4334  		     lockres->l_name, lockres->l_flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4335  		return;
ccd979bdbce9fba Mark Fasheh         2005-12-15  4336  	}
ccd979bdbce9fba Mark Fasheh         2005-12-15  4337  
ccd979bdbce9fba Mark Fasheh         2005-12-15  4338  	lockres_or_flags(lockres, OCFS2_LOCK_QUEUED);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4339  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4340  	spin_lock_irqsave(&osb->dc_task_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4341  	if (list_empty(&lockres->l_blocked_list)) {
ccd979bdbce9fba Mark Fasheh         2005-12-15  4342  		list_add_tail(&lockres->l_blocked_list,
ccd979bdbce9fba Mark Fasheh         2005-12-15  4343  			      &osb->blocked_lock_list);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4344  		osb->blocked_lock_count++;
ccd979bdbce9fba Mark Fasheh         2005-12-15  4345  	}
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4346  	spin_unlock_irqrestore(&osb->dc_task_lock, flags);
ccd979bdbce9fba Mark Fasheh         2005-12-15  4347  }
34d024f84345807 Mark Fasheh         2007-09-24  4348  
34d024f84345807 Mark Fasheh         2007-09-24  4349  static void ocfs2_downconvert_thread_do_work(struct ocfs2_super *osb)
34d024f84345807 Mark Fasheh         2007-09-24  4350  {
34d024f84345807 Mark Fasheh         2007-09-24  4351  	unsigned long processed;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4352  	unsigned long flags;
34d024f84345807 Mark Fasheh         2007-09-24  4353  	struct ocfs2_lock_res *lockres;
34d024f84345807 Mark Fasheh         2007-09-24  4354  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4355  	spin_lock_irqsave(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4356  	/* grab this early so we know to try again if a state change and
34d024f84345807 Mark Fasheh         2007-09-24  4357  	 * wake happens part-way through our work  */
34d024f84345807 Mark Fasheh         2007-09-24  4358  	osb->dc_work_sequence = osb->dc_wake_sequence;
34d024f84345807 Mark Fasheh         2007-09-24  4359  
34d024f84345807 Mark Fasheh         2007-09-24  4360  	processed = osb->blocked_lock_count;
209f7512d007980 Joseph Qi           2015-08-06  4361  	/*
209f7512d007980 Joseph Qi           2015-08-06  4362  	 * blocked lock processing in this loop might call iput which can
209f7512d007980 Joseph Qi           2015-08-06  4363  	 * remove items off osb->blocked_lock_list. Downconvert up to
209f7512d007980 Joseph Qi           2015-08-06  4364  	 * 'processed' number of locks, but stop short if we had some
209f7512d007980 Joseph Qi           2015-08-06  4365  	 * removed in ocfs2_mark_lockres_freeing when downconverting.
209f7512d007980 Joseph Qi           2015-08-06  4366  	 */
209f7512d007980 Joseph Qi           2015-08-06  4367  	while (processed && !list_empty(&osb->blocked_lock_list)) {
34d024f84345807 Mark Fasheh         2007-09-24  4368  		lockres = list_entry(osb->blocked_lock_list.next,
34d024f84345807 Mark Fasheh         2007-09-24  4369  				     struct ocfs2_lock_res, l_blocked_list);
34d024f84345807 Mark Fasheh         2007-09-24  4370  		list_del_init(&lockres->l_blocked_list);
34d024f84345807 Mark Fasheh         2007-09-24  4371  		osb->blocked_lock_count--;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4372  		spin_unlock_irqrestore(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4373  
34d024f84345807 Mark Fasheh         2007-09-24  4374  		BUG_ON(!processed);
34d024f84345807 Mark Fasheh         2007-09-24  4375  		processed--;
34d024f84345807 Mark Fasheh         2007-09-24  4376  
34d024f84345807 Mark Fasheh         2007-09-24  4377  		ocfs2_process_blocked_lock(osb, lockres);
34d024f84345807 Mark Fasheh         2007-09-24  4378  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4379  		spin_lock_irqsave(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4380  	}
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4381  	spin_unlock_irqrestore(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4382  }
34d024f84345807 Mark Fasheh         2007-09-24  4383  
34d024f84345807 Mark Fasheh         2007-09-24  4384  static int ocfs2_downconvert_thread_lists_empty(struct ocfs2_super *osb)
34d024f84345807 Mark Fasheh         2007-09-24  4385  {
34d024f84345807 Mark Fasheh         2007-09-24  4386  	int empty = 0;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4387  	unsigned long flags;
34d024f84345807 Mark Fasheh         2007-09-24  4388  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4389  	spin_lock_irqsave(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4390  	if (list_empty(&osb->blocked_lock_list))
34d024f84345807 Mark Fasheh         2007-09-24  4391  		empty = 1;
34d024f84345807 Mark Fasheh         2007-09-24  4392  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4393  	spin_unlock_irqrestore(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4394  	return empty;
34d024f84345807 Mark Fasheh         2007-09-24  4395  }
34d024f84345807 Mark Fasheh         2007-09-24  4396  
34d024f84345807 Mark Fasheh         2007-09-24  4397  static int ocfs2_downconvert_thread_should_wake(struct ocfs2_super *osb)
34d024f84345807 Mark Fasheh         2007-09-24  4398  {
34d024f84345807 Mark Fasheh         2007-09-24  4399  	int should_wake = 0;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4400  	unsigned long flags;
34d024f84345807 Mark Fasheh         2007-09-24  4401  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4402  	spin_lock_irqsave(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4403  	if (osb->dc_work_sequence != osb->dc_wake_sequence)
34d024f84345807 Mark Fasheh         2007-09-24  4404  		should_wake = 1;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4405  	spin_unlock_irqrestore(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4406  
34d024f84345807 Mark Fasheh         2007-09-24  4407  	return should_wake;
34d024f84345807 Mark Fasheh         2007-09-24  4408  }
34d024f84345807 Mark Fasheh         2007-09-24  4409  
200bfae37a15e50 Adrian Bunk         2008-02-17  4410  static int ocfs2_downconvert_thread(void *arg)
34d024f84345807 Mark Fasheh         2007-09-24  4411  {
34d024f84345807 Mark Fasheh         2007-09-24  4412  	struct ocfs2_super *osb = arg;
34d024f84345807 Mark Fasheh         2007-09-24  4413  
34d024f84345807 Mark Fasheh         2007-09-24  4414  	/* only quit once we've been asked to stop and there is no more
34d024f84345807 Mark Fasheh         2007-09-24  4415  	 * work available */
34d024f84345807 Mark Fasheh         2007-09-24  4416  	while (!(kthread_should_stop() &&
34d024f84345807 Mark Fasheh         2007-09-24  4417  		ocfs2_downconvert_thread_lists_empty(osb))) {
34d024f84345807 Mark Fasheh         2007-09-24  4418  
34d024f84345807 Mark Fasheh         2007-09-24  4419  		wait_event_interruptible(osb->dc_event,
34d024f84345807 Mark Fasheh         2007-09-24  4420  					 ocfs2_downconvert_thread_should_wake(osb) ||
34d024f84345807 Mark Fasheh         2007-09-24  4421  					 kthread_should_stop());
34d024f84345807 Mark Fasheh         2007-09-24  4422  
34d024f84345807 Mark Fasheh         2007-09-24  4423  		mlog(0, "downconvert_thread: awoken\n");
34d024f84345807 Mark Fasheh         2007-09-24  4424  
34d024f84345807 Mark Fasheh         2007-09-24  4425  		ocfs2_downconvert_thread_do_work(osb);
34d024f84345807 Mark Fasheh         2007-09-24  4426  	}
34d024f84345807 Mark Fasheh         2007-09-24  4427  
34d024f84345807 Mark Fasheh         2007-09-24  4428  	osb->dc_task = NULL;
4658d87cb38cb3a Hariprasad Kelam    2019-07-11  4429  	return 0;
34d024f84345807 Mark Fasheh         2007-09-24  4430  }
34d024f84345807 Mark Fasheh         2007-09-24  4431  
34d024f84345807 Mark Fasheh         2007-09-24  4432  void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb)
34d024f84345807 Mark Fasheh         2007-09-24  4433  {
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4434  	unsigned long flags;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4435  
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4436  	spin_lock_irqsave(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4437  	/* make sure the voting thread gets a swipe at whatever changes
34d024f84345807 Mark Fasheh         2007-09-24  4438  	 * the caller may have made to the voting state */
34d024f84345807 Mark Fasheh         2007-09-24  4439  	osb->dc_wake_sequence++;
a75e9ccabd925d1 Srinivas Eeda       2012-01-30  4440  	spin_unlock_irqrestore(&osb->dc_task_lock, flags);
34d024f84345807 Mark Fasheh         2007-09-24  4441  	wake_up(&osb->dc_event);
34d024f84345807 Mark Fasheh         2007-09-24  4442  }

:::::: The code at line 3291 was first introduced by commit
:::::: 8056773ac4b42f36bae6406030218a5f12749c64 ocfs2: add locking filter debugfs file

:::::: TO: Gang He <ghe at suse.com>
:::::: CC: Linus Torvalds <torvalds at linux-foundation.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 43527 bytes
Desc: not available
URL: <http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/attachments/20190720/7ecc9df5/attachment-0001.bin>

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-07-19 21:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-19 21:08 [driver-core:debugfs_cleanup 32/55] fs/ocfs2/dlmglue.c:3291:30: error: void value not ignored as it ought to be kbuild test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.