diff options
Diffstat (limited to 'fs/hpfs')
| -rw-r--r-- | fs/hpfs/alloc.c | 68 | ||||
| -rw-r--r-- | fs/hpfs/buffer.c | 108 | ||||
| -rw-r--r-- | fs/hpfs/dir.c | 6 | ||||
| -rw-r--r-- | fs/hpfs/dnode.c | 44 | ||||
| -rw-r--r-- | fs/hpfs/ea.c | 6 | ||||
| -rw-r--r-- | fs/hpfs/file.c | 8 | ||||
| -rw-r--r-- | fs/hpfs/hpfs_fn.h | 8 | ||||
| -rw-r--r-- | fs/hpfs/inode.c | 5 | ||||
| -rw-r--r-- | fs/hpfs/map.c | 17 | ||||
| -rw-r--r-- | fs/hpfs/name.c | 11 | ||||
| -rw-r--r-- | fs/hpfs/namei.c | 4 | ||||
| -rw-r--r-- | fs/hpfs/super.c | 114 | 
12 files changed, 255 insertions, 144 deletions
diff --git a/fs/hpfs/alloc.c b/fs/hpfs/alloc.c index cdb84a83806..f005046e159 100644 --- a/fs/hpfs/alloc.c +++ b/fs/hpfs/alloc.c @@ -8,6 +8,58 @@  #include "hpfs_fn.h" +static void hpfs_claim_alloc(struct super_block *s, secno sec) +{ +	struct hpfs_sb_info *sbi = hpfs_sb(s); +	if (sbi->sb_n_free != (unsigned)-1) { +		if (unlikely(!sbi->sb_n_free)) { +			hpfs_error(s, "free count underflow, allocating sector %08x", sec); +			sbi->sb_n_free = -1; +			return; +		} +		sbi->sb_n_free--; +	} +} + +static void hpfs_claim_free(struct super_block *s, secno sec) +{ +	struct hpfs_sb_info *sbi = hpfs_sb(s); +	if (sbi->sb_n_free != (unsigned)-1) { +		if (unlikely(sbi->sb_n_free >= sbi->sb_fs_size)) { +			hpfs_error(s, "free count overflow, freeing sector %08x", sec); +			sbi->sb_n_free = -1; +			return; +		} +		sbi->sb_n_free++; +	} +} + +static void hpfs_claim_dirband_alloc(struct super_block *s, secno sec) +{ +	struct hpfs_sb_info *sbi = hpfs_sb(s); +	if (sbi->sb_n_free_dnodes != (unsigned)-1) { +		if (unlikely(!sbi->sb_n_free_dnodes)) { +			hpfs_error(s, "dirband free count underflow, allocating sector %08x", sec); +			sbi->sb_n_free_dnodes = -1; +			return; +		} +		sbi->sb_n_free_dnodes--; +	} +} + +static void hpfs_claim_dirband_free(struct super_block *s, secno sec) +{ +	struct hpfs_sb_info *sbi = hpfs_sb(s); +	if (sbi->sb_n_free_dnodes != (unsigned)-1) { +		if (unlikely(sbi->sb_n_free_dnodes >= sbi->sb_dirband_size / 4)) { +			hpfs_error(s, "dirband free count overflow, freeing sector %08x", sec); +			sbi->sb_n_free_dnodes = -1; +			return; +		} +		sbi->sb_n_free_dnodes++; +	} +} +  /*   * Check if a sector is allocated in bitmap   * This is really slow. Turned on only if chk==2 @@ -203,9 +255,15 @@ secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forwa  	}  	sec = 0;  	ret: +	if (sec) { +		i = 0; +		do +			hpfs_claim_alloc(s, sec + i); +		while (unlikely(++i < n)); +	}  	if (sec && f_p) {  		for (i = 0; i < forward; i++) { -			if (!hpfs_alloc_if_possible(s, sec + i + 1)) { +			if (!hpfs_alloc_if_possible(s, sec + n + i)) {  				hpfs_error(s, "Prealloc doesn't work! Wanted %d, allocated at %08x, can't allocate %d", forward, sec, i);  				sec = 0;  				break; @@ -228,6 +286,7 @@ static secno alloc_in_dirband(struct super_block *s, secno near)  	nr >>= 2;  	sec = alloc_in_bmp(s, (~0x3fff) | nr, 1, 0);  	if (!sec) return 0; +	hpfs_claim_dirband_alloc(s, sec);  	return ((sec & 0x3fff) << 2) + sbi->sb_dirband_start;  } @@ -242,6 +301,7 @@ int hpfs_alloc_if_possible(struct super_block *s, secno sec)  		bmp[(sec & 0x3fff) >> 5] &= cpu_to_le32(~(1 << (sec & 0x1f)));  		hpfs_mark_4buffers_dirty(&qbh);  		hpfs_brelse4(&qbh); +		hpfs_claim_alloc(s, sec);  		return 1;  	}  	hpfs_brelse4(&qbh); @@ -256,7 +316,7 @@ void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n)  	struct quad_buffer_head qbh;  	__le32 *bmp;  	struct hpfs_sb_info *sbi = hpfs_sb(s); -	/*printk("2 - ");*/ +	/*pr_info("2 - ");*/  	if (!n) return;  	if (sec < 0x12) {  		hpfs_error(s, "Trying to free reserved sector %08x", sec); @@ -275,6 +335,7 @@ void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n)  		return;  	}  	bmp[(sec & 0x3fff) >> 5] |= cpu_to_le32(1 << (sec & 0x1f)); +	hpfs_claim_free(s, sec);  	if (!--n) {  		hpfs_mark_4buffers_dirty(&qbh);  		hpfs_brelse4(&qbh); @@ -359,6 +420,7 @@ void hpfs_free_dnode(struct super_block *s, dnode_secno dno)  		bmp[ssec >> 5] |= cpu_to_le32(1 << (ssec & 0x1f));  		hpfs_mark_4buffers_dirty(&qbh);  		hpfs_brelse4(&qbh); +		hpfs_claim_dirband_free(s, dno);  	}  } @@ -366,7 +428,7 @@ struct dnode *hpfs_alloc_dnode(struct super_block *s, secno near,  			 dnode_secno *dno, struct quad_buffer_head *qbh)  {  	struct dnode *d; -	if (hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_dmap) > FREE_DNODES_ADD) { +	if (hpfs_get_free_dnodes(s) > FREE_DNODES_ADD) {  		if (!(*dno = alloc_in_dirband(s, near)))  			if (!(*dno = hpfs_alloc_sector(s, near, 4, 0))) return NULL;  	} else { diff --git a/fs/hpfs/buffer.c b/fs/hpfs/buffer.c index 4d0a1afa058..8057fe4e657 100644 --- a/fs/hpfs/buffer.c +++ b/fs/hpfs/buffer.c @@ -55,7 +55,7 @@ void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head  	if (bh != NULL)  		return bh->b_data;  	else { -		printk("HPFS: hpfs_map_sector: read error\n"); +		pr_err("%s(): read error\n", __func__);  		return NULL;  	}  } @@ -76,7 +76,7 @@ void *hpfs_get_sector(struct super_block *s, unsigned secno, struct buffer_head  		set_buffer_uptodate(bh);  		return bh->b_data;  	} else { -		printk("HPFS: hpfs_get_sector: getblk failed\n"); +		pr_err("%s(): getblk failed\n", __func__);  		return NULL;  	}  } @@ -86,7 +86,6 @@ void *hpfs_get_sector(struct super_block *s, unsigned secno, struct buffer_head  void *hpfs_map_4sectors(struct super_block *s, unsigned secno, struct quad_buffer_head *qbh,  		   int ahead)  { -	struct buffer_head *bh;  	char *data;  	hpfs_lock_assert(s); @@ -94,40 +93,38 @@ void *hpfs_map_4sectors(struct super_block *s, unsigned secno, struct quad_buffe  	cond_resched();  	if (secno & 3) { -		printk("HPFS: hpfs_map_4sectors: unaligned read\n"); +		pr_err("%s(): unaligned read\n", __func__);  		return NULL;  	}  	hpfs_prefetch_sectors(s, secno, 4 + ahead); +	if (!(qbh->bh[0] = sb_bread(s, secno + 0))) goto bail0; +	if (!(qbh->bh[1] = sb_bread(s, secno + 1))) goto bail1; +	if (!(qbh->bh[2] = sb_bread(s, secno + 2))) goto bail2; +	if (!(qbh->bh[3] = sb_bread(s, secno + 3))) goto bail3; + +	if (likely(qbh->bh[1]->b_data == qbh->bh[0]->b_data + 1 * 512) && +	    likely(qbh->bh[2]->b_data == qbh->bh[0]->b_data + 2 * 512) && +	    likely(qbh->bh[3]->b_data == qbh->bh[0]->b_data + 3 * 512)) { +		return qbh->data = qbh->bh[0]->b_data; +	} +  	qbh->data = data = kmalloc(2048, GFP_NOFS);  	if (!data) { -		printk("HPFS: hpfs_map_4sectors: out of memory\n"); -		goto bail; +		pr_err("%s(): out of memory\n", __func__); +		goto bail4;  	} -	qbh->bh[0] = bh = sb_bread(s, secno); -	if (!bh) -		goto bail0; -	memcpy(data, bh->b_data, 512); - -	qbh->bh[1] = bh = sb_bread(s, secno + 1); -	if (!bh) -		goto bail1; -	memcpy(data + 512, bh->b_data, 512); - -	qbh->bh[2] = bh = sb_bread(s, secno + 2); -	if (!bh) -		goto bail2; -	memcpy(data + 2 * 512, bh->b_data, 512); - -	qbh->bh[3] = bh = sb_bread(s, secno + 3); -	if (!bh) -		goto bail3; -	memcpy(data + 3 * 512, bh->b_data, 512); +	memcpy(data + 0 * 512, qbh->bh[0]->b_data, 512); +	memcpy(data + 1 * 512, qbh->bh[1]->b_data, 512); +	memcpy(data + 2 * 512, qbh->bh[2]->b_data, 512); +	memcpy(data + 3 * 512, qbh->bh[3]->b_data, 512);  	return data; + bail4: +	brelse(qbh->bh[3]);   bail3:  	brelse(qbh->bh[2]);   bail2: @@ -135,9 +132,6 @@ void *hpfs_map_4sectors(struct super_block *s, unsigned secno, struct quad_buffe   bail1:  	brelse(qbh->bh[0]);   bail0: -	kfree(data); -	printk("HPFS: hpfs_map_4sectors: read error\n"); - bail:  	return NULL;  } @@ -151,48 +145,58 @@ void *hpfs_get_4sectors(struct super_block *s, unsigned secno,  	hpfs_lock_assert(s);  	if (secno & 3) { -		printk("HPFS: hpfs_get_4sectors: unaligned read\n"); +		pr_err("%s(): unaligned read\n", __func__);  		return NULL;  	} -	/*return hpfs_map_4sectors(s, secno, qbh, 0);*/ +	if (!hpfs_get_sector(s, secno + 0, &qbh->bh[0])) goto bail0; +	if (!hpfs_get_sector(s, secno + 1, &qbh->bh[1])) goto bail1; +	if (!hpfs_get_sector(s, secno + 2, &qbh->bh[2])) goto bail2; +	if (!hpfs_get_sector(s, secno + 3, &qbh->bh[3])) goto bail3; + +	if (likely(qbh->bh[1]->b_data == qbh->bh[0]->b_data + 1 * 512) && +	    likely(qbh->bh[2]->b_data == qbh->bh[0]->b_data + 2 * 512) && +	    likely(qbh->bh[3]->b_data == qbh->bh[0]->b_data + 3 * 512)) { +		return qbh->data = qbh->bh[0]->b_data; +	} +  	if (!(qbh->data = kmalloc(2048, GFP_NOFS))) { -		printk("HPFS: hpfs_get_4sectors: out of memory\n"); -		return NULL; +		pr_err("%s(): out of memory\n", __func__); +		goto bail4;  	} -	if (!(hpfs_get_sector(s, secno, &qbh->bh[0]))) goto bail0; -	if (!(hpfs_get_sector(s, secno + 1, &qbh->bh[1]))) goto bail1; -	if (!(hpfs_get_sector(s, secno + 2, &qbh->bh[2]))) goto bail2; -	if (!(hpfs_get_sector(s, secno + 3, &qbh->bh[3]))) goto bail3; -	memcpy(qbh->data, qbh->bh[0]->b_data, 512); -	memcpy(qbh->data + 512, qbh->bh[1]->b_data, 512); -	memcpy(qbh->data + 2*512, qbh->bh[2]->b_data, 512); -	memcpy(qbh->data + 3*512, qbh->bh[3]->b_data, 512);  	return qbh->data; -	bail3:	brelse(qbh->bh[2]); -	bail2:	brelse(qbh->bh[1]); -	bail1:	brelse(qbh->bh[0]); -	bail0: +bail4: +	brelse(qbh->bh[3]); +bail3: +	brelse(qbh->bh[2]); +bail2: +	brelse(qbh->bh[1]); +bail1: +	brelse(qbh->bh[0]); +bail0:  	return NULL;  }  void hpfs_brelse4(struct quad_buffer_head *qbh)  { -	brelse(qbh->bh[3]); -	brelse(qbh->bh[2]); -	brelse(qbh->bh[1]); +	if (unlikely(qbh->data != qbh->bh[0]->b_data)) +		kfree(qbh->data);  	brelse(qbh->bh[0]); -	kfree(qbh->data); +	brelse(qbh->bh[1]); +	brelse(qbh->bh[2]); +	brelse(qbh->bh[3]);  }	  void hpfs_mark_4buffers_dirty(struct quad_buffer_head *qbh)  { -	memcpy(qbh->bh[0]->b_data, qbh->data, 512); -	memcpy(qbh->bh[1]->b_data, qbh->data + 512, 512); -	memcpy(qbh->bh[2]->b_data, qbh->data + 2 * 512, 512); -	memcpy(qbh->bh[3]->b_data, qbh->data + 3 * 512, 512); +	if (unlikely(qbh->data != qbh->bh[0]->b_data)) { +		memcpy(qbh->bh[0]->b_data, qbh->data + 0 * 512, 512); +		memcpy(qbh->bh[1]->b_data, qbh->data + 1 * 512, 512); +		memcpy(qbh->bh[2]->b_data, qbh->data + 2 * 512, 512); +		memcpy(qbh->bh[3]->b_data, qbh->data + 3 * 512, 512); +	}  	mark_buffer_dirty(qbh->bh[0]);  	mark_buffer_dirty(qbh->bh[1]);  	mark_buffer_dirty(qbh->bh[2]); diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 292b1acb9b8..2a8e07425de 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c @@ -36,7 +36,7 @@ static loff_t hpfs_dir_lseek(struct file *filp, loff_t off, int whence)  	mutex_lock(&i->i_mutex);  	hpfs_lock(s); -	/*printk("dir lseek\n");*/ +	/*pr_info("dir lseek\n");*/  	if (new_off == 0 || new_off == 1 || new_off == 11 || new_off == 12 || new_off == 13) goto ok;  	pos = ((loff_t) hpfs_de_as_down_as_possible(s, hpfs_inode->i_dno) << 4) + 1;  	while (pos != new_off) { @@ -51,7 +51,7 @@ ok:  	mutex_unlock(&i->i_mutex);  	return new_off;  fail: -	/*printk("illegal lseek: %016llx\n", new_off);*/ +	/*pr_warn("illegal lseek: %016llx\n", new_off);*/  	hpfs_unlock(s);  	mutex_unlock(&i->i_mutex);  	return -ESPIPE; @@ -127,7 +127,7 @@ static int hpfs_readdir(struct file *file, struct dir_context *ctx)  		if (ctx->pos == 12)  			goto out;  		if (ctx->pos == 3 || ctx->pos == 4 || ctx->pos == 5) { -			printk("HPFS: warning: pos==%d\n",(int)ctx->pos); +			pr_err("pos==%d\n", (int)ctx->pos);  			goto out;  		}  		if (ctx->pos == 0) { diff --git a/fs/hpfs/dnode.c b/fs/hpfs/dnode.c index 4364b2a02c5..f36fc010fcc 100644 --- a/fs/hpfs/dnode.c +++ b/fs/hpfs/dnode.c @@ -17,7 +17,7 @@ static loff_t get_pos(struct dnode *d, struct hpfs_dirent *fde)  		if (de == fde) return ((loff_t) le32_to_cpu(d->self) << 4) | (loff_t)i;  		i++;  	} -	printk("HPFS: get_pos: not_found\n"); +	pr_info("%s(): not_found\n", __func__);  	return ((loff_t)le32_to_cpu(d->self) << 4) | (loff_t)1;  } @@ -32,7 +32,7 @@ void hpfs_add_pos(struct inode *inode, loff_t *pos)  			if (hpfs_inode->i_rddir_off[i] == pos) return;  	if (!(i&0x0f)) {  		if (!(ppos = kmalloc((i+0x11) * sizeof(loff_t*), GFP_NOFS))) { -			printk("HPFS: out of memory for position list\n"); +			pr_err("out of memory for position list\n");  			return;  		}  		if (hpfs_inode->i_rddir_off) { @@ -63,7 +63,8 @@ void hpfs_del_pos(struct inode *inode, loff_t *pos)  	}  	return;  	not_f: -	/*printk("HPFS: warning: position pointer %p->%08x not found\n", pos, (int)*pos);*/ +	/*pr_warn("position pointer %p->%08x not found\n", +		  pos, (int)*pos);*/  	return;  } @@ -92,8 +93,11 @@ static void hpfs_pos_ins(loff_t *p, loff_t d, loff_t c)  {  	if ((*p & ~0x3f) == (d & ~0x3f) && (*p & 0x3f) >= (d & 0x3f)) {  		int n = (*p & 0x3f) + c; -		if (n > 0x3f) printk("HPFS: hpfs_pos_ins: %08x + %d\n", (int)*p, (int)c >> 8); -		else *p = (*p & ~0x3f) | n; +		if (n > 0x3f) +			pr_err("%s(): %08x + %d\n", +				__func__, (int)*p, (int)c >> 8); +		else +			*p = (*p & ~0x3f) | n;  	}  } @@ -101,8 +105,11 @@ static void hpfs_pos_del(loff_t *p, loff_t d, loff_t c)  {  	if ((*p & ~0x3f) == (d & ~0x3f) && (*p & 0x3f) >= (d & 0x3f)) {  		int n = (*p & 0x3f) - c; -		if (n < 1) printk("HPFS: hpfs_pos_ins: %08x - %d\n", (int)*p, (int)c >> 8); -		else *p = (*p & ~0x3f) | n; +		if (n < 1) +			pr_err("%s(): %08x - %d\n", +				__func__, (int)*p, (int)c >> 8); +		else +			*p = (*p & ~0x3f) | n;  	}  } @@ -239,12 +246,12 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno,  	struct fnode *fnode;  	int c1, c2 = 0;  	if (!(nname = kmalloc(256, GFP_NOFS))) { -		printk("HPFS: out of memory, can't add to dnode\n"); +		pr_err("out of memory, can't add to dnode\n");  		return 1;  	}  	go_up:  	if (namelen >= 256) { -		hpfs_error(i->i_sb, "hpfs_add_to_dnode: namelen == %d", namelen); +		hpfs_error(i->i_sb, "%s(): namelen == %d", __func__, namelen);  		kfree(nd);  		kfree(nname);  		return 1; @@ -281,7 +288,7 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno,  		   not be any error while splitting dnodes, otherwise the  		   whole directory, not only file we're adding, would  		   be lost. */ -		printk("HPFS: out of memory for dnode splitting\n"); +		pr_err("out of memory for dnode splitting\n");  		hpfs_brelse4(&qbh);  		kfree(nname);  		return 1; @@ -597,7 +604,7 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno)  		if (!de_next->down) goto endm;  		ndown = de_down_pointer(de_next);  		if (!(de_cp = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { -			printk("HPFS: out of memory for dtree balancing\n"); +			pr_err("out of memory for dtree balancing\n");  			goto endm;  		}  		memcpy(de_cp, de, le16_to_cpu(de->length)); @@ -612,7 +619,8 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno)  			hpfs_brelse4(&qbh1);  		}  		hpfs_add_to_dnode(i, ndown, de_cp->name, de_cp->namelen, de_cp, de_cp->down ? de_down_pointer(de_cp) : 0); -		/*printk("UP-TO-DNODE: %08x (ndown = %08x, down = %08x, dno = %08x)\n", up, ndown, down, dno);*/ +		/*pr_info("UP-TO-DNODE: %08x (ndown = %08x, down = %08x, dno = %08x)\n", +		  up, ndown, down, dno);*/  		dno = up;  		kfree(de_cp);  		goto try_it_again; @@ -637,15 +645,15 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno)  			if (!dlp && down) {  				if (le32_to_cpu(d1->first_free) > 2044) {  					if (hpfs_sb(i->i_sb)->sb_chk >= 2) { -						printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); -						printk("HPFS: warning: terminating balancing operation\n"); +						pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n"); +						pr_err("terminating balancing operation\n");  					}  					hpfs_brelse4(&qbh1);  					goto endm;  				}  				if (hpfs_sb(i->i_sb)->sb_chk >= 2) { -					printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); -					printk("HPFS: warning: goin'on\n"); +					pr_err("unbalanced dnode tree, see hpfs.txt 4 more info\n"); +					pr_err("goin'on\n");  				}  				le16_add_cpu(&del->length, 4);  				del->down = 1; @@ -659,7 +667,7 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno)  				*(__le32 *) ((void *) del + le16_to_cpu(del->length) - 4) = cpu_to_le32(down);  		} else goto endm;  		if (!(de_cp = kmalloc(le16_to_cpu(de_prev->length), GFP_NOFS))) { -			printk("HPFS: out of memory for dtree balancing\n"); +			pr_err("out of memory for dtree balancing\n");  			hpfs_brelse4(&qbh1);  			goto endm;  		} @@ -1000,7 +1008,7 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno,  	int d1, d2 = 0;  	name1 = f->name;  	if (!(name2 = kmalloc(256, GFP_NOFS))) { -		printk("HPFS: out of memory, can't map dirent\n"); +		pr_err("out of memory, can't map dirent\n");  		return NULL;  	}  	if (f->len <= 15) diff --git a/fs/hpfs/ea.c b/fs/hpfs/ea.c index bcaafcd2666..ce3f98ba993 100644 --- a/fs/hpfs/ea.c +++ b/fs/hpfs/ea.c @@ -51,7 +51,7 @@ static char *get_indirect_ea(struct super_block *s, int ano, secno a, int size)  {  	char *ret;  	if (!(ret = kmalloc(size + 1, GFP_NOFS))) { -		printk("HPFS: out of memory for EA\n"); +		pr_err("out of memory for EA\n");  		return NULL;  	}  	if (hpfs_ea_read(s, a, ano, 0, size, ret)) { @@ -139,7 +139,7 @@ char *hpfs_get_ea(struct super_block *s, struct fnode *fnode, char *key, int *si  			if (ea_indirect(ea))  				return get_indirect_ea(s, ea_in_anode(ea), ea_sec(ea), *size = ea_len(ea));  			if (!(ret = kmalloc((*size = ea_valuelen(ea)) + 1, GFP_NOFS))) { -				printk("HPFS: out of memory for EA\n"); +				pr_err("out of memory for EA\n");  				return NULL;  			}  			memcpy(ret, ea_data(ea), ea_valuelen(ea)); @@ -165,7 +165,7 @@ char *hpfs_get_ea(struct super_block *s, struct fnode *fnode, char *key, int *si  			if (ea_indirect(ea))  				return get_indirect_ea(s, ea_in_anode(ea), ea_sec(ea), *size = ea_len(ea));  			if (!(ret = kmalloc((*size = ea_valuelen(ea)) + 1, GFP_NOFS))) { -				printk("HPFS: out of memory for EA\n"); +				pr_err("out of memory for EA\n");  				return NULL;  			}  			if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea_valuelen(ea), ret)) { diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index 67c1a61e095..7f54e5f76ce 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c @@ -197,10 +197,10 @@ const struct address_space_operations hpfs_aops = {  const struct file_operations hpfs_file_ops =  {  	.llseek		= generic_file_llseek, -	.read		= do_sync_read, -	.aio_read	= generic_file_aio_read, -	.write		= do_sync_write, -	.aio_write	= generic_file_aio_write, +	.read		= new_sync_read, +	.read_iter	= generic_file_read_iter, +	.write		= new_sync_write, +	.write_iter	= generic_file_write_iter,  	.mmap		= generic_file_mmap,  	.release	= hpfs_file_release,  	.fsync		= hpfs_file_fsync, diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index 1b398636e99..b63b75fa00e 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h @@ -8,6 +8,11 @@  //#define DBG  //#define DEBUG_LOCKS +#ifdef pr_fmt +#undef pr_fmt +#endif + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/mutex.h>  #include <linux/pagemap.h> @@ -80,6 +85,7 @@ struct hpfs_sb_info {  	unsigned sb_c_bitmap;		/* current bitmap */  	unsigned sb_max_fwd_alloc;	/* max forwad allocation */  	int sb_timeshift; +	struct rcu_head rcu;  };  /* Four 512-byte buffers and the 2k block obtained by concatenating them */ @@ -311,7 +317,7 @@ static inline struct hpfs_sb_info *hpfs_sb(struct super_block *sb)  __printf(2, 3)  void hpfs_error(struct super_block *, const char *, ...);  int hpfs_stop_cycles(struct super_block *, int, int *, int *, char *); -unsigned hpfs_count_one_bitmap(struct super_block *, secno); +unsigned hpfs_get_free_dnodes(struct super_block *);  /*   * local time (HPFS) to GMT (Unix) diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 9edeeb0ea97..7ce4b74234a 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -183,7 +183,8 @@ void hpfs_write_inode(struct inode *i)  	struct inode *parent;  	if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return;  	if (hpfs_inode->i_rddir_off && !atomic_read(&i->i_count)) { -		if (*hpfs_inode->i_rddir_off) printk("HPFS: write_inode: some position still there\n"); +		if (*hpfs_inode->i_rddir_off) +			pr_err("write_inode: some position still there\n");  		kfree(hpfs_inode->i_rddir_off);  		hpfs_inode->i_rddir_off = NULL;  	} @@ -304,7 +305,7 @@ void hpfs_write_if_changed(struct inode *inode)  void hpfs_evict_inode(struct inode *inode)  { -	truncate_inode_pages(&inode->i_data, 0); +	truncate_inode_pages_final(&inode->i_data);  	clear_inode(inode);  	if (!inode->i_nlink) {  		hpfs_lock(inode->i_sb); diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c index 3aa66ae1031..442770edcdc 100644 --- a/fs/hpfs/map.c +++ b/fs/hpfs/map.c @@ -65,12 +65,13 @@ unsigned char *hpfs_load_code_page(struct super_block *s, secno cps)  	struct code_page_directory *cp = hpfs_map_sector(s, cps, &bh, 0);  	if (!cp) return NULL;  	if (le32_to_cpu(cp->magic) != CP_DIR_MAGIC) { -		printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", le32_to_cpu(cp->magic)); +		pr_err("Code page directory magic doesn't match (magic = %08x)\n", +			le32_to_cpu(cp->magic));  		brelse(bh);  		return NULL;  	}  	if (!le32_to_cpu(cp->n_code_pages)) { -		printk("HPFS: n_code_pages == 0\n"); +		pr_err("n_code_pages == 0\n");  		brelse(bh);  		return NULL;  	} @@ -79,19 +80,19 @@ unsigned char *hpfs_load_code_page(struct super_block *s, secno cps)  	brelse(bh);  	if (cpi >= 3) { -		printk("HPFS: Code page index out of array\n"); +		pr_err("Code page index out of array\n");  		return NULL;  	}  	if (!(cpd = hpfs_map_sector(s, cpds, &bh, 0))) return NULL;  	if (le16_to_cpu(cpd->offs[cpi]) > 0x178) { -		printk("HPFS: Code page index out of sector\n"); +		pr_err("Code page index out of sector\n");  		brelse(bh);  		return NULL;  	}  	ptr = (unsigned char *)cpd + le16_to_cpu(cpd->offs[cpi]) + 6;  	if (!(cp_table = kmalloc(256, GFP_KERNEL))) { -		printk("HPFS: out of memory for code page table\n"); +		pr_err("out of memory for code page table\n");  		brelse(bh);  		return NULL;  	} @@ -114,7 +115,7 @@ __le32 *hpfs_load_bitmap_directory(struct super_block *s, secno bmp)  	int i;  	__le32 *b;  	if (!(b = kmalloc(n * 512, GFP_KERNEL))) { -		printk("HPFS: can't allocate memory for bitmap directory\n"); +		pr_err("can't allocate memory for bitmap directory\n");  		return NULL;  	}	  	for (i=0;i<n;i++) { @@ -281,7 +282,9 @@ struct dnode *hpfs_map_dnode(struct super_block *s, unsigned secno,  				hpfs_error(s, "dnode %08x does not end with \\377 entry", secno);  				goto bail;  			} -			if (b == 3) printk("HPFS: warning: unbalanced dnode tree, dnode %08x; see hpfs.txt 4 more info\n", secno); +			if (b == 3) +				pr_err("unbalanced dnode tree, dnode %08x; see hpfs.txt 4 more info\n", +					secno);  		}  	return dnode;  	bail: diff --git a/fs/hpfs/name.c b/fs/hpfs/name.c index 9acdf338def..b00d396d22c 100644 --- a/fs/hpfs/name.c +++ b/fs/hpfs/name.c @@ -56,14 +56,15 @@ unsigned char *hpfs_translate_name(struct super_block *s, unsigned char *from,  	unsigned char *to;  	int i;  	if (hpfs_sb(s)->sb_chk >= 2) if (hpfs_is_name_long(from, len) != lng) { -		printk("HPFS: Long name flag mismatch - name "); -		for (i=0; i<len; i++) printk("%c", from[i]); -		printk(" misidentified as %s.\n", lng ? "short" : "long"); -		printk("HPFS: It's nothing serious. It could happen because of bug in OS/2.\nHPFS: Set checks=normal to disable this message.\n"); +		pr_err("Long name flag mismatch - name "); +		for (i = 0; i < len; i++) +			pr_cont("%c", from[i]); +		pr_cont(" misidentified as %s.\n", lng ? "short" : "long"); +		pr_err("It's nothing serious. It could happen because of bug in OS/2.\nSet checks=normal to disable this message.\n");  	}  	if (!lc) return from;  	if (!(to = kmalloc(len, GFP_KERNEL))) { -		printk("HPFS: can't allocate memory for name conversion buffer\n"); +		pr_err("can't allocate memory for name conversion buffer\n");  		return from;  	}  	for (i = 0; i < len; i++) to[i] = locase(hpfs_sb(s)->sb_cp_table,from[i]); diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index 345713d2f8f..bdbc2c3080a 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c @@ -404,10 +404,10 @@ again:  			d_rehash(dentry);  		} else {  			struct iattr newattrs; -			/*printk("HPFS: truncating file before delete.\n");*/ +			/*pr_info("truncating file before delete.\n");*/  			newattrs.ia_size = 0;  			newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; -			err = notify_change(dentry, &newattrs); +			err = notify_change(dentry, &newattrs, NULL);  			put_write_access(inode);  			if (!err)  				goto again; diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index 4334cda8dba..7cd00d3a7c9 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c @@ -62,22 +62,26 @@ void hpfs_error(struct super_block *s, const char *fmt, ...)  	vsnprintf(err_buf, sizeof(err_buf), fmt, args);  	va_end(args); -	printk("HPFS: filesystem error: %s", err_buf); +	pr_err("filesystem error: %s", err_buf);  	if (!hpfs_sb(s)->sb_was_error) {  		if (hpfs_sb(s)->sb_err == 2) { -			printk("; crashing the system because you wanted it\n"); +			pr_cont("; crashing the system because you wanted it\n");  			mark_dirty(s, 0);  			panic("HPFS panic");  		} else if (hpfs_sb(s)->sb_err == 1) { -			if (s->s_flags & MS_RDONLY) printk("; already mounted read-only\n"); +			if (s->s_flags & MS_RDONLY) +				pr_cont("; already mounted read-only\n");  			else { -				printk("; remounting read-only\n"); +				pr_cont("; remounting read-only\n");  				mark_dirty(s, 0);  				s->s_flags |= MS_RDONLY;  			} -		} else if (s->s_flags & MS_RDONLY) printk("; going on - but anything won't be destroyed because it's read-only\n"); -		else printk("; corrupted filesystem mounted read/write - your computer will explode within 20 seconds ... but you wanted it so!\n"); -	} else printk("\n"); +		} else if (s->s_flags & MS_RDONLY) +				pr_cont("; going on - but anything won't be destroyed because it's read-only\n"); +		else +			pr_cont("; corrupted filesystem mounted read/write - your computer will explode within 20 seconds ... but you wanted it so!\n"); +	} else +		pr_cont("\n");  	hpfs_sb(s)->sb_was_error = 1;  } @@ -101,21 +105,27 @@ int hpfs_stop_cycles(struct super_block *s, int key, int *c1, int *c2,  	return 0;  } -static void hpfs_put_super(struct super_block *s) +static void free_sbi(struct hpfs_sb_info *sbi)  { -	struct hpfs_sb_info *sbi = hpfs_sb(s); +	kfree(sbi->sb_cp_table); +	kfree(sbi->sb_bmp_dir); +	kfree(sbi); +} +static void lazy_free_sbi(struct rcu_head *rcu) +{ +	free_sbi(container_of(rcu, struct hpfs_sb_info, rcu)); +} + +static void hpfs_put_super(struct super_block *s) +{  	hpfs_lock(s);  	unmark_dirty(s);  	hpfs_unlock(s); - -	kfree(sbi->sb_cp_table); -	kfree(sbi->sb_bmp_dir); -	s->s_fs_info = NULL; -	kfree(sbi); +	call_rcu(&hpfs_sb(s)->rcu, lazy_free_sbi);  } -unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno) +static unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno)  {  	struct quad_buffer_head qbh;  	unsigned long *bits; @@ -123,7 +133,7 @@ unsigned hpfs_count_one_bitmap(struct super_block *s, secno secno)  	bits = hpfs_map_4sectors(s, secno, &qbh, 0);  	if (!bits) -		return 0; +		return (unsigned)-1;  	count = bitmap_weight(bits, 2048 * BITS_PER_BYTE);  	hpfs_brelse4(&qbh);  	return count; @@ -138,30 +148,45 @@ static unsigned count_bitmaps(struct super_block *s)  		hpfs_prefetch_bitmap(s, n);  	}  	for (n = 0; n < n_bands; n++) { +		unsigned c;  		hpfs_prefetch_bitmap(s, n + COUNT_RD_AHEAD); -		count += hpfs_count_one_bitmap(s, le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[n])); +		c = hpfs_count_one_bitmap(s, le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[n])); +		if (c != (unsigned)-1) +			count += c;  	}  	return count;  } +unsigned hpfs_get_free_dnodes(struct super_block *s) +{ +	struct hpfs_sb_info *sbi = hpfs_sb(s); +	if (sbi->sb_n_free_dnodes == (unsigned)-1) { +		unsigned c = hpfs_count_one_bitmap(s, sbi->sb_dmap); +		if (c == (unsigned)-1) +			return 0; +		sbi->sb_n_free_dnodes = c; +	} +	return sbi->sb_n_free_dnodes; +} +  static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf)  {  	struct super_block *s = dentry->d_sb;  	struct hpfs_sb_info *sbi = hpfs_sb(s);  	u64 id = huge_encode_dev(s->s_bdev->bd_dev); +  	hpfs_lock(s); -	/*if (sbi->sb_n_free == -1) {*/ +	if (sbi->sb_n_free == (unsigned)-1)  		sbi->sb_n_free = count_bitmaps(s); -		sbi->sb_n_free_dnodes = hpfs_count_one_bitmap(s, sbi->sb_dmap); -	/*}*/ +  	buf->f_type = s->s_magic;  	buf->f_bsize = 512;  	buf->f_blocks = sbi->sb_fs_size;  	buf->f_bfree = sbi->sb_n_free;  	buf->f_bavail = sbi->sb_n_free;  	buf->f_files = sbi->sb_dirband_size / 4; -	buf->f_ffree = sbi->sb_n_free_dnodes; +	buf->f_ffree = hpfs_get_free_dnodes(s);  	buf->f_fsid.val[0] = (u32)id;  	buf->f_fsid.val[1] = (u32)(id >> 32);  	buf->f_namelen = 254; @@ -271,7 +296,7 @@ static int parse_opts(char *opts, kuid_t *uid, kgid_t *gid, umode_t *umask,  	if (!opts)  		return 1; -	/*printk("Parsing opts: '%s'\n",opts);*/ +	/*pr_info("Parsing opts: '%s'\n",opts);*/  	while ((p = strsep(&opts, ",")) != NULL) {  		substring_t args[MAX_OPT_ARGS]; @@ -366,7 +391,7 @@ static int parse_opts(char *opts, kuid_t *uid, kgid_t *gid, umode_t *umask,  static inline void hpfs_help(void)  { -	printk("\n\ +	pr_info("\n\  HPFS filesystem options:\n\        help              do not mount and display this text\n\        uid=xxx           set uid of files that don't have uid specified in eas\n\ @@ -400,6 +425,8 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data)  	struct hpfs_sb_info *sbi = hpfs_sb(s);  	char *new_opts = kstrdup(data, GFP_KERNEL); +	sync_filesystem(s); +  	*flags |= MS_NOATIME;  	hpfs_lock(s); @@ -411,7 +438,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data)  	if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase,  	    &eas, &chk, &errs, &chkdsk, ×hift))) { -		printk("HPFS: bad mount options.\n"); +		pr_err("bad mount options.\n");  		goto out_err;  	}  	if (o == 2) { @@ -419,7 +446,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data)  		goto out_err;  	}  	if (timeshift != sbi->sb_timeshift) { -		printk("HPFS: timeshift can't be changed using remount.\n"); +		pr_err("timeshift can't be changed using remount.\n");  		goto out_err;  	} @@ -485,9 +512,6 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)  	}  	s->s_fs_info = sbi; -	sbi->sb_bmp_dir = NULL; -	sbi->sb_cp_table = NULL; -  	mutex_init(&sbi->hpfs_mutex);  	hpfs_lock(s); @@ -503,7 +527,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)  	if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase,  	    &eas, &chk, &errs, &chkdsk, ×hift))) { -		printk("HPFS: bad mount options.\n"); +		pr_err("bad mount options.\n");  		goto bail0;  	}  	if (o==2) { @@ -522,16 +546,17 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)  	if (/*le16_to_cpu(bootblock->magic) != BB_MAGIC  	    ||*/ le32_to_cpu(superblock->magic) != SB_MAGIC  	    || le32_to_cpu(spareblock->magic) != SP_MAGIC) { -		if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); +		if (!silent) +			pr_err("Bad magic ... probably not HPFS\n");  		goto bail4;  	}  	/* Check version */  	if (!(s->s_flags & MS_RDONLY) &&  	      superblock->funcversion != 2 && superblock->funcversion != 3) { -		printk("HPFS: Bad version %d,%d. Mount readonly to go around\n", +		pr_err("Bad version %d,%d. Mount readonly to go around\n",  			(int)superblock->version, (int)superblock->funcversion); -		printk("HPFS: please try recent version of HPFS driver at http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi and if it still can't understand this format, contact author - mikulas@artax.karlin.mff.cuni.cz\n"); +		pr_err("please try recent version of HPFS driver at http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi and if it still can't understand this format, contact author - mikulas@artax.karlin.mff.cuni.cz\n");  		goto bail4;  	} @@ -577,7 +602,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)  	/* Check for general fs errors*/  	if (spareblock->dirty && !spareblock->old_wrote) {  		if (errs == 2) { -			printk("HPFS: Improperly stopped, not mounted\n"); +			pr_err("Improperly stopped, not mounted\n");  			goto bail4;  		}  		hpfs_error(s, "improperly stopped"); @@ -591,22 +616,25 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)  	if (spareblock->hotfixes_used || spareblock->n_spares_used) {  		if (errs >= 2) { -			printk("HPFS: Hotfixes not supported here, try chkdsk\n"); +			pr_err("Hotfixes not supported here, try chkdsk\n");  			mark_dirty(s, 0);  			goto bail4;  		}  		hpfs_error(s, "hotfixes not supported here, try chkdsk"); -		if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); -		else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); +		if (errs == 0) +			pr_err("Proceeding, but your filesystem will be probably corrupted by this driver...\n"); +		else +			pr_err("This driver may read bad files or crash when operating on disk with hotfixes.\n");  	}  	if (le32_to_cpu(spareblock->n_dnode_spares) != le32_to_cpu(spareblock->n_dnode_spares_free)) {  		if (errs >= 2) { -			printk("HPFS: Spare dnodes used, try chkdsk\n"); +			pr_err("Spare dnodes used, try chkdsk\n");  			mark_dirty(s, 0);  			goto bail4;  		}  		hpfs_error(s, "warning: spare dnodes used, try chkdsk"); -		if (errs == 0) printk("HPFS: Proceeding, but your filesystem could be corrupted if you delete files or directories\n"); +		if (errs == 0) +			pr_err("Proceeding, but your filesystem could be corrupted if you delete files or directories\n");  	}  	if (chk) {  		unsigned a; @@ -625,12 +653,13 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)  			goto bail4;  		}  		sbi->sb_dirband_size = a; -	} else printk("HPFS: You really don't want any checks? You are crazy...\n"); +	} else +		pr_err("You really don't want any checks? You are crazy...\n");  	/* Load code page table */  	if (le32_to_cpu(spareblock->n_code_pages))  		if (!(sbi->sb_cp_table = hpfs_load_code_page(s, le32_to_cpu(spareblock->code_page_dir)))) -			printk("HPFS: Warning: code page support is disabled\n"); +			pr_err("code page support is disabled\n");  	brelse(bh2);  	brelse(bh1); @@ -679,10 +708,7 @@ bail2:	brelse(bh0);  bail1:  bail0:  	hpfs_unlock(s); -	kfree(sbi->sb_bmp_dir); -	kfree(sbi->sb_cp_table); -	s->s_fs_info = NULL; -	kfree(sbi); +	free_sbi(sbi);  	return -EINVAL;  }  | 
