diff options
Diffstat (limited to 'fs/jfs/jfs_imap.c')
| -rw-r--r-- | fs/jfs/jfs_imap.c | 125 | 
1 files changed, 57 insertions, 68 deletions
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 3a09423b6c2..f321986e73d 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c @@ -386,7 +386,7 @@ int diRead(struct inode *ip)  	dp += rel_inode;  	if (ip->i_ino != le32_to_cpu(dp->di_number)) { -		jfs_error(ip->i_sb, "diRead: i_ino != di_number"); +		jfs_error(ip->i_sb, "i_ino != di_number\n");  		rc = -EIO;  	} else if (le32_to_cpu(dp->di_nlink) == 0)  		rc = -ESTALE; @@ -397,7 +397,7 @@ int diRead(struct inode *ip)  	release_metapage(mp);  	/* set the ag for the inode */ -	JFS_IP(ip)->agno = BLKTOAG(agstart, sbi); +	JFS_IP(ip)->agstart = agstart;  	JFS_IP(ip)->active_ag = -1;  	return (rc); @@ -457,7 +457,7 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)  	/* read the page of fixed disk inode (AIT) in raw mode */  	mp = read_metapage(ip, address << sbi->l2nbperpage, PSIZE, 1);  	if (mp == NULL) { -		ip->i_nlink = 1;	/* Don't want iput() deleting it */ +		set_nlink(ip, 1);	/* Don't want iput() deleting it */  		iput(ip);  		return (NULL);  	} @@ -469,7 +469,7 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)  	/* copy on-disk inode to in-memory inode */  	if ((copy_from_dinode(dp, ip)) != 0) {  		/* handle bad return by returning NULL for ip */ -		ip->i_nlink = 1;	/* Don't want iput() deleting it */ +		set_nlink(ip, 1);	/* Don't want iput() deleting it */  		iput(ip);  		/* release the page */  		release_metapage(mp); @@ -625,7 +625,7 @@ int diWrite(tid_t tid, struct inode *ip)  	if (!addressPXD(&(jfs_ip->ixpxd)) ||  	    (lengthPXD(&(jfs_ip->ixpxd)) !=  	     JFS_IP(ipimap)->i_imap->im_nbperiext)) { -		jfs_error(ip->i_sb, "diWrite: ixpxd invalid"); +		jfs_error(ip->i_sb, "ixpxd invalid\n");  		return -EIO;  	} @@ -893,15 +893,14 @@ int diFree(struct inode *ip)  	if (iagno >= imap->im_nextiag) {  		print_hex_dump(KERN_ERR, "imap: ", DUMP_PREFIX_ADDRESS, 16, 4,  			       imap, 32, 0); -		jfs_error(ip->i_sb, -			  "diFree: inum = %d, iagno = %d, nextiag = %d", +		jfs_error(ip->i_sb, "inum = %d, iagno = %d, nextiag = %d\n",  			  (uint) inum, iagno, imap->im_nextiag);  		return -EIO;  	}  	/* get the allocation group for this ino.  	 */ -	agno = JFS_IP(ip)->agno; +	agno = BLKTOAG(JFS_IP(ip)->agstart, JFS_SBI(ip->i_sb));  	/* Lock the AG specific inode map information  	 */ @@ -930,15 +929,14 @@ int diFree(struct inode *ip)  	mask = HIGHORDER >> bitno;  	if (!(le32_to_cpu(iagp->wmap[extno]) & mask)) { -		jfs_error(ip->i_sb, -			  "diFree: wmap shows inode already free"); +		jfs_error(ip->i_sb, "wmap shows inode already free\n");  	}  	if (!addressPXD(&iagp->inoext[extno])) {  		release_metapage(mp);  		IREAD_UNLOCK(ipimap);  		AG_UNLOCK(imap, agno); -		jfs_error(ip->i_sb, "diFree: invalid inoext"); +		jfs_error(ip->i_sb, "invalid inoext\n");  		return -EIO;  	} @@ -950,7 +948,7 @@ int diFree(struct inode *ip)  		release_metapage(mp);  		IREAD_UNLOCK(ipimap);  		AG_UNLOCK(imap, agno); -		jfs_error(ip->i_sb, "diFree: numfree > numinos"); +		jfs_error(ip->i_sb, "numfree > numinos\n");  		return -EIO;  	}  	/* @@ -1069,7 +1067,7 @@ int diFree(struct inode *ip)  		 */  		if (iagp->nfreeexts == cpu_to_le32(EXTSPERIAG - 1)) {  			/* in preparation for removing the iag from the -			 * ag extent free list, read the iags preceeding +			 * ag extent free list, read the iags preceding  			 * and following the iag on the ag extent free  			 * list.  			 */ @@ -1095,7 +1093,7 @@ int diFree(struct inode *ip)  		int inofreefwd = le32_to_cpu(iagp->inofreefwd);  		/* in preparation for removing the iag from the -		 * ag inode free list, read the iags preceeding +		 * ag inode free list, read the iags preceding  		 * and following the iag on the ag inode free  		 * list.  before reading these iags, we must make  		 * sure that we already don't have them in hand @@ -1199,7 +1197,7 @@ int diFree(struct inode *ip)  	 * for the inode being freed.  	 */  	if (iagp->pmap[extno] != 0) { -		jfs_error(ip->i_sb, "diFree: the pmap does not show inode free"); +		jfs_error(ip->i_sb, "the pmap does not show inode free\n");  	}  	iagp->wmap[extno] = 0;  	PXDlength(&iagp->inoext[extno], 0); @@ -1315,12 +1313,11 @@ int diFree(struct inode *ip)  static inline void  diInitInode(struct inode *ip, int iagno, int ino, int extno, struct iag * iagp)  { -	struct jfs_sb_info *sbi = JFS_SBI(ip->i_sb);  	struct jfs_inode_info *jfs_ip = JFS_IP(ip);  	ip->i_ino = (iagno << L2INOSPERIAG) + ino;  	jfs_ip->ixpxd = iagp->inoext[extno]; -	jfs_ip->agno = BLKTOAG(le64_to_cpu(iagp->agstart), sbi); +	jfs_ip->agstart = le64_to_cpu(iagp->agstart);  	jfs_ip->active_ag = -1;  } @@ -1379,7 +1376,7 @@ int diAlloc(struct inode *pip, bool dir, struct inode *ip)  	 */  	/* get the ag number of this iag */ -	agno = JFS_IP(pip)->agno; +	agno = BLKTOAG(JFS_IP(pip)->agstart, JFS_SBI(pip->i_sb));  	if (atomic_read(&JFS_SBI(pip->i_sb)->bmap->db_active[agno])) {  		/* @@ -1494,7 +1491,7 @@ int diAlloc(struct inode *pip, bool dir, struct inode *ip)  		/* mask any prior bits for the starting words of the  		 * summary map.  		 */ -		mask = ONES << (EXTSPERSUM - bitno); +		mask = (bitno == 0) ? 0 : (ONES << (EXTSPERSUM - bitno));  		inosmap = le32_to_cpu(iagp->inosmap[sword]) | mask;  		extsmap = le32_to_cpu(iagp->extsmap[sword]) | mask; @@ -1519,8 +1516,7 @@ int diAlloc(struct inode *pip, bool dir, struct inode *ip)  					release_metapage(mp);  					AG_UNLOCK(imap, agno);  					jfs_error(ip->i_sb, -						  "diAlloc: can't find free bit " -						  "in wmap"); +						  "can't find free bit in wmap\n");  					return -EIO;  				} @@ -1661,7 +1657,7 @@ diAllocAG(struct inomap * imap, int agno, bool dir, struct inode *ip)  	numinos = imap->im_agctl[agno].numinos;  	if (numfree > numinos) { -		jfs_error(ip->i_sb, "diAllocAG: numfree > numinos"); +		jfs_error(ip->i_sb, "numfree > numinos\n");  		return -EIO;  	} @@ -1681,7 +1677,7 @@ diAllocAG(struct inomap * imap, int agno, bool dir, struct inode *ip)  	 * try to allocate a new extent of free inodes.  	 */  	if (addext) { -		/* if free space is not avaliable for this new extent, try +		/* if free space is not available for this new extent, try  		 * below to allocate a free and existing (already backed)  		 * inode from the ag.  		 */ @@ -1812,8 +1808,7 @@ static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)  	if (!iagp->nfreeinos) {  		IREAD_UNLOCK(imap->im_ipimap);  		release_metapage(mp); -		jfs_error(ip->i_sb, -			  "diAllocIno: nfreeinos = 0, but iag on freelist"); +		jfs_error(ip->i_sb, "nfreeinos = 0, but iag on freelist\n");  		return -EIO;  	} @@ -1825,7 +1820,7 @@ static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)  			IREAD_UNLOCK(imap->im_ipimap);  			release_metapage(mp);  			jfs_error(ip->i_sb, -				  "diAllocIno: free inode not found in summary map"); +				  "free inode not found in summary map\n");  			return -EIO;  		} @@ -1840,7 +1835,7 @@ static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)  	if (rem >= EXTSPERSUM) {  		IREAD_UNLOCK(imap->im_ipimap);  		release_metapage(mp); -		jfs_error(ip->i_sb, "diAllocIno: no free extent found"); +		jfs_error(ip->i_sb, "no free extent found\n");  		return -EIO;  	}  	extno = (sword << L2EXTSPERSUM) + rem; @@ -1851,7 +1846,7 @@ static int diAllocIno(struct inomap * imap, int agno, struct inode *ip)  	if (rem >= INOSPEREXT) {  		IREAD_UNLOCK(imap->im_ipimap);  		release_metapage(mp); -		jfs_error(ip->i_sb, "diAllocIno: free inode not found"); +		jfs_error(ip->i_sb, "free inode not found\n");  		return -EIO;  	} @@ -1937,7 +1932,7 @@ static int diAllocExt(struct inomap * imap, int agno, struct inode *ip)  		IREAD_LOCK(imap->im_ipimap, RDWRLOCK_IMAP);  		if ((rc = diIAGRead(imap, iagno, &mp))) {  			IREAD_UNLOCK(imap->im_ipimap); -			jfs_error(ip->i_sb, "diAllocExt: error reading iag"); +			jfs_error(ip->i_sb, "error reading iag\n");  			return rc;  		}  		iagp = (struct iag *) mp->data; @@ -1949,8 +1944,7 @@ static int diAllocExt(struct inomap * imap, int agno, struct inode *ip)  		if (sword >= SMAPSZ) {  			release_metapage(mp);  			IREAD_UNLOCK(imap->im_ipimap); -			jfs_error(ip->i_sb, -				  "diAllocExt: free ext summary map not found"); +			jfs_error(ip->i_sb, "free ext summary map not found\n");  			return -EIO;  		}  		if (~iagp->extsmap[sword]) @@ -1963,7 +1957,7 @@ static int diAllocExt(struct inomap * imap, int agno, struct inode *ip)  	if (rem >= EXTSPERSUM) {  		release_metapage(mp);  		IREAD_UNLOCK(imap->im_ipimap); -		jfs_error(ip->i_sb, "diAllocExt: free extent not found"); +		jfs_error(ip->i_sb, "free extent not found\n");  		return -EIO;  	}  	extno = (sword << L2EXTSPERSUM) + rem; @@ -2036,7 +2030,7 @@ static int diAllocBit(struct inomap * imap, struct iag * iagp, int ino)  	/* check if this is the last free inode within the iag.  	 * if so, it will have to be removed from the ag free -	 * inode list, so get the iags preceeding and following +	 * inode list, so get the iags preceding and following  	 * it on the list.  	 */  	if (iagp->nfreeinos == cpu_to_le32(1)) { @@ -2082,8 +2076,7 @@ static int diAllocBit(struct inomap * imap, struct iag * iagp, int ino)  		if (bmp)  			release_metapage(bmp); -		jfs_error(imap->im_ipimap->i_sb, -			  "diAllocBit: iag inconsistent"); +		jfs_error(imap->im_ipimap->i_sb, "iag inconsistent\n");  		return -EIO;  	} @@ -2190,7 +2183,7 @@ static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)  	/* better have free extents.  	 */  	if (!iagp->nfreeexts) { -		jfs_error(imap->im_ipimap->i_sb, "diNewExt: no free extents"); +		jfs_error(imap->im_ipimap->i_sb, "no free extents\n");  		return -EIO;  	} @@ -2208,7 +2201,7 @@ static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)  	/* check if this is the last free extent within the  	 * iag.  if so, the iag must be removed from the ag -	 * free extent list, so get the iags preceeding and +	 * free extent list, so get the iags preceding and  	 * following the iag on this list.  	 */  	if (iagp->nfreeexts == cpu_to_le32(1)) { @@ -2262,7 +2255,7 @@ static int diNewExt(struct inomap * imap, struct iag * iagp, int extno)  			}  			if (ciagp == NULL) {  				jfs_error(imap->im_ipimap->i_sb, -					  "diNewExt: ciagp == NULL"); +					  "ciagp == NULL\n");  				rc = -EIO;  				goto error_out;  			} @@ -2499,12 +2492,12 @@ diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)  			IWRITE_UNLOCK(ipimap);  			IAGFREE_UNLOCK(imap);  			jfs_error(imap->im_ipimap->i_sb, -				  "diNewIAG: ipimap->i_size is wrong"); +				  "ipimap->i_size is wrong\n");  			return -EIO;  		} -		/* get the next avaliable iag number */ +		/* get the next available iag number */  		iagno = imap->im_nextiag;  		/* make sure that we have not exceeded the maximum inode @@ -2615,7 +2608,7 @@ diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)  		duplicateIXtree(sb, blkno, xlen, &xaddr); -		/* update the next avaliable iag number */ +		/* update the next available iag number */  		imap->im_nextiag += 1;  		/* Add the iag to the iag free list so we don't lose the iag @@ -2759,8 +2752,7 @@ diUpdatePMap(struct inode *ipimap,  	iagno = INOTOIAG(inum);  	/* make sure that the iag is contained within the map */  	if (iagno >= imap->im_nextiag) { -		jfs_error(ipimap->i_sb, -			  "diUpdatePMap: the iag is outside the map"); +		jfs_error(ipimap->i_sb, "the iag is outside the map\n");  		return -EIO;  	}  	/* read the iag */ @@ -2789,13 +2781,13 @@ diUpdatePMap(struct inode *ipimap,  		 */  		if (!(le32_to_cpu(iagp->wmap[extno]) & mask)) {  			jfs_error(ipimap->i_sb, -				  "diUpdatePMap: inode %ld not marked as " -				  "allocated in wmap!", inum); +				  "inode %ld not marked as allocated in wmap!\n", +				  inum);  		}  		if (!(le32_to_cpu(iagp->pmap[extno]) & mask)) {  			jfs_error(ipimap->i_sb, -				  "diUpdatePMap: inode %ld not marked as " -				  "allocated in pmap!", inum); +				  "inode %ld not marked as allocated in pmap!\n", +				  inum);  		}  		/* update the bitmap for the extent of the freed inode */  		iagp->pmap[extno] &= cpu_to_le32(~mask); @@ -2810,15 +2802,13 @@ diUpdatePMap(struct inode *ipimap,  		if (!(le32_to_cpu(iagp->wmap[extno]) & mask)) {  			release_metapage(mp);  			jfs_error(ipimap->i_sb, -				  "diUpdatePMap: the inode is not allocated in " -				  "the working map"); +				  "the inode is not allocated in the working map\n");  			return -EIO;  		}  		if ((le32_to_cpu(iagp->pmap[extno]) & mask) != 0) {  			release_metapage(mp);  			jfs_error(ipimap->i_sb, -				  "diUpdatePMap: the inode is not free in the " -				  "persistent map"); +				  "the inode is not free in the persistent map\n");  			return -EIO;  		}  		/* update the bitmap for the extent of the allocated inode */ @@ -2910,8 +2900,7 @@ int diExtendFS(struct inode *ipimap, struct inode *ipbmap)  		iagp = (struct iag *) bp->data;  		if (le32_to_cpu(iagp->iagnum) != i) {  			release_metapage(bp); -			jfs_error(ipimap->i_sb, -				  "diExtendFs: unexpected value of iagnum"); +			jfs_error(ipimap->i_sb, "unexpected value of iagnum\n");  			return -EIO;  		} @@ -2921,10 +2910,9 @@ int diExtendFS(struct inode *ipimap, struct inode *ipbmap)  			continue;  		} -		/* agstart that computes to the same ag is treated as same; */  		agstart = le64_to_cpu(iagp->agstart); -		/* iagp->agstart = agstart & ~(mp->db_agsize - 1); */  		n = agstart >> mp->db_agl2size; +		iagp->agstart = cpu_to_le64((s64)n << mp->db_agl2size);  		/* compute backed inodes */  		numinos = (EXTSPERIAG - le32_to_cpu(iagp->nfreeexts)) @@ -2988,8 +2976,7 @@ int diExtendFS(struct inode *ipimap, struct inode *ipbmap)  	if (xnuminos != atomic_read(&imap->im_numinos) ||  	    xnumfree != atomic_read(&imap->im_numfree)) { -		jfs_error(ipimap->i_sb, -			  "diExtendFs: numinos or numfree incorrect"); +		jfs_error(ipimap->i_sb, "numinos or numfree incorrect\n");  		return -EIO;  	} @@ -3078,17 +3065,17 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip)  				ip->i_mode |= 0001;  		}  	} -	ip->i_nlink = le32_to_cpu(dip->di_nlink); +	set_nlink(ip, le32_to_cpu(dip->di_nlink)); -	jfs_ip->saved_uid = le32_to_cpu(dip->di_uid); -	if (sbi->uid == -1) +	jfs_ip->saved_uid = make_kuid(&init_user_ns, le32_to_cpu(dip->di_uid)); +	if (!uid_valid(sbi->uid))  		ip->i_uid = jfs_ip->saved_uid;  	else {  		ip->i_uid = sbi->uid;  	} -	jfs_ip->saved_gid = le32_to_cpu(dip->di_gid); -	if (sbi->gid == -1) +	jfs_ip->saved_gid = make_kgid(&init_user_ns, le32_to_cpu(dip->di_gid)); +	if (!gid_valid(sbi->gid))  		ip->i_gid = jfs_ip->saved_gid;  	else {  		ip->i_gid = sbi->gid; @@ -3152,14 +3139,16 @@ static void copy_to_dinode(struct dinode * dip, struct inode *ip)  	dip->di_size = cpu_to_le64(ip->i_size);  	dip->di_nblocks = cpu_to_le64(PBLK2LBLK(ip->i_sb, ip->i_blocks));  	dip->di_nlink = cpu_to_le32(ip->i_nlink); -	if (sbi->uid == -1) -		dip->di_uid = cpu_to_le32(ip->i_uid); +	if (!uid_valid(sbi->uid)) +		dip->di_uid = cpu_to_le32(i_uid_read(ip));  	else -		dip->di_uid = cpu_to_le32(jfs_ip->saved_uid); -	if (sbi->gid == -1) -		dip->di_gid = cpu_to_le32(ip->i_gid); +		dip->di_uid =cpu_to_le32(from_kuid(&init_user_ns, +						   jfs_ip->saved_uid)); +	if (!gid_valid(sbi->gid)) +		dip->di_gid = cpu_to_le32(i_gid_read(ip));  	else -		dip->di_gid = cpu_to_le32(jfs_ip->saved_gid); +		dip->di_gid = cpu_to_le32(from_kgid(&init_user_ns, +						    jfs_ip->saved_gid));  	jfs_get_inode_flags(jfs_ip);  	/*  	 * mode2 is only needed for storing the higher order bits.  | 
