tree: https://kernel.googlesource.com/pub/scm/linux/kernel/git/gregkh/driver-core.git debugfs_cleanup head: 7ea1b1929a3f463169713ae38bcacf4966e756af commit: 54d5611ad33f517de1bfe958b22f57822743aebb [26/49] debugfs: remove return value of debugfs_create_u32() config: x86_64-lkp (attached as .config) compiler: gcc-7 (Debian 7.4.0-10) 7.4.0 reproduce: git checkout 54d5611ad33f517de1bfe958b22f57822743aebb # 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@xxxxxxxxx> 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); 29b0ea64bda81c7 Greg Kroah-Hartman 2019-01-04 3295 29b0ea64bda81c7 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@xxxxxxxx> :::::: CC: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip
_______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel