NFS: Reduce time spent holding the i_mutex during fallocate()
At the very least, we should not be taking the i_mutex until after checking if the server even supports ALLOCATE or DEALLOCATE, allowing v4.0 or v4.1 to exit without potentially waiting on a lock. Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
9a51940bf6
commit
f830f7ddd9
|
@ -96,9 +96,13 @@ int nfs42_proc_allocate(struct file *filep, loff_t offset, loff_t len)
|
||||||
if (!nfs_server_capable(inode, NFS_CAP_ALLOCATE))
|
if (!nfs_server_capable(inode, NFS_CAP_ALLOCATE))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
mutex_lock(&inode->i_mutex);
|
||||||
|
|
||||||
err = nfs42_proc_fallocate(&msg, filep, offset, len);
|
err = nfs42_proc_fallocate(&msg, filep, offset, len);
|
||||||
if (err == -EOPNOTSUPP)
|
if (err == -EOPNOTSUPP)
|
||||||
NFS_SERVER(inode)->caps &= ~NFS_CAP_ALLOCATE;
|
NFS_SERVER(inode)->caps &= ~NFS_CAP_ALLOCATE;
|
||||||
|
|
||||||
|
mutex_unlock(&inode->i_mutex);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,11 +118,15 @@ int nfs42_proc_deallocate(struct file *filep, loff_t offset, loff_t len)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
nfs_wb_all(inode);
|
nfs_wb_all(inode);
|
||||||
|
mutex_lock(&inode->i_mutex);
|
||||||
|
|
||||||
err = nfs42_proc_fallocate(&msg, filep, offset, len);
|
err = nfs42_proc_fallocate(&msg, filep, offset, len);
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
truncate_pagecache_range(inode, offset, (offset + len) -1);
|
truncate_pagecache_range(inode, offset, (offset + len) -1);
|
||||||
if (err == -EOPNOTSUPP)
|
if (err == -EOPNOTSUPP)
|
||||||
NFS_SERVER(inode)->caps &= ~NFS_CAP_DEALLOCATE;
|
NFS_SERVER(inode)->caps &= ~NFS_CAP_DEALLOCATE;
|
||||||
|
|
||||||
|
mutex_unlock(&inode->i_mutex);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,14 +158,9 @@ static long nfs42_fallocate(struct file *filep, int mode, loff_t offset, loff_t
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
mutex_lock(&inode->i_mutex);
|
|
||||||
if (mode & FALLOC_FL_PUNCH_HOLE)
|
if (mode & FALLOC_FL_PUNCH_HOLE)
|
||||||
ret = nfs42_proc_deallocate(filep, offset, len);
|
return nfs42_proc_deallocate(filep, offset, len);
|
||||||
else
|
return nfs42_proc_allocate(filep, offset, len);
|
||||||
ret = nfs42_proc_allocate(filep, offset, len);
|
|
||||||
mutex_unlock(&inode->i_mutex);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_NFS_V4_2 */
|
#endif /* CONFIG_NFS_V4_2 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue