zap_micro.c (296519) | zap_micro.c (299439) |
---|---|
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 359 unchanged lines hidden (view full) --- 368} 369 370static zap_t * 371mzap_open(objset_t *os, uint64_t obj, dmu_buf_t *db) 372{ 373 zap_t *winner; 374 zap_t *zap; 375 int i; | 1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 359 unchanged lines hidden (view full) --- 368} 369 370static zap_t * 371mzap_open(objset_t *os, uint64_t obj, dmu_buf_t *db) 372{ 373 zap_t *winner; 374 zap_t *zap; 375 int i; |
376 uint64_t *zap_hdr = (uint64_t *)db->db_data; 377 uint64_t zap_block_type = zap_hdr[0]; 378 uint64_t zap_magic = zap_hdr[1]; |
|
376 377 ASSERT3U(MZAP_ENT_LEN, ==, sizeof (mzap_ent_phys_t)); 378 379 zap = kmem_zalloc(sizeof (zap_t), KM_SLEEP); 380 rw_init(&zap->zap_rwlock, 0, 0, 0); 381 rw_enter(&zap->zap_rwlock, RW_WRITER); 382 zap->zap_objset = os; 383 zap->zap_object = obj; 384 zap->zap_dbuf = db; 385 | 379 380 ASSERT3U(MZAP_ENT_LEN, ==, sizeof (mzap_ent_phys_t)); 381 382 zap = kmem_zalloc(sizeof (zap_t), KM_SLEEP); 383 rw_init(&zap->zap_rwlock, 0, 0, 0); 384 rw_enter(&zap->zap_rwlock, RW_WRITER); 385 zap->zap_objset = os; 386 zap->zap_object = obj; 387 zap->zap_dbuf = db; 388 |
386 if (*(uint64_t *)db->db_data != ZBT_MICRO) { | 389 if (zap_block_type != ZBT_MICRO) { |
387 mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0); 388 zap->zap_f.zap_block_shift = highbit64(db->db_size) - 1; | 390 mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0); 391 zap->zap_f.zap_block_shift = highbit64(db->db_size) - 1; |
392 if (zap_block_type != ZBT_HEADER || zap_magic != ZAP_MAGIC) { 393 winner = NULL; /* No actual winner here... */ 394 goto handle_winner; 395 } |
|
389 } else { 390 zap->zap_ismicro = TRUE; 391 } 392 393 /* 394 * Make sure that zap_ismicro is set before we let others see 395 * it, because zap_lockdir() checks zap_ismicro without the lock 396 * held. 397 */ 398 dmu_buf_init_user(&zap->zap_dbu, zap_evict, &zap->zap_dbuf); 399 winner = dmu_buf_set_user(db, &zap->zap_dbu); 400 | 396 } else { 397 zap->zap_ismicro = TRUE; 398 } 399 400 /* 401 * Make sure that zap_ismicro is set before we let others see 402 * it, because zap_lockdir() checks zap_ismicro without the lock 403 * held. 404 */ 405 dmu_buf_init_user(&zap->zap_dbu, zap_evict, &zap->zap_dbuf); 406 winner = dmu_buf_set_user(db, &zap->zap_dbu); 407 |
401 if (winner != NULL) { 402 rw_exit(&zap->zap_rwlock); 403 rw_destroy(&zap->zap_rwlock); 404 if (!zap->zap_ismicro) 405 mutex_destroy(&zap->zap_f.zap_num_entries_mtx); 406 kmem_free(zap, sizeof (zap_t)); 407 return (winner); 408 } | 408 if (winner != NULL) 409 goto handle_winner; |
409 410 if (zap->zap_ismicro) { 411 zap->zap_salt = zap_m_phys(zap)->mz_salt; 412 zap->zap_normflags = zap_m_phys(zap)->mz_normflags; 413 zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1; 414 avl_create(&zap->zap_m.zap_avl, mze_compare, 415 sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node)); 416 --- 35 unchanged lines hidden (view full) --- 452 */ 453 ASSERT3U((uintptr_t)&ZAP_EMBEDDED_PTRTBL_ENT(zap, 454 1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)) - 455 (uintptr_t)zap_f_phys(zap), ==, 456 zap->zap_dbuf->db_size); 457 } 458 rw_exit(&zap->zap_rwlock); 459 return (zap); | 410 411 if (zap->zap_ismicro) { 412 zap->zap_salt = zap_m_phys(zap)->mz_salt; 413 zap->zap_normflags = zap_m_phys(zap)->mz_normflags; 414 zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1; 415 avl_create(&zap->zap_m.zap_avl, mze_compare, 416 sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node)); 417 --- 35 unchanged lines hidden (view full) --- 453 */ 454 ASSERT3U((uintptr_t)&ZAP_EMBEDDED_PTRTBL_ENT(zap, 455 1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)) - 456 (uintptr_t)zap_f_phys(zap), ==, 457 zap->zap_dbuf->db_size); 458 } 459 rw_exit(&zap->zap_rwlock); 460 return (zap); |
461 462handle_winner: 463 rw_exit(&zap->zap_rwlock); 464 rw_destroy(&zap->zap_rwlock); 465 if (!zap->zap_ismicro) 466 mutex_destroy(&zap->zap_f.zap_num_entries_mtx); 467 kmem_free(zap, sizeof (zap_t)); 468 return (winner); |
|
460} 461 462int 463zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx, 464 krw_t lti, boolean_t fatreader, boolean_t adding, zap_t **zapp) 465{ 466 zap_t *zap; 467 dmu_buf_t *db; --- 10 unchanged lines hidden (view full) --- 478 { 479 dmu_object_info_t doi; 480 dmu_object_info_from_db(db, &doi); 481 ASSERT3U(DMU_OT_BYTESWAP(doi.doi_type), ==, DMU_BSWAP_ZAP); 482 } 483#endif 484 485 zap = dmu_buf_get_user(db); | 469} 470 471int 472zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx, 473 krw_t lti, boolean_t fatreader, boolean_t adding, zap_t **zapp) 474{ 475 zap_t *zap; 476 dmu_buf_t *db; --- 10 unchanged lines hidden (view full) --- 487 { 488 dmu_object_info_t doi; 489 dmu_object_info_from_db(db, &doi); 490 ASSERT3U(DMU_OT_BYTESWAP(doi.doi_type), ==, DMU_BSWAP_ZAP); 491 } 492#endif 493 494 zap = dmu_buf_get_user(db); |
486 if (zap == NULL) | 495 if (zap == NULL) { |
487 zap = mzap_open(os, obj, db); | 496 zap = mzap_open(os, obj, db); |
497 if (zap == NULL) { 498 /* 499 * mzap_open() didn't like what it saw on-disk. 500 * Check for corruption! 501 */ 502 dmu_buf_rele(db, NULL); 503 return (SET_ERROR(EIO)); 504 } 505 } |
|
488 489 /* 490 * We're checking zap_ismicro without the lock held, in order to 491 * tell what type of lock we want. Once we have some sort of 492 * lock, see if it really is the right type. In practice this 493 * can only be different if it was upgraded from micro to fat, 494 * and micro wanted WRITER but fat only needs READER. 495 */ --- 975 unchanged lines hidden --- | 506 507 /* 508 * We're checking zap_ismicro without the lock held, in order to 509 * tell what type of lock we want. Once we have some sort of 510 * lock, see if it really is the right type. In practice this 511 * can only be different if it was upgraded from micro to fat, 512 * and micro wanted WRITER but fat only needs READER. 513 */ --- 975 unchanged lines hidden --- |