Commit 6a63ef06 authored by Dave Chinner's avatar Dave Chinner

Merge branch 'xfs-misc-fixes-for-4.1-3' into for-next

Conflicts:
	fs/xfs/xfs_iops.c
parents a448f8f1 21c3ea18
This diff is collapsed.
...@@ -100,9 +100,11 @@ int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local); ...@@ -100,9 +100,11 @@ int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local);
int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp,
xfs_dablk_t bno, xfs_daddr_t mappedbno, xfs_dablk_t bno, xfs_daddr_t mappedbno,
struct xfs_buf **bpp); struct xfs_buf **bpp);
void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, void xfs_attr3_leaf_hdr_from_disk(struct xfs_da_geometry *geo,
struct xfs_attr3_icleaf_hdr *to,
struct xfs_attr_leafblock *from); struct xfs_attr_leafblock *from);
void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, void xfs_attr3_leaf_hdr_to_disk(struct xfs_da_geometry *geo,
struct xfs_attr_leafblock *to,
struct xfs_attr3_icleaf_hdr *from); struct xfs_attr3_icleaf_hdr *from);
#endif /* __XFS_ATTR_LEAF_H__ */ #endif /* __XFS_ATTR_LEAF_H__ */
...@@ -725,7 +725,13 @@ struct xfs_attr3_icleaf_hdr { ...@@ -725,7 +725,13 @@ struct xfs_attr3_icleaf_hdr {
__uint16_t magic; __uint16_t magic;
__uint16_t count; __uint16_t count;
__uint16_t usedbytes; __uint16_t usedbytes;
__uint16_t firstused; /*
* firstused is 32-bit here instead of 16-bit like the on-disk variant
* to support maximum fsb size of 64k without overflow issues throughout
* the attr code. Instead, the overflow condition is handled on
* conversion to/from disk.
*/
__uint32_t firstused;
__u8 holes; __u8 holes;
struct { struct {
__uint16_t base; __uint16_t base;
...@@ -733,6 +739,12 @@ struct xfs_attr3_icleaf_hdr { ...@@ -733,6 +739,12 @@ struct xfs_attr3_icleaf_hdr {
} freemap[XFS_ATTR_LEAF_MAPSIZE]; } freemap[XFS_ATTR_LEAF_MAPSIZE];
}; };
/*
* Special value to represent fs block size in the leaf header firstused field.
* Only used when block size overflows the 2-bytes available on disk.
*/
#define XFS_ATTR3_LEAF_NULLOFF 0
/* /*
* Flags used in the leaf_entry[i].flags field. * Flags used in the leaf_entry[i].flags field.
* NOTE: the INCOMPLETE bit must not collide with the flags bits specified * NOTE: the INCOMPLETE bit must not collide with the flags bits specified
......
...@@ -132,9 +132,10 @@ xfs_attr3_leaf_inactive( ...@@ -132,9 +132,10 @@ xfs_attr3_leaf_inactive(
int size; int size;
int tmp; int tmp;
int i; int i;
struct xfs_mount *mp = bp->b_target->bt_mount;
leaf = bp->b_addr; leaf = bp->b_addr;
xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf);
/* /*
* Count the number of "remote" value extents. * Count the number of "remote" value extents.
......
...@@ -225,6 +225,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) ...@@ -225,6 +225,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
int error, i; int error, i;
struct xfs_buf *bp; struct xfs_buf *bp;
struct xfs_inode *dp = context->dp; struct xfs_inode *dp = context->dp;
struct xfs_mount *mp = dp->i_mount;
trace_xfs_attr_node_list(context); trace_xfs_attr_node_list(context);
...@@ -256,7 +257,8 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) ...@@ -256,7 +257,8 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
case XFS_ATTR_LEAF_MAGIC: case XFS_ATTR_LEAF_MAGIC:
case XFS_ATTR3_LEAF_MAGIC: case XFS_ATTR3_LEAF_MAGIC:
leaf = bp->b_addr; leaf = bp->b_addr;
xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo,
&leafhdr, leaf);
entries = xfs_attr3_leaf_entryp(leaf); entries = xfs_attr3_leaf_entryp(leaf);
if (cursor->hashval > be32_to_cpu( if (cursor->hashval > be32_to_cpu(
entries[leafhdr.count - 1].hashval)) { entries[leafhdr.count - 1].hashval)) {
...@@ -340,7 +342,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) ...@@ -340,7 +342,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
xfs_trans_brelse(NULL, bp); xfs_trans_brelse(NULL, bp);
return error; return error;
} }
xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf);
if (context->seen_enough || leafhdr.forw == 0) if (context->seen_enough || leafhdr.forw == 0)
break; break;
cursor->blkno = leafhdr.forw; cursor->blkno = leafhdr.forw;
...@@ -368,11 +370,12 @@ xfs_attr3_leaf_list_int( ...@@ -368,11 +370,12 @@ xfs_attr3_leaf_list_int(
struct xfs_attr_leaf_entry *entry; struct xfs_attr_leaf_entry *entry;
int retval; int retval;
int i; int i;
struct xfs_mount *mp = context->dp->i_mount;
trace_xfs_attr_list_leaf(context); trace_xfs_attr_list_leaf(context);
leaf = bp->b_addr; leaf = bp->b_addr;
xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf);
entries = xfs_attr3_leaf_entryp(leaf); entries = xfs_attr3_leaf_entryp(leaf);
cursor = context->cursor; cursor = context->cursor;
......
...@@ -1383,7 +1383,7 @@ xfs_zero_file_space( ...@@ -1383,7 +1383,7 @@ xfs_zero_file_space(
* If we are shifting right, we will start with last extent inside file space * If we are shifting right, we will start with last extent inside file space
* and continue until we reach the block corresponding to offset. * and continue until we reach the block corresponding to offset.
*/ */
int static int
xfs_shift_file_space( xfs_shift_file_space(
struct xfs_inode *ip, struct xfs_inode *ip,
xfs_off_t offset, xfs_off_t offset,
......
...@@ -559,7 +559,7 @@ xfs_file_aio_write_checks( ...@@ -559,7 +559,7 @@ xfs_file_aio_write_checks(
if (error) if (error)
return error; return error;
error = xfs_break_layouts(inode, iolock); error = xfs_break_layouts(inode, iolock, true);
if (error) if (error)
return error; return error;
...@@ -848,7 +848,7 @@ xfs_file_fallocate( ...@@ -848,7 +848,7 @@ xfs_file_fallocate(
return -EOPNOTSUPP; return -EOPNOTSUPP;
xfs_ilock(ip, iolock); xfs_ilock(ip, iolock);
error = xfs_break_layouts(inode, &iolock); error = xfs_break_layouts(inode, &iolock, false);
if (error) if (error)
goto out_unlock; goto out_unlock;
......
...@@ -639,7 +639,7 @@ xfs_ioc_space( ...@@ -639,7 +639,7 @@ xfs_ioc_space(
return error; return error;
xfs_ilock(ip, iolock); xfs_ilock(ip, iolock);
error = xfs_break_layouts(inode, &iolock); error = xfs_break_layouts(inode, &iolock, false);
if (error) if (error)
goto out_unlock; goto out_unlock;
......
...@@ -953,7 +953,7 @@ xfs_vn_setattr( ...@@ -953,7 +953,7 @@ xfs_vn_setattr(
uint iolock = XFS_IOLOCK_EXCL; uint iolock = XFS_IOLOCK_EXCL;
xfs_ilock(ip, iolock); xfs_ilock(ip, iolock);
error = xfs_break_layouts(dentry->d_inode, &iolock); error = xfs_break_layouts(dentry->d_inode, &iolock, true);
if (!error) { if (!error) {
xfs_ilock(ip, XFS_MMAPLOCK_EXCL); xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
iolock |= XFS_MMAPLOCK_EXCL; iolock |= XFS_MMAPLOCK_EXCL;
......
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
int int
xfs_break_layouts( xfs_break_layouts(
struct inode *inode, struct inode *inode,
uint *iolock) uint *iolock,
bool with_imutex)
{ {
struct xfs_inode *ip = XFS_I(inode); struct xfs_inode *ip = XFS_I(inode);
int error; int error;
...@@ -40,8 +41,12 @@ xfs_break_layouts( ...@@ -40,8 +41,12 @@ xfs_break_layouts(
while ((error = break_layout(inode, false) == -EWOULDBLOCK)) { while ((error = break_layout(inode, false) == -EWOULDBLOCK)) {
xfs_iunlock(ip, *iolock); xfs_iunlock(ip, *iolock);
if (with_imutex && (*iolock & XFS_IOLOCK_EXCL))
mutex_unlock(&inode->i_mutex);
error = break_layout(inode, true); error = break_layout(inode, true);
*iolock = XFS_IOLOCK_EXCL; *iolock = XFS_IOLOCK_EXCL;
if (with_imutex)
mutex_lock(&inode->i_mutex);
xfs_ilock(ip, *iolock); xfs_ilock(ip, *iolock);
} }
......
...@@ -8,9 +8,10 @@ int xfs_fs_map_blocks(struct inode *inode, loff_t offset, u64 length, ...@@ -8,9 +8,10 @@ int xfs_fs_map_blocks(struct inode *inode, loff_t offset, u64 length,
int xfs_fs_commit_blocks(struct inode *inode, struct iomap *maps, int nr_maps, int xfs_fs_commit_blocks(struct inode *inode, struct iomap *maps, int nr_maps,
struct iattr *iattr); struct iattr *iattr);
int xfs_break_layouts(struct inode *inode, uint *iolock); int xfs_break_layouts(struct inode *inode, uint *iolock, bool with_imutex);
#else #else
static inline int xfs_break_layouts(struct inode *inode, uint *iolock) static inline int
xfs_break_layouts(struct inode *inode, uint *iolock, bool with_imutex)
{ {
return 0; return 0;
} }
......
...@@ -1227,6 +1227,12 @@ xfs_fs_remount( ...@@ -1227,6 +1227,12 @@ xfs_fs_remount(
/* ro -> rw */ /* ro -> rw */
if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & MS_RDONLY)) { if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & MS_RDONLY)) {
if (mp->m_flags & XFS_MOUNT_NORECOVERY) {
xfs_warn(mp,
"ro->rw transition prohibited on norecovery mount");
return -EINVAL;
}
mp->m_flags &= ~XFS_MOUNT_RDONLY; mp->m_flags &= ~XFS_MOUNT_RDONLY;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment