Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: Long btree pointers are still 64 bit on disk [XFS] Remove the rest of the macro-to-function indirections. xfs: sanity check attr fork size xfs: fix bad_features2 fixups for the root filesystem xfs: add a lock class for group/project dquots xfs: lockdep annotations for xfs_dqlock2 xfs: add a separate lock class for the per-mount list of dquots xfs: use mnt_want_write in compat_attrmulti ioctl xfs: fix dentry aliasing issues in open_by_handle
This commit is contained in:
commit
36f392d096
31 changed files with 438 additions and 485 deletions
|
@ -1,6 +1,7 @@
|
|||
config XFS_FS
|
||||
tristate "XFS filesystem support"
|
||||
depends on BLOCK
|
||||
select EXPORTFS
|
||||
help
|
||||
XFS is a high performance journaling filesystem which originated
|
||||
on the SGI IRIX platform. It is completely multi-threaded, can
|
||||
|
|
|
@ -50,12 +50,14 @@
|
|||
#include "xfs_vnodeops.h"
|
||||
#include "xfs_quota.h"
|
||||
#include "xfs_inode_item.h"
|
||||
#include "xfs_export.h"
|
||||
|
||||
#include <linux/capability.h>
|
||||
#include <linux/dcache.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/namei.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/exportfs.h>
|
||||
|
||||
/*
|
||||
* xfs_find_handle maps from userspace xfs_fsop_handlereq structure to
|
||||
|
@ -164,97 +166,69 @@ xfs_find_handle(
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Convert userspace handle data into inode.
|
||||
*
|
||||
* We use the fact that all the fsop_handlereq ioctl calls have a data
|
||||
* structure argument whose first component is always a xfs_fsop_handlereq_t,
|
||||
* so we can pass that sub structure into this handy, shared routine.
|
||||
*
|
||||
* If no error, caller must always iput the returned inode.
|
||||
* No need to do permission checks on the various pathname components
|
||||
* as the handle operations are privileged.
|
||||
*/
|
||||
STATIC int
|
||||
xfs_vget_fsop_handlereq(
|
||||
xfs_mount_t *mp,
|
||||
struct inode *parinode, /* parent inode pointer */
|
||||
xfs_fsop_handlereq_t *hreq,
|
||||
struct inode **inode)
|
||||
xfs_handle_acceptable(
|
||||
void *context,
|
||||
struct dentry *dentry)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert userspace handle data into a dentry.
|
||||
*/
|
||||
struct dentry *
|
||||
xfs_handle_to_dentry(
|
||||
struct file *parfilp,
|
||||
void __user *uhandle,
|
||||
u32 hlen)
|
||||
{
|
||||
void __user *hanp;
|
||||
size_t hlen;
|
||||
xfs_fid_t *xfid;
|
||||
xfs_handle_t *handlep;
|
||||
xfs_handle_t handle;
|
||||
xfs_inode_t *ip;
|
||||
xfs_ino_t ino;
|
||||
__u32 igen;
|
||||
int error;
|
||||
struct xfs_fid64 fid;
|
||||
|
||||
/*
|
||||
* Only allow handle opens under a directory.
|
||||
*/
|
||||
if (!S_ISDIR(parinode->i_mode))
|
||||
return XFS_ERROR(ENOTDIR);
|
||||
if (!S_ISDIR(parfilp->f_path.dentry->d_inode->i_mode))
|
||||
return ERR_PTR(-ENOTDIR);
|
||||
|
||||
hanp = hreq->ihandle;
|
||||
hlen = hreq->ihandlen;
|
||||
handlep = &handle;
|
||||
if (hlen != sizeof(xfs_handle_t))
|
||||
return ERR_PTR(-EINVAL);
|
||||
if (copy_from_user(&handle, uhandle, hlen))
|
||||
return ERR_PTR(-EFAULT);
|
||||
if (handle.ha_fid.fid_len !=
|
||||
sizeof(handle.ha_fid) - sizeof(handle.ha_fid.fid_len))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (hlen < sizeof(handlep->ha_fsid) || hlen > sizeof(*handlep))
|
||||
return XFS_ERROR(EINVAL);
|
||||
if (copy_from_user(handlep, hanp, hlen))
|
||||
return XFS_ERROR(EFAULT);
|
||||
if (hlen < sizeof(*handlep))
|
||||
memset(((char *)handlep) + hlen, 0, sizeof(*handlep) - hlen);
|
||||
if (hlen > sizeof(handlep->ha_fsid)) {
|
||||
if (handlep->ha_fid.fid_len !=
|
||||
(hlen - sizeof(handlep->ha_fsid) -
|
||||
sizeof(handlep->ha_fid.fid_len)) ||
|
||||
handlep->ha_fid.fid_pad)
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
memset(&fid, 0, sizeof(struct fid));
|
||||
fid.ino = handle.ha_fid.fid_ino;
|
||||
fid.gen = handle.ha_fid.fid_gen;
|
||||
|
||||
/*
|
||||
* Crack the handle, obtain the inode # & generation #
|
||||
*/
|
||||
xfid = (struct xfs_fid *)&handlep->ha_fid;
|
||||
if (xfid->fid_len == sizeof(*xfid) - sizeof(xfid->fid_len)) {
|
||||
ino = xfid->fid_ino;
|
||||
igen = xfid->fid_gen;
|
||||
} else {
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
return exportfs_decode_fh(parfilp->f_path.mnt, (struct fid *)&fid, 3,
|
||||
FILEID_INO32_GEN | XFS_FILEID_TYPE_64FLAG,
|
||||
xfs_handle_acceptable, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the XFS inode, building a Linux inode to go with it.
|
||||
*/
|
||||
error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0);
|
||||
if (error)
|
||||
return error;
|
||||
if (ip == NULL)
|
||||
return XFS_ERROR(EIO);
|
||||
if (ip->i_d.di_gen != igen) {
|
||||
xfs_iput_new(ip, XFS_ILOCK_SHARED);
|
||||
return XFS_ERROR(ENOENT);
|
||||
}
|
||||
|
||||
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
||||
|
||||
*inode = VFS_I(ip);
|
||||
return 0;
|
||||
STATIC struct dentry *
|
||||
xfs_handlereq_to_dentry(
|
||||
struct file *parfilp,
|
||||
xfs_fsop_handlereq_t *hreq)
|
||||
{
|
||||
return xfs_handle_to_dentry(parfilp, hreq->ihandle, hreq->ihandlen);
|
||||
}
|
||||
|
||||
int
|
||||
xfs_open_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
xfs_fsop_handlereq_t *hreq,
|
||||
struct file *parfilp,
|
||||
struct inode *parinode)
|
||||
xfs_fsop_handlereq_t *hreq)
|
||||
{
|
||||
const struct cred *cred = current_cred();
|
||||
int error;
|
||||
int new_fd;
|
||||
int fd;
|
||||
int permflag;
|
||||
struct file *filp;
|
||||
struct inode *inode;
|
||||
|
@ -263,19 +237,21 @@ xfs_open_by_handle(
|
|||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -XFS_ERROR(EPERM);
|
||||
|
||||
error = xfs_vget_fsop_handlereq(mp, parinode, hreq, &inode);
|
||||
if (error)
|
||||
return -error;
|
||||
dentry = xfs_handlereq_to_dentry(parfilp, hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
inode = dentry->d_inode;
|
||||
|
||||
/* Restrict xfs_open_by_handle to directories & regular files. */
|
||||
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) {
|
||||
iput(inode);
|
||||
return -XFS_ERROR(EINVAL);
|
||||
error = -XFS_ERROR(EPERM);
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
#if BITS_PER_LONG != 32
|
||||
hreq->oflags |= O_LARGEFILE;
|
||||
#endif
|
||||
|
||||
/* Put open permission in namei format. */
|
||||
permflag = hreq->oflags;
|
||||
if ((permflag+1) & O_ACCMODE)
|
||||
|
@ -285,50 +261,45 @@ xfs_open_by_handle(
|
|||
|
||||
if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) &&
|
||||
(permflag & FMODE_WRITE) && IS_APPEND(inode)) {
|
||||
iput(inode);
|
||||
return -XFS_ERROR(EPERM);
|
||||
error = -XFS_ERROR(EPERM);
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
if ((permflag & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
|
||||
iput(inode);
|
||||
return -XFS_ERROR(EACCES);
|
||||
error = -XFS_ERROR(EACCES);
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
/* Can't write directories. */
|
||||
if ( S_ISDIR(inode->i_mode) && (permflag & FMODE_WRITE)) {
|
||||
iput(inode);
|
||||
return -XFS_ERROR(EISDIR);
|
||||
if (S_ISDIR(inode->i_mode) && (permflag & FMODE_WRITE)) {
|
||||
error = -XFS_ERROR(EISDIR);
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
if ((new_fd = get_unused_fd()) < 0) {
|
||||
iput(inode);
|
||||
return new_fd;
|
||||
fd = get_unused_fd();
|
||||
if (fd < 0) {
|
||||
error = fd;
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
dentry = d_obtain_alias(inode);
|
||||
if (IS_ERR(dentry)) {
|
||||
put_unused_fd(new_fd);
|
||||
return PTR_ERR(dentry);
|
||||
}
|
||||
|
||||
/* Ensure umount returns EBUSY on umounts while this file is open. */
|
||||
mntget(parfilp->f_path.mnt);
|
||||
|
||||
/* Create file pointer. */
|
||||
filp = dentry_open(dentry, parfilp->f_path.mnt, hreq->oflags, cred);
|
||||
filp = dentry_open(dentry, mntget(parfilp->f_path.mnt),
|
||||
hreq->oflags, cred);
|
||||
if (IS_ERR(filp)) {
|
||||
put_unused_fd(new_fd);
|
||||
return -XFS_ERROR(-PTR_ERR(filp));
|
||||
put_unused_fd(fd);
|
||||
return PTR_ERR(filp);
|
||||
}
|
||||
|
||||
if (inode->i_mode & S_IFREG) {
|
||||
/* invisible operation should not change atime */
|
||||
filp->f_flags |= O_NOATIME;
|
||||
filp->f_mode |= FMODE_NOCMTIME;
|
||||
}
|
||||
|
||||
fd_install(new_fd, filp);
|
||||
return new_fd;
|
||||
fd_install(fd, filp);
|
||||
return fd;
|
||||
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -359,11 +330,10 @@ do_readlink(
|
|||
|
||||
int
|
||||
xfs_readlink_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
xfs_fsop_handlereq_t *hreq,
|
||||
struct inode *parinode)
|
||||
struct file *parfilp,
|
||||
xfs_fsop_handlereq_t *hreq)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
__u32 olen;
|
||||
void *link;
|
||||
int error;
|
||||
|
@ -371,26 +341,28 @@ xfs_readlink_by_handle(
|
|||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -XFS_ERROR(EPERM);
|
||||
|
||||
error = xfs_vget_fsop_handlereq(mp, parinode, hreq, &inode);
|
||||
if (error)
|
||||
return -error;
|
||||
dentry = xfs_handlereq_to_dentry(parfilp, hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
/* Restrict this handle operation to symlinks only. */
|
||||
if (!S_ISLNK(inode->i_mode)) {
|
||||
if (!S_ISLNK(dentry->d_inode->i_mode)) {
|
||||
error = -XFS_ERROR(EINVAL);
|
||||
goto out_iput;
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
if (copy_from_user(&olen, hreq->ohandlen, sizeof(__u32))) {
|
||||
error = -XFS_ERROR(EFAULT);
|
||||
goto out_iput;
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
link = kmalloc(MAXPATHLEN+1, GFP_KERNEL);
|
||||
if (!link)
|
||||
goto out_iput;
|
||||
if (!link) {
|
||||
error = -XFS_ERROR(ENOMEM);
|
||||
goto out_dput;
|
||||
}
|
||||
|
||||
error = -xfs_readlink(XFS_I(inode), link);
|
||||
error = -xfs_readlink(XFS_I(dentry->d_inode), link);
|
||||
if (error)
|
||||
goto out_kfree;
|
||||
error = do_readlink(hreq->ohandle, olen, link);
|
||||
|
@ -399,32 +371,31 @@ xfs_readlink_by_handle(
|
|||
|
||||
out_kfree:
|
||||
kfree(link);
|
||||
out_iput:
|
||||
iput(inode);
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_fssetdm_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg,
|
||||
struct inode *parinode)
|
||||
struct file *parfilp,
|
||||
void __user *arg)
|
||||
{
|
||||
int error;
|
||||
struct fsdmidata fsd;
|
||||
xfs_fsop_setdm_handlereq_t dmhreq;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
|
||||
if (!capable(CAP_MKNOD))
|
||||
return -XFS_ERROR(EPERM);
|
||||
if (copy_from_user(&dmhreq, arg, sizeof(xfs_fsop_setdm_handlereq_t)))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
|
||||
error = xfs_vget_fsop_handlereq(mp, parinode, &dmhreq.hreq, &inode);
|
||||
if (error)
|
||||
return -error;
|
||||
dentry = xfs_handlereq_to_dentry(parfilp, &dmhreq.hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
|
||||
if (IS_IMMUTABLE(dentry->d_inode) || IS_APPEND(dentry->d_inode)) {
|
||||
error = -XFS_ERROR(EPERM);
|
||||
goto out;
|
||||
}
|
||||
|
@ -434,24 +405,23 @@ xfs_fssetdm_by_handle(
|
|||
goto out;
|
||||
}
|
||||
|
||||
error = -xfs_set_dmattrs(XFS_I(inode), fsd.fsd_dmevmask,
|
||||
error = -xfs_set_dmattrs(XFS_I(dentry->d_inode), fsd.fsd_dmevmask,
|
||||
fsd.fsd_dmstate);
|
||||
|
||||
out:
|
||||
iput(inode);
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_attrlist_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg,
|
||||
struct inode *parinode)
|
||||
struct file *parfilp,
|
||||
void __user *arg)
|
||||
{
|
||||
int error;
|
||||
int error = -ENOMEM;
|
||||
attrlist_cursor_kern_t *cursor;
|
||||
xfs_fsop_attrlist_handlereq_t al_hreq;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
char *kbuf;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
|
@ -467,16 +437,16 @@ xfs_attrlist_by_handle(
|
|||
if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE))
|
||||
return -XFS_ERROR(EINVAL);
|
||||
|
||||
error = xfs_vget_fsop_handlereq(mp, parinode, &al_hreq.hreq, &inode);
|
||||
if (error)
|
||||
goto out;
|
||||
dentry = xfs_handlereq_to_dentry(parfilp, &al_hreq.hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
kbuf = kmalloc(al_hreq.buflen, GFP_KERNEL);
|
||||
if (!kbuf)
|
||||
goto out_vn_rele;
|
||||
goto out_dput;
|
||||
|
||||
cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
|
||||
error = xfs_attr_list(XFS_I(inode), kbuf, al_hreq.buflen,
|
||||
error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen,
|
||||
al_hreq.flags, cursor);
|
||||
if (error)
|
||||
goto out_kfree;
|
||||
|
@ -486,10 +456,9 @@ xfs_attrlist_by_handle(
|
|||
|
||||
out_kfree:
|
||||
kfree(kbuf);
|
||||
out_vn_rele:
|
||||
iput(inode);
|
||||
out:
|
||||
return -error;
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -564,15 +533,13 @@ xfs_attrmulti_attr_remove(
|
|||
|
||||
STATIC int
|
||||
xfs_attrmulti_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg,
|
||||
struct file *parfilp,
|
||||
struct inode *parinode)
|
||||
void __user *arg)
|
||||
{
|
||||
int error;
|
||||
xfs_attr_multiop_t *ops;
|
||||
xfs_fsop_attrmulti_handlereq_t am_hreq;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
unsigned int i, size;
|
||||
char *attr_name;
|
||||
|
||||
|
@ -581,19 +548,19 @@ xfs_attrmulti_by_handle(
|
|||
if (copy_from_user(&am_hreq, arg, sizeof(xfs_fsop_attrmulti_handlereq_t)))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
|
||||
error = xfs_vget_fsop_handlereq(mp, parinode, &am_hreq.hreq, &inode);
|
||||
if (error)
|
||||
goto out;
|
||||
dentry = xfs_handlereq_to_dentry(parfilp, &am_hreq.hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
error = E2BIG;
|
||||
size = am_hreq.opcount * sizeof(xfs_attr_multiop_t);
|
||||
if (!size || size > 16 * PAGE_SIZE)
|
||||
goto out_vn_rele;
|
||||
goto out_dput;
|
||||
|
||||
error = ENOMEM;
|
||||
ops = kmalloc(size, GFP_KERNEL);
|
||||
if (!ops)
|
||||
goto out_vn_rele;
|
||||
goto out_dput;
|
||||
|
||||
error = EFAULT;
|
||||
if (copy_from_user(ops, am_hreq.ops, size))
|
||||
|
@ -615,25 +582,28 @@ xfs_attrmulti_by_handle(
|
|||
|
||||
switch (ops[i].am_opcode) {
|
||||
case ATTR_OP_GET:
|
||||
ops[i].am_error = xfs_attrmulti_attr_get(inode,
|
||||
attr_name, ops[i].am_attrvalue,
|
||||
&ops[i].am_length, ops[i].am_flags);
|
||||
ops[i].am_error = xfs_attrmulti_attr_get(
|
||||
dentry->d_inode, attr_name,
|
||||
ops[i].am_attrvalue, &ops[i].am_length,
|
||||
ops[i].am_flags);
|
||||
break;
|
||||
case ATTR_OP_SET:
|
||||
ops[i].am_error = mnt_want_write(parfilp->f_path.mnt);
|
||||
if (ops[i].am_error)
|
||||
break;
|
||||
ops[i].am_error = xfs_attrmulti_attr_set(inode,
|
||||
attr_name, ops[i].am_attrvalue,
|
||||
ops[i].am_length, ops[i].am_flags);
|
||||
ops[i].am_error = xfs_attrmulti_attr_set(
|
||||
dentry->d_inode, attr_name,
|
||||
ops[i].am_attrvalue, ops[i].am_length,
|
||||
ops[i].am_flags);
|
||||
mnt_drop_write(parfilp->f_path.mnt);
|
||||
break;
|
||||
case ATTR_OP_REMOVE:
|
||||
ops[i].am_error = mnt_want_write(parfilp->f_path.mnt);
|
||||
if (ops[i].am_error)
|
||||
break;
|
||||
ops[i].am_error = xfs_attrmulti_attr_remove(inode,
|
||||
attr_name, ops[i].am_flags);
|
||||
ops[i].am_error = xfs_attrmulti_attr_remove(
|
||||
dentry->d_inode, attr_name,
|
||||
ops[i].am_flags);
|
||||
mnt_drop_write(parfilp->f_path.mnt);
|
||||
break;
|
||||
default:
|
||||
|
@ -647,9 +617,8 @@ xfs_attrmulti_by_handle(
|
|||
kfree(attr_name);
|
||||
out_kfree_ops:
|
||||
kfree(ops);
|
||||
out_vn_rele:
|
||||
iput(inode);
|
||||
out:
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
return -error;
|
||||
}
|
||||
|
||||
|
@ -1440,23 +1409,23 @@ xfs_file_ioctl(
|
|||
|
||||
if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
return xfs_open_by_handle(mp, &hreq, filp, inode);
|
||||
return xfs_open_by_handle(filp, &hreq);
|
||||
}
|
||||
case XFS_IOC_FSSETDM_BY_HANDLE:
|
||||
return xfs_fssetdm_by_handle(mp, arg, inode);
|
||||
return xfs_fssetdm_by_handle(filp, arg);
|
||||
|
||||
case XFS_IOC_READLINK_BY_HANDLE: {
|
||||
xfs_fsop_handlereq_t hreq;
|
||||
|
||||
if (copy_from_user(&hreq, arg, sizeof(xfs_fsop_handlereq_t)))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
return xfs_readlink_by_handle(mp, &hreq, inode);
|
||||
return xfs_readlink_by_handle(filp, &hreq);
|
||||
}
|
||||
case XFS_IOC_ATTRLIST_BY_HANDLE:
|
||||
return xfs_attrlist_by_handle(mp, arg, inode);
|
||||
return xfs_attrlist_by_handle(filp, arg);
|
||||
|
||||
case XFS_IOC_ATTRMULTI_BY_HANDLE:
|
||||
return xfs_attrmulti_by_handle(mp, arg, filp, inode);
|
||||
return xfs_attrmulti_by_handle(filp, arg);
|
||||
|
||||
case XFS_IOC_SWAPEXT: {
|
||||
struct xfs_swapext sxp;
|
||||
|
|
|
@ -34,16 +34,13 @@ xfs_find_handle(
|
|||
|
||||
extern int
|
||||
xfs_open_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
xfs_fsop_handlereq_t *hreq,
|
||||
struct file *parfilp,
|
||||
struct inode *parinode);
|
||||
xfs_fsop_handlereq_t *hreq);
|
||||
|
||||
extern int
|
||||
xfs_readlink_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
xfs_fsop_handlereq_t *hreq,
|
||||
struct inode *parinode);
|
||||
struct file *parfilp,
|
||||
xfs_fsop_handlereq_t *hreq);
|
||||
|
||||
extern int
|
||||
xfs_attrmulti_attr_get(
|
||||
|
@ -67,6 +64,12 @@ xfs_attrmulti_attr_remove(
|
|||
char *name,
|
||||
__uint32_t flags);
|
||||
|
||||
extern struct dentry *
|
||||
xfs_handle_to_dentry(
|
||||
struct file *parfilp,
|
||||
void __user *uhandle,
|
||||
u32 hlen);
|
||||
|
||||
extern long
|
||||
xfs_file_ioctl(
|
||||
struct file *filp,
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
#include <linux/compat.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/mount.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include "xfs.h"
|
||||
#include "xfs_fs.h"
|
||||
|
@ -340,96 +341,24 @@ xfs_compat_handlereq_copyin(
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert userspace handle data into inode.
|
||||
*
|
||||
* We use the fact that all the fsop_handlereq ioctl calls have a data
|
||||
* structure argument whose first component is always a xfs_fsop_handlereq_t,
|
||||
* so we can pass that sub structure into this handy, shared routine.
|
||||
*
|
||||
* If no error, caller must always iput the returned inode.
|
||||
*/
|
||||
STATIC int
|
||||
xfs_vget_fsop_handlereq_compat(
|
||||
xfs_mount_t *mp,
|
||||
struct inode *parinode, /* parent inode pointer */
|
||||
compat_xfs_fsop_handlereq_t *hreq,
|
||||
struct inode **inode)
|
||||
STATIC struct dentry *
|
||||
xfs_compat_handlereq_to_dentry(
|
||||
struct file *parfilp,
|
||||
compat_xfs_fsop_handlereq_t *hreq)
|
||||
{
|
||||
void __user *hanp;
|
||||
size_t hlen;
|
||||
xfs_fid_t *xfid;
|
||||
xfs_handle_t *handlep;
|
||||
xfs_handle_t handle;
|
||||
xfs_inode_t *ip;
|
||||
xfs_ino_t ino;
|
||||
__u32 igen;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* Only allow handle opens under a directory.
|
||||
*/
|
||||
if (!S_ISDIR(parinode->i_mode))
|
||||
return XFS_ERROR(ENOTDIR);
|
||||
|
||||
hanp = compat_ptr(hreq->ihandle);
|
||||
hlen = hreq->ihandlen;
|
||||
handlep = &handle;
|
||||
|
||||
if (hlen < sizeof(handlep->ha_fsid) || hlen > sizeof(*handlep))
|
||||
return XFS_ERROR(EINVAL);
|
||||
if (copy_from_user(handlep, hanp, hlen))
|
||||
return XFS_ERROR(EFAULT);
|
||||
if (hlen < sizeof(*handlep))
|
||||
memset(((char *)handlep) + hlen, 0, sizeof(*handlep) - hlen);
|
||||
if (hlen > sizeof(handlep->ha_fsid)) {
|
||||
if (handlep->ha_fid.fid_len !=
|
||||
(hlen - sizeof(handlep->ha_fsid) -
|
||||
sizeof(handlep->ha_fid.fid_len)) ||
|
||||
handlep->ha_fid.fid_pad)
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Crack the handle, obtain the inode # & generation #
|
||||
*/
|
||||
xfid = (struct xfs_fid *)&handlep->ha_fid;
|
||||
if (xfid->fid_len == sizeof(*xfid) - sizeof(xfid->fid_len)) {
|
||||
ino = xfid->fid_ino;
|
||||
igen = xfid->fid_gen;
|
||||
} else {
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the XFS inode, building a Linux inode to go with it.
|
||||
*/
|
||||
error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_SHARED, &ip, 0);
|
||||
if (error)
|
||||
return error;
|
||||
if (ip == NULL)
|
||||
return XFS_ERROR(EIO);
|
||||
if (ip->i_d.di_gen != igen) {
|
||||
xfs_iput_new(ip, XFS_ILOCK_SHARED);
|
||||
return XFS_ERROR(ENOENT);
|
||||
}
|
||||
|
||||
xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
||||
|
||||
*inode = VFS_I(ip);
|
||||
return 0;
|
||||
return xfs_handle_to_dentry(parfilp,
|
||||
compat_ptr(hreq->ihandle), hreq->ihandlen);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_compat_attrlist_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg,
|
||||
struct inode *parinode)
|
||||
struct file *parfilp,
|
||||
void __user *arg)
|
||||
{
|
||||
int error;
|
||||
attrlist_cursor_kern_t *cursor;
|
||||
compat_xfs_fsop_attrlist_handlereq_t al_hreq;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
char *kbuf;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
|
@ -446,17 +375,17 @@ xfs_compat_attrlist_by_handle(
|
|||
if (al_hreq.flags & ~(ATTR_ROOT | ATTR_SECURE))
|
||||
return -XFS_ERROR(EINVAL);
|
||||
|
||||
error = xfs_vget_fsop_handlereq_compat(mp, parinode, &al_hreq.hreq,
|
||||
&inode);
|
||||
if (error)
|
||||
goto out;
|
||||
dentry = xfs_compat_handlereq_to_dentry(parfilp, &al_hreq.hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
error = -ENOMEM;
|
||||
kbuf = kmalloc(al_hreq.buflen, GFP_KERNEL);
|
||||
if (!kbuf)
|
||||
goto out_vn_rele;
|
||||
goto out_dput;
|
||||
|
||||
cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
|
||||
error = xfs_attr_list(XFS_I(inode), kbuf, al_hreq.buflen,
|
||||
error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen,
|
||||
al_hreq.flags, cursor);
|
||||
if (error)
|
||||
goto out_kfree;
|
||||
|
@ -466,22 +395,20 @@ xfs_compat_attrlist_by_handle(
|
|||
|
||||
out_kfree:
|
||||
kfree(kbuf);
|
||||
out_vn_rele:
|
||||
iput(inode);
|
||||
out:
|
||||
return -error;
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_compat_attrmulti_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg,
|
||||
struct inode *parinode)
|
||||
struct file *parfilp,
|
||||
void __user *arg)
|
||||
{
|
||||
int error;
|
||||
compat_xfs_attr_multiop_t *ops;
|
||||
compat_xfs_fsop_attrmulti_handlereq_t am_hreq;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
unsigned int i, size;
|
||||
char *attr_name;
|
||||
|
||||
|
@ -491,20 +418,19 @@ xfs_compat_attrmulti_by_handle(
|
|||
sizeof(compat_xfs_fsop_attrmulti_handlereq_t)))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
|
||||
error = xfs_vget_fsop_handlereq_compat(mp, parinode, &am_hreq.hreq,
|
||||
&inode);
|
||||
if (error)
|
||||
goto out;
|
||||
dentry = xfs_compat_handlereq_to_dentry(parfilp, &am_hreq.hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
error = E2BIG;
|
||||
size = am_hreq.opcount * sizeof(compat_xfs_attr_multiop_t);
|
||||
if (!size || size > 16 * PAGE_SIZE)
|
||||
goto out_vn_rele;
|
||||
goto out_dput;
|
||||
|
||||
error = ENOMEM;
|
||||
ops = kmalloc(size, GFP_KERNEL);
|
||||
if (!ops)
|
||||
goto out_vn_rele;
|
||||
goto out_dput;
|
||||
|
||||
error = EFAULT;
|
||||
if (copy_from_user(ops, compat_ptr(am_hreq.ops), size))
|
||||
|
@ -527,20 +453,29 @@ xfs_compat_attrmulti_by_handle(
|
|||
|
||||
switch (ops[i].am_opcode) {
|
||||
case ATTR_OP_GET:
|
||||
ops[i].am_error = xfs_attrmulti_attr_get(inode,
|
||||
attr_name,
|
||||
ops[i].am_error = xfs_attrmulti_attr_get(
|
||||
dentry->d_inode, attr_name,
|
||||
compat_ptr(ops[i].am_attrvalue),
|
||||
&ops[i].am_length, ops[i].am_flags);
|
||||
break;
|
||||
case ATTR_OP_SET:
|
||||
ops[i].am_error = xfs_attrmulti_attr_set(inode,
|
||||
attr_name,
|
||||
ops[i].am_error = mnt_want_write(parfilp->f_path.mnt);
|
||||
if (ops[i].am_error)
|
||||
break;
|
||||
ops[i].am_error = xfs_attrmulti_attr_set(
|
||||
dentry->d_inode, attr_name,
|
||||
compat_ptr(ops[i].am_attrvalue),
|
||||
ops[i].am_length, ops[i].am_flags);
|
||||
mnt_drop_write(parfilp->f_path.mnt);
|
||||
break;
|
||||
case ATTR_OP_REMOVE:
|
||||
ops[i].am_error = xfs_attrmulti_attr_remove(inode,
|
||||
attr_name, ops[i].am_flags);
|
||||
ops[i].am_error = mnt_want_write(parfilp->f_path.mnt);
|
||||
if (ops[i].am_error)
|
||||
break;
|
||||
ops[i].am_error = xfs_attrmulti_attr_remove(
|
||||
dentry->d_inode, attr_name,
|
||||
ops[i].am_flags);
|
||||
mnt_drop_write(parfilp->f_path.mnt);
|
||||
break;
|
||||
default:
|
||||
ops[i].am_error = EINVAL;
|
||||
|
@ -553,22 +488,20 @@ xfs_compat_attrmulti_by_handle(
|
|||
kfree(attr_name);
|
||||
out_kfree_ops:
|
||||
kfree(ops);
|
||||
out_vn_rele:
|
||||
iput(inode);
|
||||
out:
|
||||
out_dput:
|
||||
dput(dentry);
|
||||
return -error;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_compat_fssetdm_by_handle(
|
||||
xfs_mount_t *mp,
|
||||
void __user *arg,
|
||||
struct inode *parinode)
|
||||
struct file *parfilp,
|
||||
void __user *arg)
|
||||
{
|
||||
int error;
|
||||
struct fsdmidata fsd;
|
||||
compat_xfs_fsop_setdm_handlereq_t dmhreq;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
|
||||
if (!capable(CAP_MKNOD))
|
||||
return -XFS_ERROR(EPERM);
|
||||
|
@ -576,12 +509,11 @@ xfs_compat_fssetdm_by_handle(
|
|||
sizeof(compat_xfs_fsop_setdm_handlereq_t)))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
|
||||
error = xfs_vget_fsop_handlereq_compat(mp, parinode, &dmhreq.hreq,
|
||||
&inode);
|
||||
if (error)
|
||||
return -error;
|
||||
dentry = xfs_compat_handlereq_to_dentry(parfilp, &dmhreq.hreq);
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
|
||||
if (IS_IMMUTABLE(dentry->d_inode) || IS_APPEND(dentry->d_inode)) {
|
||||
error = -XFS_ERROR(EPERM);
|
||||
goto out;
|
||||
}
|
||||
|
@ -591,11 +523,11 @@ xfs_compat_fssetdm_by_handle(
|
|||
goto out;
|
||||
}
|
||||
|
||||
error = -xfs_set_dmattrs(XFS_I(inode), fsd.fsd_dmevmask,
|
||||
error = -xfs_set_dmattrs(XFS_I(dentry->d_inode), fsd.fsd_dmevmask,
|
||||
fsd.fsd_dmstate);
|
||||
|
||||
out:
|
||||
iput(inode);
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -722,21 +654,21 @@ xfs_file_compat_ioctl(
|
|||
|
||||
if (xfs_compat_handlereq_copyin(&hreq, arg))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
return xfs_open_by_handle(mp, &hreq, filp, inode);
|
||||
return xfs_open_by_handle(filp, &hreq);
|
||||
}
|
||||
case XFS_IOC_READLINK_BY_HANDLE_32: {
|
||||
struct xfs_fsop_handlereq hreq;
|
||||
|
||||
if (xfs_compat_handlereq_copyin(&hreq, arg))
|
||||
return -XFS_ERROR(EFAULT);
|
||||
return xfs_readlink_by_handle(mp, &hreq, inode);
|
||||
return xfs_readlink_by_handle(filp, &hreq);
|
||||
}
|
||||
case XFS_IOC_ATTRLIST_BY_HANDLE_32:
|
||||
return xfs_compat_attrlist_by_handle(mp, arg, inode);
|
||||
return xfs_compat_attrlist_by_handle(filp, arg);
|
||||
case XFS_IOC_ATTRMULTI_BY_HANDLE_32:
|
||||
return xfs_compat_attrmulti_by_handle(mp, arg, inode);
|
||||
return xfs_compat_attrmulti_by_handle(filp, arg);
|
||||
case XFS_IOC_FSSETDM_BY_HANDLE_32:
|
||||
return xfs_compat_fssetdm_by_handle(mp, arg, inode);
|
||||
return xfs_compat_fssetdm_by_handle(filp, arg);
|
||||
default:
|
||||
return -XFS_ERROR(ENOIOCTLCMD);
|
||||
}
|
||||
|
|
|
@ -1197,6 +1197,7 @@ xfs_fs_remount(
|
|||
struct xfs_mount *mp = XFS_M(sb);
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
char *p;
|
||||
int error;
|
||||
|
||||
while ((p = strsep(&options, ",")) != NULL) {
|
||||
int token;
|
||||
|
@ -1247,11 +1248,25 @@ xfs_fs_remount(
|
|||
}
|
||||
}
|
||||
|
||||
/* rw/ro -> rw */
|
||||
/* ro -> rw */
|
||||
if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & MS_RDONLY)) {
|
||||
mp->m_flags &= ~XFS_MOUNT_RDONLY;
|
||||
if (mp->m_flags & XFS_MOUNT_BARRIER)
|
||||
xfs_mountfs_check_barriers(mp);
|
||||
|
||||
/*
|
||||
* If this is the first remount to writeable state we
|
||||
* might have some superblock changes to update.
|
||||
*/
|
||||
if (mp->m_update_flags) {
|
||||
error = xfs_mount_log_sb(mp, mp->m_update_flags);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: failed to write sb changes");
|
||||
return error;
|
||||
}
|
||||
mp->m_update_flags = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* rw -> ro */
|
||||
|
|
|
@ -73,6 +73,8 @@ int xfs_dqreq_num;
|
|||
int xfs_dqerror_mod = 33;
|
||||
#endif
|
||||
|
||||
static struct lock_class_key xfs_dquot_other_class;
|
||||
|
||||
/*
|
||||
* Allocate and initialize a dquot. We don't always allocate fresh memory;
|
||||
* we try to reclaim a free dquot if the number of incore dquots are above
|
||||
|
@ -139,7 +141,15 @@ xfs_qm_dqinit(
|
|||
ASSERT(dqp->q_trace);
|
||||
xfs_dqtrace_entry(dqp, "DQRECLAIMED_INIT");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* In either case we need to make sure group quotas have a different
|
||||
* lock class than user quotas, to make sure lockdep knows we can
|
||||
* locks of one of each at the same time.
|
||||
*/
|
||||
if (!(type & XFS_DQ_USER))
|
||||
lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class);
|
||||
|
||||
/*
|
||||
* log item gets initialized later
|
||||
|
@ -421,7 +431,7 @@ xfs_qm_dqalloc(
|
|||
/*
|
||||
* Initialize the bmap freelist prior to calling bmapi code.
|
||||
*/
|
||||
XFS_BMAP_INIT(&flist, &firstblock);
|
||||
xfs_bmap_init(&flist, &firstblock);
|
||||
xfs_ilock(quotip, XFS_ILOCK_EXCL);
|
||||
/*
|
||||
* Return if this type of quotas is turned off while we didn't
|
||||
|
@ -1383,6 +1393,12 @@ xfs_dqunlock_nonotify(
|
|||
mutex_unlock(&(dqp->q_qlock));
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock two xfs_dquot structures.
|
||||
*
|
||||
* To avoid deadlocks we always lock the quota structure with
|
||||
* the lowerd id first.
|
||||
*/
|
||||
void
|
||||
xfs_dqlock2(
|
||||
xfs_dquot_t *d1,
|
||||
|
@ -1392,18 +1408,16 @@ xfs_dqlock2(
|
|||
ASSERT(d1 != d2);
|
||||
if (be32_to_cpu(d1->q_core.d_id) >
|
||||
be32_to_cpu(d2->q_core.d_id)) {
|
||||
xfs_dqlock(d2);
|
||||
xfs_dqlock(d1);
|
||||
mutex_lock(&d2->q_qlock);
|
||||
mutex_lock_nested(&d1->q_qlock, XFS_QLOCK_NESTED);
|
||||
} else {
|
||||
xfs_dqlock(d1);
|
||||
xfs_dqlock(d2);
|
||||
}
|
||||
} else {
|
||||
if (d1) {
|
||||
xfs_dqlock(d1);
|
||||
} else if (d2) {
|
||||
xfs_dqlock(d2);
|
||||
mutex_lock(&d1->q_qlock);
|
||||
mutex_lock_nested(&d2->q_qlock, XFS_QLOCK_NESTED);
|
||||
}
|
||||
} else if (d1) {
|
||||
mutex_lock(&d1->q_qlock);
|
||||
} else if (d2) {
|
||||
mutex_lock(&d2->q_qlock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -97,6 +97,16 @@ typedef struct xfs_dquot {
|
|||
#define dq_hashlist q_lists.dqm_hashlist
|
||||
#define dq_flags q_lists.dqm_flags
|
||||
|
||||
/*
|
||||
* Lock hierachy for q_qlock:
|
||||
* XFS_QLOCK_NORMAL is the implicit default,
|
||||
* XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2
|
||||
*/
|
||||
enum {
|
||||
XFS_QLOCK_NORMAL = 0,
|
||||
XFS_QLOCK_NESTED,
|
||||
};
|
||||
|
||||
#define XFS_DQHOLD(dqp) ((dqp)->q_nrefs++)
|
||||
|
||||
#ifdef DEBUG
|
||||
|
|
|
@ -1070,6 +1070,13 @@ xfs_qm_sync(
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The hash chains and the mplist use the same xfs_dqhash structure as
|
||||
* their list head, but we can take the mplist qh_lock and one of the
|
||||
* hash qh_locks at the same time without any problem as they aren't
|
||||
* related.
|
||||
*/
|
||||
static struct lock_class_key xfs_quota_mplist_class;
|
||||
|
||||
/*
|
||||
* This initializes all the quota information that's kept in the
|
||||
|
@ -1105,6 +1112,8 @@ xfs_qm_init_quotainfo(
|
|||
}
|
||||
|
||||
xfs_qm_list_init(&qinf->qi_dqlist, "mpdqlist", 0);
|
||||
lockdep_set_class(&qinf->qi_dqlist.qh_lock, &xfs_quota_mplist_class);
|
||||
|
||||
qinf->qi_dqreclaims = 0;
|
||||
|
||||
/* mutex used to serialize quotaoffs */
|
||||
|
|
|
@ -244,8 +244,8 @@ typedef struct xfs_perag
|
|||
#define XFS_AG_CHECK_DADDR(mp,d,len) \
|
||||
((len) == 1 ? \
|
||||
ASSERT((d) == XFS_SB_DADDR || \
|
||||
XFS_DADDR_TO_AGBNO(mp, d) != XFS_SB_DADDR) : \
|
||||
ASSERT(XFS_DADDR_TO_AGNO(mp, d) == \
|
||||
XFS_DADDR_TO_AGNO(mp, (d) + (len) - 1)))
|
||||
xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \
|
||||
ASSERT(xfs_daddr_to_agno(mp, d) == \
|
||||
xfs_daddr_to_agno(mp, (d) + (len) - 1)))
|
||||
|
||||
#endif /* __XFS_AG_H__ */
|
||||
|
|
|
@ -115,7 +115,7 @@ xfs_allocbt_free_block(
|
|||
xfs_agblock_t bno;
|
||||
int error;
|
||||
|
||||
bno = XFS_DADDR_TO_AGBNO(cur->bc_mp, XFS_BUF_ADDR(bp));
|
||||
bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp));
|
||||
error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1);
|
||||
if (error)
|
||||
return error;
|
||||
|
|
|
@ -374,7 +374,7 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name,
|
|||
* It won't fit in the shortform, transform to a leaf block.
|
||||
* GROT: another possible req'mt for a double-split btree op.
|
||||
*/
|
||||
XFS_BMAP_INIT(args.flist, args.firstblock);
|
||||
xfs_bmap_init(args.flist, args.firstblock);
|
||||
error = xfs_attr_shortform_to_leaf(&args);
|
||||
if (!error) {
|
||||
error = xfs_bmap_finish(&args.trans, args.flist,
|
||||
|
@ -956,7 +956,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
|
|||
* Commit that transaction so that the node_addname() call
|
||||
* can manage its own transactions.
|
||||
*/
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_attr_leaf_to_node(args);
|
||||
if (!error) {
|
||||
error = xfs_bmap_finish(&args->trans, args->flist,
|
||||
|
@ -1057,7 +1057,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
|
|||
* If the result is small enough, shrink it all into the inode.
|
||||
*/
|
||||
if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_attr_leaf_to_shortform(bp, args, forkoff);
|
||||
/* bp is gone due to xfs_da_shrink_inode */
|
||||
if (!error) {
|
||||
|
@ -1135,7 +1135,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args)
|
|||
* If the result is small enough, shrink it all into the inode.
|
||||
*/
|
||||
if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_attr_leaf_to_shortform(bp, args, forkoff);
|
||||
/* bp is gone due to xfs_da_shrink_inode */
|
||||
if (!error) {
|
||||
|
@ -1290,7 +1290,7 @@ xfs_attr_node_addname(xfs_da_args_t *args)
|
|||
* have been a b-tree.
|
||||
*/
|
||||
xfs_da_state_free(state);
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_attr_leaf_to_node(args);
|
||||
if (!error) {
|
||||
error = xfs_bmap_finish(&args->trans,
|
||||
|
@ -1331,7 +1331,7 @@ xfs_attr_node_addname(xfs_da_args_t *args)
|
|||
* in the index/blkno/rmtblkno/rmtblkcnt fields and
|
||||
* in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields.
|
||||
*/
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_da_split(state);
|
||||
if (!error) {
|
||||
error = xfs_bmap_finish(&args->trans, args->flist,
|
||||
|
@ -1443,7 +1443,7 @@ xfs_attr_node_addname(xfs_da_args_t *args)
|
|||
* Check to see if the tree needs to be collapsed.
|
||||
*/
|
||||
if (retval && (state->path.active > 1)) {
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_da_join(state);
|
||||
if (!error) {
|
||||
error = xfs_bmap_finish(&args->trans,
|
||||
|
@ -1579,7 +1579,7 @@ xfs_attr_node_removename(xfs_da_args_t *args)
|
|||
* Check to see if the tree needs to be collapsed.
|
||||
*/
|
||||
if (retval && (state->path.active > 1)) {
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_da_join(state);
|
||||
if (!error) {
|
||||
error = xfs_bmap_finish(&args->trans, args->flist,
|
||||
|
@ -1630,7 +1630,7 @@ xfs_attr_node_removename(xfs_da_args_t *args)
|
|||
== XFS_ATTR_LEAF_MAGIC);
|
||||
|
||||
if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) {
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_attr_leaf_to_shortform(bp, args, forkoff);
|
||||
/* bp is gone due to xfs_da_shrink_inode */
|
||||
if (!error) {
|
||||
|
@ -2069,7 +2069,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
|
|||
/*
|
||||
* Allocate a single extent, up to the size of the value.
|
||||
*/
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
nmap = 1;
|
||||
error = xfs_bmapi(args->trans, dp, (xfs_fileoff_t)lblkno,
|
||||
blkcnt,
|
||||
|
@ -2123,7 +2123,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
|
|||
/*
|
||||
* Try to remember where we decided to put the value.
|
||||
*/
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
nmap = 1;
|
||||
error = xfs_bmapi(NULL, dp, (xfs_fileoff_t)lblkno,
|
||||
args->rmtblkcnt,
|
||||
|
@ -2188,7 +2188,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)
|
|||
/*
|
||||
* Try to remember where we decided to put the value.
|
||||
*/
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
nmap = 1;
|
||||
error = xfs_bmapi(NULL, args->dp, (xfs_fileoff_t)lblkno,
|
||||
args->rmtblkcnt,
|
||||
|
@ -2229,7 +2229,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)
|
|||
blkcnt = args->rmtblkcnt;
|
||||
done = 0;
|
||||
while (!done) {
|
||||
XFS_BMAP_INIT(args->flist, args->firstblock);
|
||||
xfs_bmap_init(args->flist, args->firstblock);
|
||||
error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt,
|
||||
XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA,
|
||||
1, args->firstblock, args->flist,
|
||||
|
|
|
@ -595,9 +595,9 @@ xfs_bmap_add_extent(
|
|||
xfs_iext_insert(ifp, 0, 1, new);
|
||||
ASSERT(cur == NULL);
|
||||
ifp->if_lastex = 0;
|
||||
if (!ISNULLSTARTBLOCK(new->br_startblock)) {
|
||||
if (!isnullstartblock(new->br_startblock)) {
|
||||
XFS_IFORK_NEXT_SET(ip, whichfork, 1);
|
||||
logflags = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork);
|
||||
logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
|
||||
} else
|
||||
logflags = 0;
|
||||
/* DELTA: single new extent */
|
||||
|
@ -613,7 +613,7 @@ xfs_bmap_add_extent(
|
|||
/*
|
||||
* Any kind of new delayed allocation goes here.
|
||||
*/
|
||||
else if (ISNULLSTARTBLOCK(new->br_startblock)) {
|
||||
else if (isnullstartblock(new->br_startblock)) {
|
||||
if (cur)
|
||||
ASSERT((cur->bc_private.b.flags &
|
||||
XFS_BTCUR_BPRV_WASDEL) == 0);
|
||||
|
@ -644,11 +644,11 @@ xfs_bmap_add_extent(
|
|||
* in a delayed or unwritten allocation with a real one, or
|
||||
* converting real back to unwritten.
|
||||
*/
|
||||
if (!ISNULLSTARTBLOCK(new->br_startblock) &&
|
||||
if (!isnullstartblock(new->br_startblock) &&
|
||||
new->br_startoff + new->br_blockcount > prev.br_startoff) {
|
||||
if (prev.br_state != XFS_EXT_UNWRITTEN &&
|
||||
ISNULLSTARTBLOCK(prev.br_startblock)) {
|
||||
da_old = STARTBLOCKVAL(prev.br_startblock);
|
||||
isnullstartblock(prev.br_startblock)) {
|
||||
da_old = startblockval(prev.br_startblock);
|
||||
if (cur)
|
||||
ASSERT(cur->bc_private.b.flags &
|
||||
XFS_BTCUR_BPRV_WASDEL);
|
||||
|
@ -803,7 +803,7 @@ xfs_bmap_add_extent_delay_real(
|
|||
*/
|
||||
if (STATE_SET_TEST(LEFT_VALID, idx > 0)) {
|
||||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT);
|
||||
STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock));
|
||||
STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock));
|
||||
}
|
||||
STATE_SET(LEFT_CONTIG,
|
||||
STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) &&
|
||||
|
@ -820,7 +820,7 @@ xfs_bmap_add_extent_delay_real(
|
|||
idx <
|
||||
ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) {
|
||||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT);
|
||||
STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock));
|
||||
STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock));
|
||||
}
|
||||
STATE_SET(RIGHT_CONTIG,
|
||||
STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) &&
|
||||
|
@ -1019,8 +1019,8 @@ xfs_bmap_add_extent_delay_real(
|
|||
goto done;
|
||||
}
|
||||
temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp),
|
||||
STARTBLOCKVAL(PREV.br_startblock));
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
startblockval(PREV.br_startblock));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK);
|
||||
*dnew = temp;
|
||||
/* DELTA: The boundary between two in-core extents moved. */
|
||||
|
@ -1067,10 +1067,10 @@ xfs_bmap_add_extent_delay_real(
|
|||
goto done;
|
||||
}
|
||||
temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp),
|
||||
STARTBLOCKVAL(PREV.br_startblock) -
|
||||
startblockval(PREV.br_startblock) -
|
||||
(cur ? cur->bc_private.b.allocated : 0));
|
||||
ep = xfs_iext_get_ext(ifp, idx + 1);
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx + 1, XFS_DATA_FORK);
|
||||
*dnew = temp;
|
||||
/* DELTA: One in-core extent is split in two. */
|
||||
|
@ -1110,8 +1110,8 @@ xfs_bmap_add_extent_delay_real(
|
|||
goto done;
|
||||
}
|
||||
temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp),
|
||||
STARTBLOCKVAL(PREV.br_startblock));
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
startblockval(PREV.br_startblock));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK);
|
||||
*dnew = temp;
|
||||
/* DELTA: The boundary between two in-core extents moved. */
|
||||
|
@ -1157,10 +1157,10 @@ xfs_bmap_add_extent_delay_real(
|
|||
goto done;
|
||||
}
|
||||
temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp),
|
||||
STARTBLOCKVAL(PREV.br_startblock) -
|
||||
startblockval(PREV.br_startblock) -
|
||||
(cur ? cur->bc_private.b.allocated : 0));
|
||||
ep = xfs_iext_get_ext(ifp, idx);
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK);
|
||||
*dnew = temp;
|
||||
/* DELTA: One in-core extent is split in two. */
|
||||
|
@ -1213,7 +1213,7 @@ xfs_bmap_add_extent_delay_real(
|
|||
}
|
||||
temp = xfs_bmap_worst_indlen(ip, temp);
|
||||
temp2 = xfs_bmap_worst_indlen(ip, temp2);
|
||||
diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) -
|
||||
diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) -
|
||||
(cur ? cur->bc_private.b.allocated : 0));
|
||||
if (diff > 0 &&
|
||||
xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) {
|
||||
|
@ -1241,11 +1241,11 @@ xfs_bmap_add_extent_delay_real(
|
|||
}
|
||||
}
|
||||
ep = xfs_iext_get_ext(ifp, idx);
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK);
|
||||
XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx + 2, XFS_DATA_FORK);
|
||||
xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2),
|
||||
NULLSTARTBLOCK((int)temp2));
|
||||
nullstartblock((int)temp2));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx + 2, XFS_DATA_FORK);
|
||||
*dnew = temp + temp2;
|
||||
/* DELTA: One in-core extent is split in three. */
|
||||
|
@ -1365,7 +1365,7 @@ xfs_bmap_add_extent_unwritten_real(
|
|||
*/
|
||||
if (STATE_SET_TEST(LEFT_VALID, idx > 0)) {
|
||||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT);
|
||||
STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(LEFT.br_startblock));
|
||||
STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock));
|
||||
}
|
||||
STATE_SET(LEFT_CONTIG,
|
||||
STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) &&
|
||||
|
@ -1382,7 +1382,7 @@ xfs_bmap_add_extent_unwritten_real(
|
|||
idx <
|
||||
ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) {
|
||||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT);
|
||||
STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(RIGHT.br_startblock));
|
||||
STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock));
|
||||
}
|
||||
STATE_SET(RIGHT_CONTIG,
|
||||
STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) &&
|
||||
|
@ -1889,13 +1889,13 @@ xfs_bmap_add_extent_hole_delay(
|
|||
ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
|
||||
ep = xfs_iext_get_ext(ifp, idx);
|
||||
state = 0;
|
||||
ASSERT(ISNULLSTARTBLOCK(new->br_startblock));
|
||||
ASSERT(isnullstartblock(new->br_startblock));
|
||||
/*
|
||||
* Check and set flags if this segment has a left neighbor
|
||||
*/
|
||||
if (STATE_SET_TEST(LEFT_VALID, idx > 0)) {
|
||||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left);
|
||||
STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock));
|
||||
STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock));
|
||||
}
|
||||
/*
|
||||
* Check and set flags if the current (right) segment exists.
|
||||
|
@ -1905,7 +1905,7 @@ xfs_bmap_add_extent_hole_delay(
|
|||
idx <
|
||||
ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) {
|
||||
xfs_bmbt_get_all(ep, &right);
|
||||
STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock));
|
||||
STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock));
|
||||
}
|
||||
/*
|
||||
* Set contiguity flags on the left and right neighbors.
|
||||
|
@ -1938,12 +1938,12 @@ xfs_bmap_add_extent_hole_delay(
|
|||
XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1,
|
||||
XFS_DATA_FORK);
|
||||
xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp);
|
||||
oldlen = STARTBLOCKVAL(left.br_startblock) +
|
||||
STARTBLOCKVAL(new->br_startblock) +
|
||||
STARTBLOCKVAL(right.br_startblock);
|
||||
oldlen = startblockval(left.br_startblock) +
|
||||
startblockval(new->br_startblock) +
|
||||
startblockval(right.br_startblock);
|
||||
newlen = xfs_bmap_worst_indlen(ip, temp);
|
||||
xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1),
|
||||
NULLSTARTBLOCK((int)newlen));
|
||||
nullstartblock((int)newlen));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1,
|
||||
XFS_DATA_FORK);
|
||||
XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, XFS_DATA_FORK);
|
||||
|
@ -1964,11 +1964,11 @@ xfs_bmap_add_extent_hole_delay(
|
|||
XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1,
|
||||
XFS_DATA_FORK);
|
||||
xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp);
|
||||
oldlen = STARTBLOCKVAL(left.br_startblock) +
|
||||
STARTBLOCKVAL(new->br_startblock);
|
||||
oldlen = startblockval(left.br_startblock) +
|
||||
startblockval(new->br_startblock);
|
||||
newlen = xfs_bmap_worst_indlen(ip, temp);
|
||||
xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1),
|
||||
NULLSTARTBLOCK((int)newlen));
|
||||
nullstartblock((int)newlen));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1,
|
||||
XFS_DATA_FORK);
|
||||
ip->i_df.if_lastex = idx - 1;
|
||||
|
@ -1985,11 +1985,11 @@ xfs_bmap_add_extent_hole_delay(
|
|||
*/
|
||||
XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, XFS_DATA_FORK);
|
||||
temp = new->br_blockcount + right.br_blockcount;
|
||||
oldlen = STARTBLOCKVAL(new->br_startblock) +
|
||||
STARTBLOCKVAL(right.br_startblock);
|
||||
oldlen = startblockval(new->br_startblock) +
|
||||
startblockval(right.br_startblock);
|
||||
newlen = xfs_bmap_worst_indlen(ip, temp);
|
||||
xfs_bmbt_set_allf(ep, new->br_startoff,
|
||||
NULLSTARTBLOCK((int)newlen), temp, right.br_state);
|
||||
nullstartblock((int)newlen), temp, right.br_state);
|
||||
XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, XFS_DATA_FORK);
|
||||
ip->i_df.if_lastex = idx;
|
||||
/* DELTA: One in-core extent grew into a hole. */
|
||||
|
@ -2085,7 +2085,7 @@ xfs_bmap_add_extent_hole_real(
|
|||
*/
|
||||
if (STATE_SET_TEST(LEFT_VALID, idx > 0)) {
|
||||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left);
|
||||
STATE_SET(LEFT_DELAY, ISNULLSTARTBLOCK(left.br_startblock));
|
||||
STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock));
|
||||
}
|
||||
/*
|
||||
* Check and set flags if this segment has a current value.
|
||||
|
@ -2095,7 +2095,7 @@ xfs_bmap_add_extent_hole_real(
|
|||
idx <
|
||||
ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) {
|
||||
xfs_bmbt_get_all(ep, &right);
|
||||
STATE_SET(RIGHT_DELAY, ISNULLSTARTBLOCK(right.br_startblock));
|
||||
STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock));
|
||||
}
|
||||
/*
|
||||
* We're inserting a real allocation between "left" and "right".
|
||||
|
@ -2143,7 +2143,7 @@ xfs_bmap_add_extent_hole_real(
|
|||
XFS_IFORK_NEXT_SET(ip, whichfork,
|
||||
XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
|
||||
if (cur == NULL) {
|
||||
rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork);
|
||||
rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
|
||||
} else {
|
||||
rval = XFS_ILOG_CORE;
|
||||
if ((error = xfs_bmbt_lookup_eq(cur,
|
||||
|
@ -2185,7 +2185,7 @@ xfs_bmap_add_extent_hole_real(
|
|||
XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, whichfork);
|
||||
ifp->if_lastex = idx - 1;
|
||||
if (cur == NULL) {
|
||||
rval = XFS_ILOG_FEXT(whichfork);
|
||||
rval = xfs_ilog_fext(whichfork);
|
||||
} else {
|
||||
rval = 0;
|
||||
if ((error = xfs_bmbt_lookup_eq(cur,
|
||||
|
@ -2220,7 +2220,7 @@ xfs_bmap_add_extent_hole_real(
|
|||
XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, whichfork);
|
||||
ifp->if_lastex = idx;
|
||||
if (cur == NULL) {
|
||||
rval = XFS_ILOG_FEXT(whichfork);
|
||||
rval = xfs_ilog_fext(whichfork);
|
||||
} else {
|
||||
rval = 0;
|
||||
if ((error = xfs_bmbt_lookup_eq(cur,
|
||||
|
@ -2254,7 +2254,7 @@ xfs_bmap_add_extent_hole_real(
|
|||
XFS_IFORK_NEXT_SET(ip, whichfork,
|
||||
XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
|
||||
if (cur == NULL) {
|
||||
rval = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork);
|
||||
rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
|
||||
} else {
|
||||
rval = XFS_ILOG_CORE;
|
||||
if ((error = xfs_bmbt_lookup_eq(cur,
|
||||
|
@ -2482,7 +2482,7 @@ xfs_bmap_adjacent(
|
|||
* try to use it's last block as our starting point.
|
||||
*/
|
||||
if (ap->eof && ap->prevp->br_startoff != NULLFILEOFF &&
|
||||
!ISNULLSTARTBLOCK(ap->prevp->br_startblock) &&
|
||||
!isnullstartblock(ap->prevp->br_startblock) &&
|
||||
ISVALID(ap->prevp->br_startblock + ap->prevp->br_blockcount,
|
||||
ap->prevp->br_startblock)) {
|
||||
ap->rval = ap->prevp->br_startblock + ap->prevp->br_blockcount;
|
||||
|
@ -2511,7 +2511,7 @@ xfs_bmap_adjacent(
|
|||
* start block based on it.
|
||||
*/
|
||||
if (ap->prevp->br_startoff != NULLFILEOFF &&
|
||||
!ISNULLSTARTBLOCK(ap->prevp->br_startblock) &&
|
||||
!isnullstartblock(ap->prevp->br_startblock) &&
|
||||
(prevbno = ap->prevp->br_startblock +
|
||||
ap->prevp->br_blockcount) &&
|
||||
ISVALID(prevbno, ap->prevp->br_startblock)) {
|
||||
|
@ -2552,7 +2552,7 @@ xfs_bmap_adjacent(
|
|||
* If there's a following (right) block, select a requested
|
||||
* start block based on it.
|
||||
*/
|
||||
if (!ISNULLSTARTBLOCK(ap->gotp->br_startblock)) {
|
||||
if (!isnullstartblock(ap->gotp->br_startblock)) {
|
||||
/*
|
||||
* Calculate gap to start of next block.
|
||||
*/
|
||||
|
@ -3082,7 +3082,7 @@ xfs_bmap_btree_to_extents(
|
|||
ASSERT(ifp->if_broot == NULL);
|
||||
ASSERT((ifp->if_flags & XFS_IFBROOT) == 0);
|
||||
XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS);
|
||||
*logflagsp = XFS_ILOG_CORE | XFS_ILOG_FEXT(whichfork);
|
||||
*logflagsp = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3136,8 +3136,8 @@ xfs_bmap_del_extent(
|
|||
del_endoff = del->br_startoff + del->br_blockcount;
|
||||
got_endoff = got.br_startoff + got.br_blockcount;
|
||||
ASSERT(got_endoff >= del_endoff);
|
||||
delay = ISNULLSTARTBLOCK(got.br_startblock);
|
||||
ASSERT(ISNULLSTARTBLOCK(del->br_startblock) == delay);
|
||||
delay = isnullstartblock(got.br_startblock);
|
||||
ASSERT(isnullstartblock(del->br_startblock) == delay);
|
||||
flags = 0;
|
||||
qfield = 0;
|
||||
error = 0;
|
||||
|
@ -3189,7 +3189,7 @@ xfs_bmap_del_extent(
|
|||
}
|
||||
da_old = da_new = 0;
|
||||
} else {
|
||||
da_old = STARTBLOCKVAL(got.br_startblock);
|
||||
da_old = startblockval(got.br_startblock);
|
||||
da_new = 0;
|
||||
nblks = 0;
|
||||
do_fx = 0;
|
||||
|
@ -3213,7 +3213,7 @@ xfs_bmap_del_extent(
|
|||
XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
|
||||
flags |= XFS_ILOG_CORE;
|
||||
if (!cur) {
|
||||
flags |= XFS_ILOG_FEXT(whichfork);
|
||||
flags |= xfs_ilog_fext(whichfork);
|
||||
break;
|
||||
}
|
||||
if ((error = xfs_btree_delete(cur, &i)))
|
||||
|
@ -3233,7 +3233,7 @@ xfs_bmap_del_extent(
|
|||
if (delay) {
|
||||
temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp),
|
||||
da_old);
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx,
|
||||
whichfork);
|
||||
da_new = temp;
|
||||
|
@ -3242,7 +3242,7 @@ xfs_bmap_del_extent(
|
|||
xfs_bmbt_set_startblock(ep, del_endblock);
|
||||
XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, whichfork);
|
||||
if (!cur) {
|
||||
flags |= XFS_ILOG_FEXT(whichfork);
|
||||
flags |= xfs_ilog_fext(whichfork);
|
||||
break;
|
||||
}
|
||||
if ((error = xfs_bmbt_update(cur, del_endoff, del_endblock,
|
||||
|
@ -3262,7 +3262,7 @@ xfs_bmap_del_extent(
|
|||
if (delay) {
|
||||
temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp),
|
||||
da_old);
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx,
|
||||
whichfork);
|
||||
da_new = temp;
|
||||
|
@ -3270,7 +3270,7 @@ xfs_bmap_del_extent(
|
|||
}
|
||||
XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, whichfork);
|
||||
if (!cur) {
|
||||
flags |= XFS_ILOG_FEXT(whichfork);
|
||||
flags |= xfs_ilog_fext(whichfork);
|
||||
break;
|
||||
}
|
||||
if ((error = xfs_bmbt_update(cur, got.br_startoff,
|
||||
|
@ -3345,22 +3345,22 @@ xfs_bmap_del_extent(
|
|||
}
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, done);
|
||||
} else
|
||||
flags |= XFS_ILOG_FEXT(whichfork);
|
||||
flags |= xfs_ilog_fext(whichfork);
|
||||
XFS_IFORK_NEXT_SET(ip, whichfork,
|
||||
XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
|
||||
} else {
|
||||
ASSERT(whichfork == XFS_DATA_FORK);
|
||||
temp = xfs_bmap_worst_indlen(ip, temp);
|
||||
xfs_bmbt_set_startblock(ep, NULLSTARTBLOCK((int)temp));
|
||||
xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));
|
||||
temp2 = xfs_bmap_worst_indlen(ip, temp2);
|
||||
new.br_startblock = NULLSTARTBLOCK((int)temp2);
|
||||
new.br_startblock = nullstartblock((int)temp2);
|
||||
da_new = temp + temp2;
|
||||
while (da_new > da_old) {
|
||||
if (temp) {
|
||||
temp--;
|
||||
da_new--;
|
||||
xfs_bmbt_set_startblock(ep,
|
||||
NULLSTARTBLOCK((int)temp));
|
||||
nullstartblock((int)temp));
|
||||
}
|
||||
if (da_new == da_old)
|
||||
break;
|
||||
|
@ -3368,7 +3368,7 @@ xfs_bmap_del_extent(
|
|||
temp2--;
|
||||
da_new--;
|
||||
new.br_startblock =
|
||||
NULLSTARTBLOCK((int)temp2);
|
||||
nullstartblock((int)temp2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3545,7 +3545,7 @@ xfs_bmap_extents_to_btree(
|
|||
nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
|
||||
for (cnt = i = 0; i < nextents; i++) {
|
||||
ep = xfs_iext_get_ext(ifp, i);
|
||||
if (!ISNULLSTARTBLOCK(xfs_bmbt_get_startblock(ep))) {
|
||||
if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) {
|
||||
arp->l0 = cpu_to_be64(ep->l0);
|
||||
arp->l1 = cpu_to_be64(ep->l1);
|
||||
arp++; cnt++;
|
||||
|
@ -3572,7 +3572,7 @@ xfs_bmap_extents_to_btree(
|
|||
xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs));
|
||||
ASSERT(*curp == NULL);
|
||||
*curp = cur;
|
||||
*logflagsp = XFS_ILOG_CORE | XFS_ILOG_FBROOT(whichfork);
|
||||
*logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3676,7 +3676,7 @@ xfs_bmap_local_to_extents(
|
|||
ip->i_d.di_nblocks = 1;
|
||||
XFS_TRANS_MOD_DQUOT_BYINO(args.mp, tp, ip,
|
||||
XFS_TRANS_DQ_BCOUNT, 1L);
|
||||
flags |= XFS_ILOG_FEXT(whichfork);
|
||||
flags |= xfs_ilog_fext(whichfork);
|
||||
} else {
|
||||
ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0);
|
||||
xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork);
|
||||
|
@ -4082,7 +4082,7 @@ xfs_bmap_add_attrfork(
|
|||
XFS_IFORK_ASIZE(ip) / (uint)sizeof(xfs_bmbt_rec_t);
|
||||
ip->i_afp->if_flags = XFS_IFEXTENTS;
|
||||
logflags = 0;
|
||||
XFS_BMAP_INIT(&flist, &firstblock);
|
||||
xfs_bmap_init(&flist, &firstblock);
|
||||
switch (ip->i_d.di_format) {
|
||||
case XFS_DINODE_FMT_LOCAL:
|
||||
error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist,
|
||||
|
@ -4162,7 +4162,7 @@ xfs_bmap_add_free(
|
|||
ASSERT(bno != NULLFSBLOCK);
|
||||
ASSERT(len > 0);
|
||||
ASSERT(len <= MAXEXTLEN);
|
||||
ASSERT(!ISNULLSTARTBLOCK(bno));
|
||||
ASSERT(!isnullstartblock(bno));
|
||||
agno = XFS_FSB_TO_AGNO(mp, bno);
|
||||
agbno = XFS_FSB_TO_AGBNO(mp, bno);
|
||||
ASSERT(agno < mp->m_sb.sb_agcount);
|
||||
|
@ -4909,7 +4909,7 @@ xfs_bmapi(
|
|||
got.br_startoff = end;
|
||||
inhole = eof || got.br_startoff > bno;
|
||||
wasdelay = wr && !inhole && !(flags & XFS_BMAPI_DELAY) &&
|
||||
ISNULLSTARTBLOCK(got.br_startblock);
|
||||
isnullstartblock(got.br_startblock);
|
||||
/*
|
||||
* First, deal with the hole before the allocated space
|
||||
* that we found, if any.
|
||||
|
@ -5028,7 +5028,7 @@ xfs_bmapi(
|
|||
}
|
||||
|
||||
ip->i_delayed_blks += alen;
|
||||
abno = NULLSTARTBLOCK(indlen);
|
||||
abno = nullstartblock(indlen);
|
||||
} else {
|
||||
/*
|
||||
* If first time, allocate and fill in
|
||||
|
@ -5144,8 +5144,8 @@ xfs_bmapi(
|
|||
aoff + alen);
|
||||
#ifdef DEBUG
|
||||
if (flags & XFS_BMAPI_DELAY) {
|
||||
ASSERT(ISNULLSTARTBLOCK(got.br_startblock));
|
||||
ASSERT(STARTBLOCKVAL(got.br_startblock) > 0);
|
||||
ASSERT(isnullstartblock(got.br_startblock));
|
||||
ASSERT(startblockval(got.br_startblock) > 0);
|
||||
}
|
||||
ASSERT(got.br_state == XFS_EXT_NORM ||
|
||||
got.br_state == XFS_EXT_UNWRITTEN);
|
||||
|
@ -5179,7 +5179,7 @@ xfs_bmapi(
|
|||
ASSERT((bno >= obno) || (n == 0));
|
||||
ASSERT(bno < end);
|
||||
mval->br_startoff = bno;
|
||||
if (ISNULLSTARTBLOCK(got.br_startblock)) {
|
||||
if (isnullstartblock(got.br_startblock)) {
|
||||
ASSERT(!wr || (flags & XFS_BMAPI_DELAY));
|
||||
mval->br_startblock = DELAYSTARTBLOCK;
|
||||
} else
|
||||
|
@ -5201,7 +5201,7 @@ xfs_bmapi(
|
|||
ASSERT(mval->br_blockcount <= len);
|
||||
} else {
|
||||
*mval = got;
|
||||
if (ISNULLSTARTBLOCK(mval->br_startblock)) {
|
||||
if (isnullstartblock(mval->br_startblock)) {
|
||||
ASSERT(!wr || (flags & XFS_BMAPI_DELAY));
|
||||
mval->br_startblock = DELAYSTARTBLOCK;
|
||||
}
|
||||
|
@ -5329,12 +5329,12 @@ xfs_bmapi(
|
|||
* Log everything. Do this after conversion, there's no point in
|
||||
* logging the extent records if we've converted to btree format.
|
||||
*/
|
||||
if ((logflags & XFS_ILOG_FEXT(whichfork)) &&
|
||||
if ((logflags & xfs_ilog_fext(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS)
|
||||
logflags &= ~XFS_ILOG_FEXT(whichfork);
|
||||
else if ((logflags & XFS_ILOG_FBROOT(whichfork)) &&
|
||||
logflags &= ~xfs_ilog_fext(whichfork);
|
||||
else if ((logflags & xfs_ilog_fbroot(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)
|
||||
logflags &= ~XFS_ILOG_FBROOT(whichfork);
|
||||
logflags &= ~xfs_ilog_fbroot(whichfork);
|
||||
/*
|
||||
* Log whatever the flags say, even if error. Otherwise we might miss
|
||||
* detecting a case where the data is changed, there's an error,
|
||||
|
@ -5411,7 +5411,7 @@ xfs_bmapi_single(
|
|||
*fsb = NULLFSBLOCK;
|
||||
return 0;
|
||||
}
|
||||
ASSERT(!ISNULLSTARTBLOCK(got.br_startblock));
|
||||
ASSERT(!isnullstartblock(got.br_startblock));
|
||||
ASSERT(bno < got.br_startoff + got.br_blockcount);
|
||||
*fsb = got.br_startblock + (bno - got.br_startoff);
|
||||
ifp->if_lastex = lastx;
|
||||
|
@ -5543,7 +5543,7 @@ xfs_bunmapi(
|
|||
*/
|
||||
ASSERT(ep != NULL);
|
||||
del = got;
|
||||
wasdel = ISNULLSTARTBLOCK(del.br_startblock);
|
||||
wasdel = isnullstartblock(del.br_startblock);
|
||||
if (got.br_startoff < start) {
|
||||
del.br_startoff = start;
|
||||
del.br_blockcount -= start - got.br_startoff;
|
||||
|
@ -5638,7 +5638,7 @@ xfs_bunmapi(
|
|||
xfs_bmbt_get_all(xfs_iext_get_ext(ifp,
|
||||
lastx - 1), &prev);
|
||||
ASSERT(prev.br_state == XFS_EXT_NORM);
|
||||
ASSERT(!ISNULLSTARTBLOCK(prev.br_startblock));
|
||||
ASSERT(!isnullstartblock(prev.br_startblock));
|
||||
ASSERT(del.br_startblock ==
|
||||
prev.br_startblock + prev.br_blockcount);
|
||||
if (prev.br_startoff < start) {
|
||||
|
@ -5666,7 +5666,7 @@ xfs_bunmapi(
|
|||
}
|
||||
}
|
||||
if (wasdel) {
|
||||
ASSERT(STARTBLOCKVAL(del.br_startblock) > 0);
|
||||
ASSERT(startblockval(del.br_startblock) > 0);
|
||||
/* Update realtime/data freespace, unreserve quota */
|
||||
if (isrt) {
|
||||
xfs_filblks_t rtexts;
|
||||
|
@ -5782,12 +5782,12 @@ xfs_bunmapi(
|
|||
* Log everything. Do this after conversion, there's no point in
|
||||
* logging the extent records if we've converted to btree format.
|
||||
*/
|
||||
if ((logflags & XFS_ILOG_FEXT(whichfork)) &&
|
||||
if ((logflags & xfs_ilog_fext(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS)
|
||||
logflags &= ~XFS_ILOG_FEXT(whichfork);
|
||||
else if ((logflags & XFS_ILOG_FBROOT(whichfork)) &&
|
||||
logflags &= ~xfs_ilog_fext(whichfork);
|
||||
else if ((logflags & xfs_ilog_fbroot(whichfork)) &&
|
||||
XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE)
|
||||
logflags &= ~XFS_ILOG_FBROOT(whichfork);
|
||||
logflags &= ~xfs_ilog_fbroot(whichfork);
|
||||
/*
|
||||
* Log inode even in the error case, if the transaction
|
||||
* is dirty we'll need to shut down the filesystem.
|
||||
|
@ -5838,7 +5838,7 @@ xfs_getbmapx_fix_eof_hole(
|
|||
if (startblock == DELAYSTARTBLOCK)
|
||||
out->bmv_block = -2;
|
||||
else
|
||||
out->bmv_block = XFS_FSB_TO_DB(ip, startblock);
|
||||
out->bmv_block = xfs_fsb_to_db(ip, startblock);
|
||||
fileblock = XFS_BB_TO_FSB(ip->i_mount, out->bmv_offset);
|
||||
ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
|
||||
if (xfs_iext_bno_to_ext(ifp, fileblock, &lastx) &&
|
||||
|
@ -5979,7 +5979,7 @@ xfs_getbmap(
|
|||
if (nex > XFS_IFORK_NEXTENTS(ip, whichfork) * 2 + 1)
|
||||
nex = XFS_IFORK_NEXTENTS(ip, whichfork) * 2 + 1;
|
||||
|
||||
bmapi_flags = XFS_BMAPI_AFLAG(whichfork) |
|
||||
bmapi_flags = xfs_bmapi_aflag(whichfork) |
|
||||
((iflags & BMV_IF_PREALLOC) ? 0 : XFS_BMAPI_IGSTATE);
|
||||
|
||||
/*
|
||||
|
@ -6098,7 +6098,7 @@ xfs_bmap_isaeof(
|
|||
*/
|
||||
*aeof = (off >= s.br_startoff &&
|
||||
off < s.br_startoff + s.br_blockcount &&
|
||||
ISNULLSTARTBLOCK(s.br_startblock)) ||
|
||||
isnullstartblock(s.br_startblock)) ||
|
||||
off >= s.br_startoff + s.br_blockcount;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -95,7 +95,6 @@ typedef struct xfs_bmap_free
|
|||
/* need write cache flushing and no */
|
||||
/* additional allocation alignments */
|
||||
|
||||
#define XFS_BMAPI_AFLAG(w) xfs_bmapi_aflag(w)
|
||||
static inline int xfs_bmapi_aflag(int w)
|
||||
{
|
||||
return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0);
|
||||
|
@ -107,7 +106,6 @@ static inline int xfs_bmapi_aflag(int w)
|
|||
#define DELAYSTARTBLOCK ((xfs_fsblock_t)-1LL)
|
||||
#define HOLESTARTBLOCK ((xfs_fsblock_t)-2LL)
|
||||
|
||||
#define XFS_BMAP_INIT(flp,fbp) xfs_bmap_init(flp,fbp)
|
||||
static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp)
|
||||
{
|
||||
((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \
|
||||
|
|
|
@ -121,7 +121,7 @@ __xfs_bmbt_get_all(
|
|||
|
||||
b = (((xfs_dfsbno_t)l0 & xfs_mask64lo(9)) << 43) |
|
||||
(((xfs_dfsbno_t)l1) >> 21);
|
||||
ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b));
|
||||
ASSERT((b >> 32) == 0 || isnulldstartblock(b));
|
||||
s->br_startblock = (xfs_fsblock_t)b;
|
||||
}
|
||||
#else /* !DEBUG */
|
||||
|
@ -172,7 +172,7 @@ xfs_bmbt_get_startblock(
|
|||
|
||||
b = (((xfs_dfsbno_t)r->l0 & xfs_mask64lo(9)) << 43) |
|
||||
(((xfs_dfsbno_t)r->l1) >> 21);
|
||||
ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b));
|
||||
ASSERT((b >> 32) == 0 || isnulldstartblock(b));
|
||||
return (xfs_fsblock_t)b;
|
||||
#else /* !DEBUG */
|
||||
return (xfs_fsblock_t)(((xfs_dfsbno_t)r->l1) >> 21);
|
||||
|
@ -261,7 +261,7 @@ xfs_bmbt_set_allf(
|
|||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21));
|
||||
#else /* !XFS_BIG_BLKNOS */
|
||||
if (ISNULLSTARTBLOCK(startblock)) {
|
||||
if (isnullstartblock(startblock)) {
|
||||
r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
((xfs_bmbt_rec_base_t)startoff << 9) |
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(9);
|
||||
|
@ -321,7 +321,7 @@ xfs_bmbt_disk_set_allf(
|
|||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21)));
|
||||
#else /* !XFS_BIG_BLKNOS */
|
||||
if (ISNULLSTARTBLOCK(startblock)) {
|
||||
if (isnullstartblock(startblock)) {
|
||||
r->l0 = cpu_to_be64(
|
||||
((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
((xfs_bmbt_rec_base_t)startoff << 9) |
|
||||
|
@ -382,7 +382,7 @@ xfs_bmbt_set_startblock(
|
|||
r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)) |
|
||||
(xfs_bmbt_rec_base_t)(v << 21);
|
||||
#else /* !XFS_BIG_BLKNOS */
|
||||
if (ISNULLSTARTBLOCK(v)) {
|
||||
if (isnullstartblock(v)) {
|
||||
r->l0 |= (xfs_bmbt_rec_base_t)xfs_mask64lo(9);
|
||||
r->l1 = (xfs_bmbt_rec_base_t)xfs_mask64hi(11) |
|
||||
((xfs_bmbt_rec_base_t)v << 21) |
|
||||
|
|
|
@ -76,26 +76,22 @@ typedef struct xfs_bmbt_rec_host {
|
|||
#define DSTARTBLOCKMASK \
|
||||
(((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
|
||||
|
||||
#define ISNULLSTARTBLOCK(x) isnullstartblock(x)
|
||||
static inline int isnullstartblock(xfs_fsblock_t x)
|
||||
{
|
||||
return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK;
|
||||
}
|
||||
|
||||
#define ISNULLDSTARTBLOCK(x) isnulldstartblock(x)
|
||||
static inline int isnulldstartblock(xfs_dfsbno_t x)
|
||||
{
|
||||
return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK;
|
||||
}
|
||||
|
||||
#define NULLSTARTBLOCK(k) nullstartblock(k)
|
||||
static inline xfs_fsblock_t nullstartblock(int k)
|
||||
{
|
||||
ASSERT(k < (1 << STARTBLOCKVALBITS));
|
||||
return STARTBLOCKMASK | (k);
|
||||
}
|
||||
|
||||
#define STARTBLOCKVAL(x) startblockval(x)
|
||||
static inline xfs_filblks_t startblockval(xfs_fsblock_t x)
|
||||
{
|
||||
return (xfs_filblks_t)((x) & ~STARTBLOCKMASK);
|
||||
|
|
|
@ -843,7 +843,7 @@ xfs_btree_ptr_is_null(
|
|||
union xfs_btree_ptr *ptr)
|
||||
{
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
|
||||
return be64_to_cpu(ptr->l) == NULLFSBLOCK;
|
||||
return be64_to_cpu(ptr->l) == NULLDFSBNO;
|
||||
else
|
||||
return be32_to_cpu(ptr->s) == NULLAGBLOCK;
|
||||
}
|
||||
|
@ -854,7 +854,7 @@ xfs_btree_set_ptr_null(
|
|||
union xfs_btree_ptr *ptr)
|
||||
{
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
|
||||
ptr->l = cpu_to_be64(NULLFSBLOCK);
|
||||
ptr->l = cpu_to_be64(NULLDFSBNO);
|
||||
else
|
||||
ptr->s = cpu_to_be32(NULLAGBLOCK);
|
||||
}
|
||||
|
@ -918,8 +918,8 @@ xfs_btree_init_block(
|
|||
new->bb_numrecs = cpu_to_be16(numrecs);
|
||||
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
|
||||
new->bb_u.l.bb_leftsib = cpu_to_be64(NULLFSBLOCK);
|
||||
new->bb_u.l.bb_rightsib = cpu_to_be64(NULLFSBLOCK);
|
||||
new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
|
||||
new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
|
||||
} else {
|
||||
new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
|
||||
new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
|
||||
|
@ -960,7 +960,7 @@ xfs_btree_buf_to_ptr(
|
|||
ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp,
|
||||
XFS_BUF_ADDR(bp)));
|
||||
else {
|
||||
ptr->s = cpu_to_be32(XFS_DADDR_TO_AGBNO(cur->bc_mp,
|
||||
ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp,
|
||||
XFS_BUF_ADDR(bp)));
|
||||
}
|
||||
}
|
||||
|
@ -971,7 +971,7 @@ xfs_btree_ptr_to_daddr(
|
|||
union xfs_btree_ptr *ptr)
|
||||
{
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
|
||||
ASSERT(be64_to_cpu(ptr->l) != NULLFSBLOCK);
|
||||
ASSERT(be64_to_cpu(ptr->l) != NULLDFSBNO);
|
||||
|
||||
return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l));
|
||||
} else {
|
||||
|
@ -2454,7 +2454,7 @@ xfs_btree_new_iroot(
|
|||
xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs));
|
||||
|
||||
*logflags |=
|
||||
XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork);
|
||||
XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork);
|
||||
*stat = 1;
|
||||
XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
|
||||
return 0;
|
||||
|
@ -3048,7 +3048,7 @@ xfs_btree_kill_iroot(
|
|||
cur->bc_bufs[level - 1] = NULL;
|
||||
be16_add_cpu(&block->bb_level, -1);
|
||||
xfs_trans_log_inode(cur->bc_tp, ip,
|
||||
XFS_ILOG_CORE | XFS_ILOG_FBROOT(cur->bc_private.b.whichfork));
|
||||
XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork));
|
||||
cur->bc_nlevels--;
|
||||
out0:
|
||||
XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT);
|
||||
|
|
|
@ -1597,7 +1597,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno)
|
|||
nmap = 1;
|
||||
ASSERT(args->firstblock != NULL);
|
||||
if ((error = xfs_bmapi(tp, dp, bno, count,
|
||||
XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|
|
||||
xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|
|
||||
XFS_BMAPI_CONTIG,
|
||||
args->firstblock, args->total, &map, &nmap,
|
||||
args->flist, NULL))) {
|
||||
|
@ -1618,7 +1618,7 @@ xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno)
|
|||
nmap = MIN(XFS_BMAP_MAX_NMAP, count);
|
||||
c = (int)(bno + count - b);
|
||||
if ((error = xfs_bmapi(tp, dp, b, c,
|
||||
XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|
|
||||
xfs_bmapi_aflag(w)|XFS_BMAPI_WRITE|
|
||||
XFS_BMAPI_METADATA,
|
||||
args->firstblock, args->total,
|
||||
&mapp[mapi], &nmap, args->flist,
|
||||
|
@ -1882,7 +1882,7 @@ xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
|
|||
* the last block to the place we want to kill.
|
||||
*/
|
||||
if ((error = xfs_bunmapi(tp, dp, dead_blkno, count,
|
||||
XFS_BMAPI_AFLAG(w)|XFS_BMAPI_METADATA,
|
||||
xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA,
|
||||
0, args->firstblock, args->flist, NULL,
|
||||
&done)) == ENOSPC) {
|
||||
if (w != XFS_DATA_FORK)
|
||||
|
@ -1987,7 +1987,7 @@ xfs_da_do_buf(
|
|||
if ((error = xfs_bmapi(trans, dp, (xfs_fileoff_t)bno,
|
||||
nfsb,
|
||||
XFS_BMAPI_METADATA |
|
||||
XFS_BMAPI_AFLAG(whichfork),
|
||||
xfs_bmapi_aflag(whichfork),
|
||||
NULL, 0, mapp, &nmap, NULL, NULL)))
|
||||
goto exit0;
|
||||
}
|
||||
|
|
|
@ -357,7 +357,7 @@ xfs_ialloc_ag_alloc(
|
|||
int ioffset = i << args.mp->m_sb.sb_inodelog;
|
||||
uint isize = sizeof(struct xfs_dinode);
|
||||
|
||||
free = XFS_MAKE_IPTR(args.mp, fbuf, i);
|
||||
free = xfs_make_iptr(args.mp, fbuf, i);
|
||||
free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);
|
||||
free->di_version = version;
|
||||
free->di_gen = cpu_to_be32(gen);
|
||||
|
@ -937,7 +937,7 @@ xfs_dialloc(
|
|||
}
|
||||
}
|
||||
}
|
||||
offset = XFS_IALLOC_FIND_FREE(&rec.ir_free);
|
||||
offset = xfs_ialloc_find_free(&rec.ir_free);
|
||||
ASSERT(offset >= 0);
|
||||
ASSERT(offset < XFS_INODES_PER_CHUNK);
|
||||
ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) %
|
||||
|
@ -1279,7 +1279,7 @@ xfs_imap(
|
|||
offset = XFS_INO_TO_OFFSET(mp, ino);
|
||||
ASSERT(offset < mp->m_sb.sb_inopblock);
|
||||
|
||||
cluster_agbno = XFS_DADDR_TO_AGBNO(mp, imap->im_blkno);
|
||||
cluster_agbno = xfs_daddr_to_agbno(mp, imap->im_blkno);
|
||||
offset += (agbno - cluster_agbno) * mp->m_sb.sb_inopblock;
|
||||
|
||||
imap->im_len = XFS_FSB_TO_BB(mp, blks_per_cluster);
|
||||
|
|
|
@ -39,7 +39,6 @@ struct xfs_trans;
|
|||
/*
|
||||
* Make an inode pointer out of the buffer/offset.
|
||||
*/
|
||||
#define XFS_MAKE_IPTR(mp,b,o) xfs_make_iptr(mp,b,o)
|
||||
static inline struct xfs_dinode *
|
||||
xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o)
|
||||
{
|
||||
|
@ -50,7 +49,6 @@ xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o)
|
|||
/*
|
||||
* Find a free (set) bit in the inode bitmask.
|
||||
*/
|
||||
#define XFS_IALLOC_FIND_FREE(fp) xfs_ialloc_find_free(fp)
|
||||
static inline int xfs_ialloc_find_free(xfs_inofree_t *fp)
|
||||
{
|
||||
return xfs_lowbit64(*fp);
|
||||
|
|
|
@ -36,7 +36,6 @@ typedef __uint64_t xfs_inofree_t;
|
|||
#define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3)
|
||||
#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1)
|
||||
|
||||
#define XFS_INOBT_MASKN(i,n) xfs_inobt_maskn(i,n)
|
||||
static inline xfs_inofree_t xfs_inobt_maskn(int i, int n)
|
||||
{
|
||||
return (((n) >= XFS_INODES_PER_CHUNK ? \
|
||||
|
|
|
@ -424,6 +424,19 @@ xfs_iformat(
|
|||
case XFS_DINODE_FMT_LOCAL:
|
||||
atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip);
|
||||
size = be16_to_cpu(atp->hdr.totsize);
|
||||
|
||||
if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu "
|
||||
"(bad attr fork size %Ld).",
|
||||
(unsigned long long) ip->i_ino,
|
||||
(long long) size);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(8)",
|
||||
XFS_ERRLEVEL_LOW,
|
||||
ip->i_mount, dip);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size);
|
||||
break;
|
||||
case XFS_DINODE_FMT_EXTENTS:
|
||||
|
@ -1601,10 +1614,10 @@ xfs_itruncate_finish(
|
|||
* in this file with garbage in them once recovery
|
||||
* runs.
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
error = xfs_bunmapi(ntp, ip,
|
||||
first_unmap_block, unmap_len,
|
||||
XFS_BMAPI_AFLAG(fork) |
|
||||
xfs_bmapi_aflag(fork) |
|
||||
(sync ? 0 : XFS_BMAPI_ASYNC),
|
||||
XFS_ITRUNC_MAX_EXTENTS,
|
||||
&first_block, &free_list,
|
||||
|
@ -2557,7 +2570,7 @@ xfs_iextents_copy(
|
|||
for (i = 0; i < nrecs; i++) {
|
||||
xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i);
|
||||
start_block = xfs_bmbt_get_startblock(ep);
|
||||
if (ISNULLSTARTBLOCK(start_block)) {
|
||||
if (isnullstartblock(start_block)) {
|
||||
/*
|
||||
* It's a delayed allocation extent, so skip it.
|
||||
*/
|
||||
|
|
|
@ -111,20 +111,16 @@ typedef struct xfs_inode_log_format_64 {
|
|||
|
||||
#define XFS_ILI_IOLOCKED_ANY (XFS_ILI_IOLOCKED_EXCL | XFS_ILI_IOLOCKED_SHARED)
|
||||
|
||||
|
||||
#define XFS_ILOG_FBROOT(w) xfs_ilog_fbroot(w)
|
||||
static inline int xfs_ilog_fbroot(int w)
|
||||
{
|
||||
return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT);
|
||||
}
|
||||
|
||||
#define XFS_ILOG_FEXT(w) xfs_ilog_fext(w)
|
||||
static inline int xfs_ilog_fext(int w)
|
||||
{
|
||||
return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT);
|
||||
}
|
||||
|
||||
#define XFS_ILOG_FDATA(w) xfs_ilog_fdata(w)
|
||||
static inline int xfs_ilog_fdata(int w)
|
||||
{
|
||||
return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA);
|
||||
|
|
|
@ -155,7 +155,7 @@ xfs_imap_to_bmap(
|
|||
iomapp->iomap_bn = IOMAP_DADDR_NULL;
|
||||
iomapp->iomap_flags |= IOMAP_DELAY;
|
||||
} else {
|
||||
iomapp->iomap_bn = XFS_FSB_TO_DB(ip, start_block);
|
||||
iomapp->iomap_bn = xfs_fsb_to_db(ip, start_block);
|
||||
if (ISUNWRITTEN(imap))
|
||||
iomapp->iomap_flags |= IOMAP_UNWRITTEN;
|
||||
}
|
||||
|
@ -261,7 +261,7 @@ xfs_iomap(
|
|||
xfs_iunlock(ip, lockmode);
|
||||
lockmode = 0;
|
||||
|
||||
if (nimaps && !ISNULLSTARTBLOCK(imap.br_startblock)) {
|
||||
if (nimaps && !isnullstartblock(imap.br_startblock)) {
|
||||
xfs_iomap_map_trace(XFS_IOMAP_WRITE_MAP, ip,
|
||||
offset, count, iomapp, &imap, flags);
|
||||
break;
|
||||
|
@ -491,7 +491,7 @@ xfs_iomap_write_direct(
|
|||
/*
|
||||
* Issue the xfs_bmapi() call to allocate the blocks
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &firstfsb);
|
||||
xfs_bmap_init(&free_list, &firstfsb);
|
||||
nimaps = 1;
|
||||
error = xfs_bmapi(tp, ip, offset_fsb, count_fsb, bmapi_flag,
|
||||
&firstfsb, 0, &imap, &nimaps, &free_list, NULL);
|
||||
|
@ -751,7 +751,7 @@ xfs_iomap_write_allocate(
|
|||
xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ihold(tp, ip);
|
||||
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
|
||||
/*
|
||||
* it is possible that the extents have changed since
|
||||
|
@ -911,7 +911,7 @@ xfs_iomap_write_unwritten(
|
|||
/*
|
||||
* Modify the unwritten extent state of the buffer.
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &firstfsb);
|
||||
xfs_bmap_init(&free_list, &firstfsb);
|
||||
nimaps = 1;
|
||||
error = xfs_bmapi(tp, ip, offset_fsb, count_fsb,
|
||||
XFS_BMAPI_WRITE|XFS_BMAPI_CONVERT, &firstfsb,
|
||||
|
|
|
@ -453,7 +453,7 @@ xfs_bulkstat(
|
|||
(chunkidx = agino - gino + 1) <
|
||||
XFS_INODES_PER_CHUNK &&
|
||||
/* there are some left allocated */
|
||||
XFS_INOBT_MASKN(chunkidx,
|
||||
xfs_inobt_maskn(chunkidx,
|
||||
XFS_INODES_PER_CHUNK - chunkidx) & ~gfree) {
|
||||
/*
|
||||
* Grab the chunk record. Mark all the
|
||||
|
@ -464,7 +464,7 @@ xfs_bulkstat(
|
|||
if (XFS_INOBT_MASK(i) & ~gfree)
|
||||
gcnt++;
|
||||
}
|
||||
gfree |= XFS_INOBT_MASKN(0, chunkidx);
|
||||
gfree |= xfs_inobt_maskn(0, chunkidx);
|
||||
irbp->ir_startino = gino;
|
||||
irbp->ir_freecount = gcnt;
|
||||
irbp->ir_free = gfree;
|
||||
|
@ -535,7 +535,7 @@ xfs_bulkstat(
|
|||
chunkidx < XFS_INODES_PER_CHUNK;
|
||||
chunkidx += nicluster,
|
||||
agbno += nbcluster) {
|
||||
if (XFS_INOBT_MASKN(chunkidx,
|
||||
if (xfs_inobt_maskn(chunkidx,
|
||||
nicluster) & ~gfree)
|
||||
xfs_btree_reada_bufs(mp, agno,
|
||||
agbno, nbcluster);
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include "xfs_fsops.h"
|
||||
#include "xfs_utils.h"
|
||||
|
||||
STATIC int xfs_mount_log_sb(xfs_mount_t *, __int64_t);
|
||||
STATIC int xfs_uuid_mount(xfs_mount_t *);
|
||||
STATIC void xfs_unmountfs_wait(xfs_mount_t *);
|
||||
|
||||
|
@ -682,7 +681,7 @@ xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount)
|
|||
* Update alignment values based on mount options and sb values
|
||||
*/
|
||||
STATIC int
|
||||
xfs_update_alignment(xfs_mount_t *mp, __uint64_t *update_flags)
|
||||
xfs_update_alignment(xfs_mount_t *mp)
|
||||
{
|
||||
xfs_sb_t *sbp = &(mp->m_sb);
|
||||
|
||||
|
@ -736,11 +735,11 @@ xfs_update_alignment(xfs_mount_t *mp, __uint64_t *update_flags)
|
|||
if (xfs_sb_version_hasdalign(sbp)) {
|
||||
if (sbp->sb_unit != mp->m_dalign) {
|
||||
sbp->sb_unit = mp->m_dalign;
|
||||
*update_flags |= XFS_SB_UNIT;
|
||||
mp->m_update_flags |= XFS_SB_UNIT;
|
||||
}
|
||||
if (sbp->sb_width != mp->m_swidth) {
|
||||
sbp->sb_width = mp->m_swidth;
|
||||
*update_flags |= XFS_SB_WIDTH;
|
||||
mp->m_update_flags |= XFS_SB_WIDTH;
|
||||
}
|
||||
}
|
||||
} else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN &&
|
||||
|
@ -905,7 +904,6 @@ xfs_mountfs(
|
|||
xfs_sb_t *sbp = &(mp->m_sb);
|
||||
xfs_inode_t *rip;
|
||||
__uint64_t resblks;
|
||||
__int64_t update_flags = 0LL;
|
||||
uint quotamount, quotaflags;
|
||||
int uuid_mounted = 0;
|
||||
int error = 0;
|
||||
|
@ -933,7 +931,7 @@ xfs_mountfs(
|
|||
"XFS: correcting sb_features alignment problem");
|
||||
sbp->sb_features2 |= sbp->sb_bad_features2;
|
||||
sbp->sb_bad_features2 = sbp->sb_features2;
|
||||
update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2;
|
||||
mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2;
|
||||
|
||||
/*
|
||||
* Re-check for ATTR2 in case it was found in bad_features2
|
||||
|
@ -947,11 +945,11 @@ xfs_mountfs(
|
|||
if (xfs_sb_version_hasattr2(&mp->m_sb) &&
|
||||
(mp->m_flags & XFS_MOUNT_NOATTR2)) {
|
||||
xfs_sb_version_removeattr2(&mp->m_sb);
|
||||
update_flags |= XFS_SB_FEATURES2;
|
||||
mp->m_update_flags |= XFS_SB_FEATURES2;
|
||||
|
||||
/* update sb_versionnum for the clearing of the morebits */
|
||||
if (!sbp->sb_features2)
|
||||
update_flags |= XFS_SB_VERSIONNUM;
|
||||
mp->m_update_flags |= XFS_SB_VERSIONNUM;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -960,7 +958,7 @@ xfs_mountfs(
|
|||
* allocator alignment is within an ag, therefore ag has
|
||||
* to be aligned at stripe boundary.
|
||||
*/
|
||||
error = xfs_update_alignment(mp, &update_flags);
|
||||
error = xfs_update_alignment(mp);
|
||||
if (error)
|
||||
goto error1;
|
||||
|
||||
|
@ -1137,10 +1135,12 @@ xfs_mountfs(
|
|||
}
|
||||
|
||||
/*
|
||||
* If fs is not mounted readonly, then update the superblock changes.
|
||||
* If this is a read-only mount defer the superblock updates until
|
||||
* the next remount into writeable mode. Otherwise we would never
|
||||
* perform the update e.g. for the root filesystem.
|
||||
*/
|
||||
if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
|
||||
error = xfs_mount_log_sb(mp, update_flags);
|
||||
if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
|
||||
error = xfs_mount_log_sb(mp, mp->m_update_flags);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: failed to write sb changes");
|
||||
goto error4;
|
||||
|
@ -1820,7 +1820,7 @@ xfs_uuid_mount(
|
|||
* be altered by the mount options, as well as any potential sb_features2
|
||||
* fixup. Only the first superblock is updated.
|
||||
*/
|
||||
STATIC int
|
||||
int
|
||||
xfs_mount_log_sb(
|
||||
xfs_mount_t *mp,
|
||||
__int64_t fields)
|
||||
|
|
|
@ -44,9 +44,9 @@ typedef struct xfs_trans_reservations {
|
|||
|
||||
#ifndef __KERNEL__
|
||||
|
||||
#define XFS_DADDR_TO_AGNO(mp,d) \
|
||||
#define xfs_daddr_to_agno(mp,d) \
|
||||
((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks))
|
||||
#define XFS_DADDR_TO_AGBNO(mp,d) \
|
||||
#define xfs_daddr_to_agbno(mp,d) \
|
||||
((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks))
|
||||
|
||||
#else /* __KERNEL__ */
|
||||
|
@ -327,6 +327,8 @@ typedef struct xfs_mount {
|
|||
spinlock_t m_sync_lock; /* work item list lock */
|
||||
int m_sync_seq; /* sync thread generation no. */
|
||||
wait_queue_head_t m_wait_single_sync_task;
|
||||
__int64_t m_update_flags; /* sb flags we need to update
|
||||
on the next remount,rw */
|
||||
} xfs_mount_t;
|
||||
|
||||
/*
|
||||
|
@ -439,7 +441,6 @@ void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
|
|||
*/
|
||||
#define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */
|
||||
|
||||
#define XFS_DADDR_TO_AGNO(mp,d) xfs_daddr_to_agno(mp,d)
|
||||
static inline xfs_agnumber_t
|
||||
xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d)
|
||||
{
|
||||
|
@ -448,7 +449,6 @@ xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d)
|
|||
return (xfs_agnumber_t) ld;
|
||||
}
|
||||
|
||||
#define XFS_DADDR_TO_AGBNO(mp,d) xfs_daddr_to_agbno(mp,d)
|
||||
static inline xfs_agblock_t
|
||||
xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
|
||||
{
|
||||
|
@ -514,6 +514,7 @@ extern int xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t,
|
|||
int64_t, int);
|
||||
extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *,
|
||||
uint, int);
|
||||
extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t);
|
||||
extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);
|
||||
extern int xfs_readsb(xfs_mount_t *, int);
|
||||
extern void xfs_freesb(xfs_mount_t *);
|
||||
|
|
|
@ -147,7 +147,7 @@ xfs_rename(
|
|||
xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip,
|
||||
inodes, &num_inodes);
|
||||
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
|
||||
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
|
||||
spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
|
||||
|
|
|
@ -120,7 +120,7 @@ xfs_growfs_rt_alloc(
|
|||
if ((error = xfs_trans_iget(mp, tp, ino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
goto error_cancel;
|
||||
XFS_BMAP_INIT(&flist, &firstblock);
|
||||
xfs_bmap_init(&flist, &firstblock);
|
||||
/*
|
||||
* Allocate blocks to the bitmap file.
|
||||
*/
|
||||
|
|
|
@ -28,7 +28,6 @@ struct xfs_mount;
|
|||
* file is a real time file or not, because the bmap code
|
||||
* does.
|
||||
*/
|
||||
#define XFS_FSB_TO_DB(ip,fsb) xfs_fsb_to_db(ip,fsb)
|
||||
static inline xfs_daddr_t
|
||||
xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb)
|
||||
{
|
||||
|
|
|
@ -505,7 +505,7 @@ static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp)
|
|||
|
||||
#define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d))
|
||||
#define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \
|
||||
XFS_DADDR_TO_AGNO(mp,d), XFS_DADDR_TO_AGBNO(mp,d))
|
||||
xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d))
|
||||
#define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \
|
||||
XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno))
|
||||
|
||||
|
|
|
@ -862,7 +862,7 @@ xfs_inactive_symlink_rmt(
|
|||
* Find the block(s) so we can inval and unmap them.
|
||||
*/
|
||||
done = 0;
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
nmaps = ARRAY_SIZE(mval);
|
||||
if ((error = xfs_bmapi(tp, ip, 0, XFS_B_TO_FSB(mp, size),
|
||||
XFS_BMAPI_METADATA, &first_block, 0, mval, &nmaps,
|
||||
|
@ -1288,7 +1288,7 @@ xfs_inactive(
|
|||
/*
|
||||
* Free the inode.
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
error = xfs_ifree(tp, ip, &free_list);
|
||||
if (error) {
|
||||
/*
|
||||
|
@ -1461,7 +1461,7 @@ xfs_create(
|
|||
xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
|
||||
unlock_dp_on_error = B_TRUE;
|
||||
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
|
||||
ASSERT(ip == NULL);
|
||||
|
||||
|
@ -1879,7 +1879,7 @@ xfs_remove(
|
|||
}
|
||||
}
|
||||
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
error = xfs_dir_removename(tp, dp, name, ip->i_ino,
|
||||
&first_block, &free_list, resblks);
|
||||
if (error) {
|
||||
|
@ -2059,7 +2059,7 @@ xfs_link(
|
|||
if (error)
|
||||
goto error_return;
|
||||
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
|
||||
error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino,
|
||||
&first_block, &free_list, resblks);
|
||||
|
@ -2231,7 +2231,7 @@ xfs_mkdir(
|
|||
xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
|
||||
unlock_dp_on_error = B_FALSE;
|
||||
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
|
||||
error = xfs_dir_createname(tp, dp, dir_name, cdp->i_ino,
|
||||
&first_block, &free_list, resblks ?
|
||||
|
@ -2438,7 +2438,7 @@ xfs_symlink(
|
|||
* Initialize the bmap freelist prior to calling either
|
||||
* bmapi or the directory create code.
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &first_block);
|
||||
xfs_bmap_init(&free_list, &first_block);
|
||||
|
||||
/*
|
||||
* Allocate an inode for the symlink.
|
||||
|
@ -2860,7 +2860,7 @@ xfs_alloc_file_space(
|
|||
/*
|
||||
* Issue the xfs_bmapi() call to allocate the blocks
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &firstfsb);
|
||||
xfs_bmap_init(&free_list, &firstfsb);
|
||||
error = xfs_bmapi(tp, ip, startoffset_fsb,
|
||||
allocatesize_fsb, bmapi_flag,
|
||||
&firstfsb, 0, imapp, &nimaps,
|
||||
|
@ -2980,7 +2980,7 @@ xfs_zero_remaining_bytes(
|
|||
XFS_BUF_UNDONE(bp);
|
||||
XFS_BUF_UNWRITE(bp);
|
||||
XFS_BUF_READ(bp);
|
||||
XFS_BUF_SET_ADDR(bp, XFS_FSB_TO_DB(ip, imap.br_startblock));
|
||||
XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock));
|
||||
xfsbdstrat(mp, bp);
|
||||
error = xfs_iowait(bp);
|
||||
if (error) {
|
||||
|
@ -3186,7 +3186,7 @@ xfs_free_file_space(
|
|||
/*
|
||||
* issue the bunmapi() call to free the blocks
|
||||
*/
|
||||
XFS_BMAP_INIT(&free_list, &firstfsb);
|
||||
xfs_bmap_init(&free_list, &firstfsb);
|
||||
error = xfs_bunmapi(tp, ip, startoffset_fsb,
|
||||
endoffset_fsb - startoffset_fsb,
|
||||
0, 2, &firstfsb, &free_list, NULL, &done);
|
||||
|
|
Loading…
Reference in a new issue