diff options
Diffstat (limited to 'fs/hfs/mdb.c')
| -rw-r--r-- | fs/hfs/mdb.c | 40 | 
1 files changed, 26 insertions, 14 deletions
diff --git a/fs/hfs/mdb.c b/fs/hfs/mdb.c index 1563d5ce576..aa3f0d6d043 100644 --- a/fs/hfs/mdb.c +++ b/fs/hfs/mdb.c @@ -48,7 +48,7 @@ static int hfs_get_last_session(struct super_block *sb,  			*start = (sector_t)te.cdte_addr.lba << 2;  			return 0;  		} -		printk(KERN_ERR "hfs: invalid session number or type of track\n"); +		pr_err("invalid session number or type of track\n");  		return -EINVAL;  	}  	ms_info.addr_format = CDROM_LBA; @@ -101,7 +101,7 @@ int hfs_mdb_get(struct super_block *sb)  	HFS_SB(sb)->alloc_blksz = size = be32_to_cpu(mdb->drAlBlkSiz);  	if (!size || (size & (HFS_SECTOR_SIZE - 1))) { -		printk(KERN_ERR "hfs: bad allocation block size %d\n", size); +		pr_err("bad allocation block size %d\n", size);  		goto out_bh;  	} @@ -118,7 +118,7 @@ int hfs_mdb_get(struct super_block *sb)  		size >>= 1;  	brelse(bh);  	if (!sb_set_blocksize(sb, size)) { -		printk(KERN_ERR "hfs: unable to set blocksize to %u\n", size); +		pr_err("unable to set blocksize to %u\n", size);  		goto out;  	} @@ -162,8 +162,8 @@ int hfs_mdb_get(struct super_block *sb)  	}  	if (!HFS_SB(sb)->alt_mdb) { -		printk(KERN_WARNING "hfs: unable to locate alternate MDB\n"); -		printk(KERN_WARNING "hfs: continuing without an alternate MDB\n"); +		pr_warn("unable to locate alternate MDB\n"); +		pr_warn("continuing without an alternate MDB\n");  	}  	HFS_SB(sb)->bitmap = (__be32 *)__get_free_pages(GFP_KERNEL, PAGE_SIZE < 8192 ? 1 : 0); @@ -178,7 +178,7 @@ int hfs_mdb_get(struct super_block *sb)  	while (size) {  		bh = sb_bread(sb, off >> sb->s_blocksize_bits);  		if (!bh) { -			printk(KERN_ERR "hfs: unable to read volume bitmap\n"); +			pr_err("unable to read volume bitmap\n");  			goto out;  		}  		off2 = off & (sb->s_blocksize - 1); @@ -192,23 +192,22 @@ int hfs_mdb_get(struct super_block *sb)  	HFS_SB(sb)->ext_tree = hfs_btree_open(sb, HFS_EXT_CNID, hfs_ext_keycmp);  	if (!HFS_SB(sb)->ext_tree) { -		printk(KERN_ERR "hfs: unable to open extent tree\n"); +		pr_err("unable to open extent tree\n");  		goto out;  	}  	HFS_SB(sb)->cat_tree = hfs_btree_open(sb, HFS_CAT_CNID, hfs_cat_keycmp);  	if (!HFS_SB(sb)->cat_tree) { -		printk(KERN_ERR "hfs: unable to open catalog tree\n"); +		pr_err("unable to open catalog tree\n");  		goto out;  	}  	attrib = mdb->drAtrb;  	if (!(attrib & cpu_to_be16(HFS_SB_ATTRIB_UNMNT))) { -		printk(KERN_WARNING "hfs: filesystem was not cleanly unmounted, " -			 "running fsck.hfs is recommended.  mounting read-only.\n"); +		pr_warn("filesystem was not cleanly unmounted, running fsck.hfs is recommended.  mounting read-only.\n");  		sb->s_flags |= MS_RDONLY;  	}  	if ((attrib & cpu_to_be16(HFS_SB_ATTRIB_SLOCK))) { -		printk(KERN_WARNING "hfs: filesystem is marked locked, mounting read-only.\n"); +		pr_warn("filesystem is marked locked, mounting read-only.\n");  		sb->s_flags |= MS_RDONLY;  	}  	if (!(sb->s_flags & MS_RDONLY)) { @@ -236,10 +235,10 @@ out:   * hfs_mdb_commit()   *   * Description: - *   This updates the MDB on disk (look also at hfs_write_super()). + *   This updates the MDB on disk.   *   It does not check, if the superblock has been modified, or   *   if the filesystem has been mounted read-only. It is mainly - *   called by hfs_write_super() and hfs_btree_extend(). + *   called by hfs_sync_fs() and flush_mdb().   * Input Variable(s):   *   struct hfs_mdb *mdb: Pointer to the hfs MDB   *   int backup; @@ -260,6 +259,10 @@ void hfs_mdb_commit(struct super_block *sb)  {  	struct hfs_mdb *mdb = HFS_SB(sb)->mdb; +	if (sb->s_flags & MS_RDONLY) +		return; + +	lock_buffer(HFS_SB(sb)->mdb_bh);  	if (test_and_clear_bit(HFS_FLG_MDB_DIRTY, &HFS_SB(sb)->flags)) {  		/* These parameters may have been modified, so write them back */  		mdb->drLsMod = hfs_mtime(); @@ -283,9 +286,13 @@ void hfs_mdb_commit(struct super_block *sb)  				     &mdb->drXTFlSize, NULL);  		hfs_inode_write_fork(HFS_SB(sb)->cat_tree->inode, mdb->drCTExtRec,  				     &mdb->drCTFlSize, NULL); + +		lock_buffer(HFS_SB(sb)->alt_mdb_bh);  		memcpy(HFS_SB(sb)->alt_mdb, HFS_SB(sb)->mdb, HFS_SECTOR_SIZE);  		HFS_SB(sb)->alt_mdb->drAtrb |= cpu_to_be16(HFS_SB_ATTRIB_UNMNT);  		HFS_SB(sb)->alt_mdb->drAtrb &= cpu_to_be16(~HFS_SB_ATTRIB_INCNSTNT); +		unlock_buffer(HFS_SB(sb)->alt_mdb_bh); +  		mark_buffer_dirty(HFS_SB(sb)->alt_mdb_bh);  		sync_dirty_buffer(HFS_SB(sb)->alt_mdb_bh);  	} @@ -304,11 +311,15 @@ void hfs_mdb_commit(struct super_block *sb)  		while (size) {  			bh = sb_bread(sb, block);  			if (!bh) { -				printk(KERN_ERR "hfs: unable to read volume bitmap\n"); +				pr_err("unable to read volume bitmap\n");  				break;  			}  			len = min((int)sb->s_blocksize - off, size); + +			lock_buffer(bh);  			memcpy(bh->b_data + off, ptr, len); +			unlock_buffer(bh); +  			mark_buffer_dirty(bh);  			brelse(bh);  			block++; @@ -317,6 +328,7 @@ void hfs_mdb_commit(struct super_block *sb)  			size -= len;  		}  	} +	unlock_buffer(HFS_SB(sb)->mdb_bh);  }  void hfs_mdb_close(struct super_block *sb)  | 
