mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6
* 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6: (87 commits) [XFS] Fix merge failure [XFS] The forward declarations for the xfs_ioctl() helpers and the [XFS] Update XFS documentation for noikeep/ikeep. [XFS] Update XFS Documentation for ikeep and ihashsize [XFS] Remove unused HAVE_SPLICE macro. [XFS] Remove CONFIG_XFS_SECURITY. [XFS] xfs_bmap_compute_maxlevels should be based on di_forkoff [XFS] Always use di_forkoff when checking for attr space. [XFS] Ensure the inode is joined in xfs_itruncate_finish [XFS] Remove periodic logging of in-core superblock counters. [XFS] fix logic error in xfs_alloc_ag_vextent_near() [XFS] Don't error out on good I/Os. [XFS] Catch log unmount failures. [XFS] Sanitise xfs_log_force error checking. [XFS] Check for errors when changing buffer pointers. [XFS] Don't allow silent errors in xfs_inactive(). [XFS] Catch errors from xfs_imap(). [XFS] xfs_bulkstat_one_dinode() never returns an error. [XFS] xfs_iflush_fork() never returns an error. [XFS] Catch unwritten extent conversion errors. ...
This commit is contained in:
@@ -52,16 +52,15 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||
and also gets the setgid bit set if it is a directory itself.
|
||||
|
||||
ihashsize=value
|
||||
Sets the number of hash buckets available for hashing the
|
||||
in-memory inodes of the specified mount point. If a value
|
||||
of zero is used, the value selected by the default algorithm
|
||||
will be displayed in /proc/mounts.
|
||||
In memory inode hashes have been removed, so this option has
|
||||
no function as of August 2007. Option is deprecated.
|
||||
|
||||
ikeep/noikeep
|
||||
When inode clusters are emptied of inodes, keep them around
|
||||
on the disk (ikeep) - this is the traditional XFS behaviour
|
||||
and is still the default for now. Using the noikeep option,
|
||||
inode clusters are returned to the free space pool.
|
||||
When ikeep is specified, XFS does not delete empty inode clusters
|
||||
and keeps them around on disk. ikeep is the traditional XFS
|
||||
behaviour. When noikeep is specified, empty inode clusters
|
||||
are returned to the free space pool. The default is noikeep for
|
||||
non-DMAPI mounts, while ikeep is the default when DMAPI is in use.
|
||||
|
||||
inode64
|
||||
Indicates that XFS is allowed to create inodes at any location
|
||||
|
||||
@@ -35,18 +35,6 @@ config XFS_QUOTA
|
||||
with or without the generic quota support enabled (CONFIG_QUOTA) -
|
||||
they are completely independent subsystems.
|
||||
|
||||
config XFS_SECURITY
|
||||
bool "XFS Security Label support"
|
||||
depends on XFS_FS
|
||||
help
|
||||
Security labels support alternative access control models
|
||||
implemented by security modules like SELinux. This option
|
||||
enables an extended attribute namespace for inode security
|
||||
labels in the XFS filesystem.
|
||||
|
||||
If you are not using a security module that requires using
|
||||
extended attributes for inode security labels, say N.
|
||||
|
||||
config XFS_POSIX_ACL
|
||||
bool "XFS POSIX ACL support"
|
||||
depends on XFS_FS
|
||||
|
||||
@@ -37,7 +37,7 @@ kmem_alloc(size_t size, unsigned int __nocast flags)
|
||||
#ifdef DEBUG
|
||||
if (unlikely(!(flags & KM_LARGE) && (size > PAGE_SIZE))) {
|
||||
printk(KERN_WARNING "Large %s attempt, size=%ld\n",
|
||||
__FUNCTION__, (long)size);
|
||||
__func__, (long)size);
|
||||
dump_stack();
|
||||
}
|
||||
#endif
|
||||
@@ -52,7 +52,7 @@ kmem_alloc(size_t size, unsigned int __nocast flags)
|
||||
if (!(++retries % 100))
|
||||
printk(KERN_ERR "XFS: possible memory allocation "
|
||||
"deadlock in %s (mode:0x%x)\n",
|
||||
__FUNCTION__, lflags);
|
||||
__func__, lflags);
|
||||
congestion_wait(WRITE, HZ/50);
|
||||
} while (1);
|
||||
}
|
||||
@@ -129,7 +129,7 @@ kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags)
|
||||
if (!(++retries % 100))
|
||||
printk(KERN_ERR "XFS: possible memory allocation "
|
||||
"deadlock in %s (mode:0x%x)\n",
|
||||
__FUNCTION__, lflags);
|
||||
__func__, lflags);
|
||||
congestion_wait(WRITE, HZ/50);
|
||||
} while (1);
|
||||
}
|
||||
|
||||
@@ -243,8 +243,12 @@ xfs_end_bio_unwritten(
|
||||
size_t size = ioend->io_size;
|
||||
|
||||
if (likely(!ioend->io_error)) {
|
||||
if (!XFS_FORCED_SHUTDOWN(ip->i_mount))
|
||||
xfs_iomap_write_unwritten(ip, offset, size);
|
||||
if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
int error;
|
||||
error = xfs_iomap_write_unwritten(ip, offset, size);
|
||||
if (error)
|
||||
ioend->io_error = error;
|
||||
}
|
||||
xfs_setfilesize(ioend);
|
||||
}
|
||||
xfs_destroy_ioend(ioend);
|
||||
@@ -1532,9 +1536,9 @@ xfs_vm_bmap(
|
||||
struct xfs_inode *ip = XFS_I(inode);
|
||||
|
||||
xfs_itrace_entry(XFS_I(inode));
|
||||
xfs_rwlock(ip, VRWLOCK_READ);
|
||||
xfs_ilock(ip, XFS_IOLOCK_SHARED);
|
||||
xfs_flush_pages(ip, (xfs_off_t)0, -1, 0, FI_REMAPF);
|
||||
xfs_rwunlock(ip, VRWLOCK_READ);
|
||||
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
||||
return generic_block_bmap(mapping, block, xfs_get_blocks);
|
||||
}
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@ _xfs_buf_lookup_pages(
|
||||
printk(KERN_ERR
|
||||
"XFS: possible memory allocation "
|
||||
"deadlock in %s (mode:0x%x)\n",
|
||||
__FUNCTION__, gfp_mask);
|
||||
__func__, gfp_mask);
|
||||
|
||||
XFS_STATS_INC(xb_page_retries);
|
||||
xfsbufd_wakeup(0, gfp_mask);
|
||||
@@ -598,7 +598,7 @@ xfs_buf_get_flags(
|
||||
error = _xfs_buf_map_pages(bp, flags);
|
||||
if (unlikely(error)) {
|
||||
printk(KERN_WARNING "%s: failed to map pages\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
goto no_buffer;
|
||||
}
|
||||
}
|
||||
@@ -778,7 +778,7 @@ xfs_buf_get_noaddr(
|
||||
error = _xfs_buf_map_pages(bp, XBF_MAPPED);
|
||||
if (unlikely(error)) {
|
||||
printk(KERN_WARNING "%s: failed to map pages\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
goto fail_free_mem;
|
||||
}
|
||||
|
||||
@@ -1060,7 +1060,7 @@ xfs_buf_iostart(
|
||||
bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC);
|
||||
bp->b_flags |= flags & (XBF_DELWRI | XBF_ASYNC);
|
||||
xfs_buf_delwri_queue(bp, 1);
|
||||
return status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_ASYNC | XBF_DELWRI | \
|
||||
|
||||
@@ -387,11 +387,15 @@ static inline int XFS_bwrite(xfs_buf_t *bp)
|
||||
return error;
|
||||
}
|
||||
|
||||
static inline int xfs_bdwrite(void *mp, xfs_buf_t *bp)
|
||||
/*
|
||||
* No error can be returned from xfs_buf_iostart for delwri
|
||||
* buffers as they are queued and no I/O is issued.
|
||||
*/
|
||||
static inline void xfs_bdwrite(void *mp, xfs_buf_t *bp)
|
||||
{
|
||||
bp->b_strat = xfs_bdstrat_cb;
|
||||
bp->b_fspriv3 = mp;
|
||||
return xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC);
|
||||
(void)xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC);
|
||||
}
|
||||
|
||||
#define XFS_bdstrat(bp) xfs_buf_iorequest(bp)
|
||||
|
||||
@@ -30,7 +30,7 @@ typedef struct cred {
|
||||
extern struct cred *sys_cred;
|
||||
|
||||
/* this is a hack.. (assumes sys_cred is the only cred_t in the system) */
|
||||
static __inline int capable_cred(cred_t *cr, int cid)
|
||||
static inline int capable_cred(cred_t *cr, int cid)
|
||||
{
|
||||
return (cr == sys_cred) ? 1 : capable(cid);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "xfs_trans.h"
|
||||
#include "xfs_sb.h"
|
||||
#include "xfs_ag.h"
|
||||
#include "xfs_dir2.h"
|
||||
#include "xfs_dmapi.h"
|
||||
#include "xfs_mount.h"
|
||||
#include "xfs_export.h"
|
||||
@@ -30,8 +31,6 @@
|
||||
#include "xfs_inode.h"
|
||||
#include "xfs_vfsops.h"
|
||||
|
||||
static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, };
|
||||
|
||||
/*
|
||||
* Note that we only accept fileids which are long enough rather than allow
|
||||
* the parent generation number to default to zero. XFS considers zero a
|
||||
@@ -66,7 +65,7 @@ xfs_fs_encode_fh(
|
||||
int len;
|
||||
|
||||
/* Directories don't need their parent encoded, they have ".." */
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
if (S_ISDIR(inode->i_mode) || !connectable)
|
||||
fileid_type = FILEID_INO32_GEN;
|
||||
else
|
||||
fileid_type = FILEID_INO32_GEN_PARENT;
|
||||
@@ -213,17 +212,16 @@ xfs_fs_get_parent(
|
||||
struct dentry *child)
|
||||
{
|
||||
int error;
|
||||
bhv_vnode_t *cvp;
|
||||
struct xfs_inode *cip;
|
||||
struct dentry *parent;
|
||||
|
||||
cvp = NULL;
|
||||
error = xfs_lookup(XFS_I(child->d_inode), &dotdot, &cvp);
|
||||
error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip);
|
||||
if (unlikely(error))
|
||||
return ERR_PTR(-error);
|
||||
|
||||
parent = d_alloc_anon(vn_to_inode(cvp));
|
||||
parent = d_alloc_anon(cip->i_vnode);
|
||||
if (unlikely(!parent)) {
|
||||
VN_RELE(cvp);
|
||||
iput(cip->i_vnode);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
return parent;
|
||||
|
||||
@@ -469,16 +469,11 @@ xfs_file_open_exec(
|
||||
struct inode *inode)
|
||||
{
|
||||
struct xfs_mount *mp = XFS_M(inode->i_sb);
|
||||
struct xfs_inode *ip = XFS_I(inode);
|
||||
|
||||
if (unlikely(mp->m_flags & XFS_MOUNT_DMAPI)) {
|
||||
if (DM_EVENT_ENABLED(XFS_I(inode), DM_EVENT_READ)) {
|
||||
bhv_vnode_t *vp = vn_from_inode(inode);
|
||||
|
||||
return -XFS_SEND_DATA(mp, DM_EVENT_READ,
|
||||
vp, 0, 0, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(mp->m_flags & XFS_MOUNT_DMAPI) &&
|
||||
DM_EVENT_ENABLED(ip, DM_EVENT_READ))
|
||||
return -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, 0, 0, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_FOP_OPEN_EXEC */
|
||||
|
||||
@@ -17,18 +17,7 @@
|
||||
*/
|
||||
#include "xfs.h"
|
||||
#include "xfs_vnodeops.h"
|
||||
|
||||
/*
|
||||
* The following six includes are needed so that we can include
|
||||
* xfs_inode.h. What a mess..
|
||||
*/
|
||||
#include "xfs_bmap_btree.h"
|
||||
#include "xfs_inum.h"
|
||||
#include "xfs_dir2.h"
|
||||
#include "xfs_dir2_sf.h"
|
||||
#include "xfs_attr_sf.h"
|
||||
#include "xfs_dinode.h"
|
||||
|
||||
#include "xfs_inode.h"
|
||||
|
||||
int fs_noerr(void) { return 0; }
|
||||
@@ -42,11 +31,10 @@ xfs_tosspages(
|
||||
xfs_off_t last,
|
||||
int fiopt)
|
||||
{
|
||||
bhv_vnode_t *vp = XFS_ITOV(ip);
|
||||
struct inode *inode = vn_to_inode(vp);
|
||||
struct address_space *mapping = ip->i_vnode->i_mapping;
|
||||
|
||||
if (VN_CACHED(vp))
|
||||
truncate_inode_pages(inode->i_mapping, first);
|
||||
if (mapping->nrpages)
|
||||
truncate_inode_pages(mapping, first);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -56,15 +44,14 @@ xfs_flushinval_pages(
|
||||
xfs_off_t last,
|
||||
int fiopt)
|
||||
{
|
||||
bhv_vnode_t *vp = XFS_ITOV(ip);
|
||||
struct inode *inode = vn_to_inode(vp);
|
||||
struct address_space *mapping = ip->i_vnode->i_mapping;
|
||||
int ret = 0;
|
||||
|
||||
if (VN_CACHED(vp)) {
|
||||
if (mapping->nrpages) {
|
||||
xfs_iflags_clear(ip, XFS_ITRUNCATED);
|
||||
ret = filemap_write_and_wait(inode->i_mapping);
|
||||
ret = filemap_write_and_wait(mapping);
|
||||
if (!ret)
|
||||
truncate_inode_pages(inode->i_mapping, first);
|
||||
truncate_inode_pages(mapping, first);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -77,17 +64,16 @@ xfs_flush_pages(
|
||||
uint64_t flags,
|
||||
int fiopt)
|
||||
{
|
||||
bhv_vnode_t *vp = XFS_ITOV(ip);
|
||||
struct inode *inode = vn_to_inode(vp);
|
||||
struct address_space *mapping = ip->i_vnode->i_mapping;
|
||||
int ret = 0;
|
||||
int ret2;
|
||||
|
||||
if (VN_DIRTY(vp)) {
|
||||
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
|
||||
xfs_iflags_clear(ip, XFS_ITRUNCATED);
|
||||
ret = filemap_fdatawrite(inode->i_mapping);
|
||||
ret = filemap_fdatawrite(mapping);
|
||||
if (flags & XFS_B_ASYNC)
|
||||
return ret;
|
||||
ret2 = filemap_fdatawait(inode->i_mapping);
|
||||
ret2 = filemap_fdatawait(mapping);
|
||||
if (!ret)
|
||||
ret = ret2;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -62,12 +62,11 @@ void
|
||||
xfs_synchronize_atime(
|
||||
xfs_inode_t *ip)
|
||||
{
|
||||
bhv_vnode_t *vp;
|
||||
struct inode *inode = ip->i_vnode;
|
||||
|
||||
vp = XFS_ITOV_NULL(ip);
|
||||
if (vp) {
|
||||
ip->i_d.di_atime.t_sec = (__int32_t)vp->i_atime.tv_sec;
|
||||
ip->i_d.di_atime.t_nsec = (__int32_t)vp->i_atime.tv_nsec;
|
||||
if (inode) {
|
||||
ip->i_d.di_atime.t_sec = (__int32_t)inode->i_atime.tv_sec;
|
||||
ip->i_d.di_atime.t_nsec = (__int32_t)inode->i_atime.tv_nsec;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,11 +79,10 @@ void
|
||||
xfs_mark_inode_dirty_sync(
|
||||
xfs_inode_t *ip)
|
||||
{
|
||||
bhv_vnode_t *vp;
|
||||
struct inode *inode = ip->i_vnode;
|
||||
|
||||
vp = XFS_ITOV_NULL(ip);
|
||||
if (vp)
|
||||
mark_inode_dirty_sync(vn_to_inode(vp));
|
||||
if (inode)
|
||||
mark_inode_dirty_sync(inode);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -215,66 +213,62 @@ xfs_validate_fields(
|
||||
*/
|
||||
STATIC int
|
||||
xfs_init_security(
|
||||
bhv_vnode_t *vp,
|
||||
struct inode *inode,
|
||||
struct inode *dir)
|
||||
{
|
||||
struct inode *ip = vn_to_inode(vp);
|
||||
struct xfs_inode *ip = XFS_I(inode);
|
||||
size_t length;
|
||||
void *value;
|
||||
char *name;
|
||||
int error;
|
||||
|
||||
error = security_inode_init_security(ip, dir, &name, &value, &length);
|
||||
error = security_inode_init_security(inode, dir, &name,
|
||||
&value, &length);
|
||||
if (error) {
|
||||
if (error == -EOPNOTSUPP)
|
||||
return 0;
|
||||
return -error;
|
||||
}
|
||||
|
||||
error = xfs_attr_set(XFS_I(ip), name, value,
|
||||
length, ATTR_SECURE);
|
||||
error = xfs_attr_set(ip, name, value, length, ATTR_SECURE);
|
||||
if (!error)
|
||||
xfs_iflags_set(XFS_I(ip), XFS_IMODIFIED);
|
||||
xfs_iflags_set(ip, XFS_IMODIFIED);
|
||||
|
||||
kfree(name);
|
||||
kfree(value);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine whether a process has a valid fs_struct (kernel daemons
|
||||
* like knfsd don't have an fs_struct).
|
||||
*
|
||||
* XXX(hch): nfsd is broken, better fix it instead.
|
||||
*/
|
||||
STATIC_INLINE int
|
||||
xfs_has_fs_struct(struct task_struct *task)
|
||||
static void
|
||||
xfs_dentry_to_name(
|
||||
struct xfs_name *namep,
|
||||
struct dentry *dentry)
|
||||
{
|
||||
return (task->fs != init_task.fs);
|
||||
namep->name = dentry->d_name.name;
|
||||
namep->len = dentry->d_name.len;
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_cleanup_inode(
|
||||
struct inode *dir,
|
||||
bhv_vnode_t *vp,
|
||||
struct inode *inode,
|
||||
struct dentry *dentry,
|
||||
int mode)
|
||||
{
|
||||
struct dentry teardown = {};
|
||||
struct xfs_name teardown;
|
||||
|
||||
/* Oh, the horror.
|
||||
* If we can't add the ACL or we fail in
|
||||
* xfs_init_security we must back out.
|
||||
* ENOSPC can hit here, among other things.
|
||||
*/
|
||||
teardown.d_inode = vn_to_inode(vp);
|
||||
teardown.d_name = dentry->d_name;
|
||||
xfs_dentry_to_name(&teardown, dentry);
|
||||
|
||||
if (S_ISDIR(mode))
|
||||
xfs_rmdir(XFS_I(dir), &teardown);
|
||||
xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode));
|
||||
else
|
||||
xfs_remove(XFS_I(dir), &teardown);
|
||||
VN_RELE(vp);
|
||||
xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
|
||||
iput(inode);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
@@ -284,9 +278,10 @@ xfs_vn_mknod(
|
||||
int mode,
|
||||
dev_t rdev)
|
||||
{
|
||||
struct inode *ip;
|
||||
bhv_vnode_t *vp = NULL, *dvp = vn_from_inode(dir);
|
||||
struct inode *inode;
|
||||
struct xfs_inode *ip = NULL;
|
||||
xfs_acl_t *default_acl = NULL;
|
||||
struct xfs_name name;
|
||||
attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS;
|
||||
int error;
|
||||
|
||||
@@ -297,59 +292,67 @@ xfs_vn_mknod(
|
||||
if (unlikely(!sysv_valid_dev(rdev) || MAJOR(rdev) & ~0x1ff))
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(test_default_acl && test_default_acl(dvp))) {
|
||||
if (test_default_acl && test_default_acl(dir)) {
|
||||
if (!_ACL_ALLOC(default_acl)) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!_ACL_GET_DEFAULT(dvp, default_acl)) {
|
||||
if (!_ACL_GET_DEFAULT(dir, default_acl)) {
|
||||
_ACL_FREE(default_acl);
|
||||
default_acl = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_POSIXACL(dir) && !default_acl && xfs_has_fs_struct(current))
|
||||
xfs_dentry_to_name(&name, dentry);
|
||||
|
||||
if (IS_POSIXACL(dir) && !default_acl)
|
||||
mode &= ~current->fs->umask;
|
||||
|
||||
switch (mode & S_IFMT) {
|
||||
case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK:
|
||||
case S_IFCHR:
|
||||
case S_IFBLK:
|
||||
case S_IFIFO:
|
||||
case S_IFSOCK:
|
||||
rdev = sysv_encode_dev(rdev);
|
||||
case S_IFREG:
|
||||
error = xfs_create(XFS_I(dir), dentry, mode, rdev, &vp, NULL);
|
||||
error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL);
|
||||
break;
|
||||
case S_IFDIR:
|
||||
error = xfs_mkdir(XFS_I(dir), dentry, mode, &vp, NULL);
|
||||
error = xfs_mkdir(XFS_I(dir), &name, mode, &ip, NULL);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (unlikely(!error)) {
|
||||
error = xfs_init_security(vp, dir);
|
||||
if (error)
|
||||
xfs_cleanup_inode(dir, vp, dentry, mode);
|
||||
}
|
||||
if (unlikely(error))
|
||||
goto out_free_acl;
|
||||
|
||||
if (unlikely(default_acl)) {
|
||||
if (!error) {
|
||||
error = _ACL_INHERIT(vp, mode, default_acl);
|
||||
if (!error)
|
||||
xfs_iflags_set(XFS_I(vp), XFS_IMODIFIED);
|
||||
else
|
||||
xfs_cleanup_inode(dir, vp, dentry, mode);
|
||||
}
|
||||
inode = ip->i_vnode;
|
||||
|
||||
error = xfs_init_security(inode, dir);
|
||||
if (unlikely(error))
|
||||
goto out_cleanup_inode;
|
||||
|
||||
if (default_acl) {
|
||||
error = _ACL_INHERIT(inode, mode, default_acl);
|
||||
if (unlikely(error))
|
||||
goto out_cleanup_inode;
|
||||
xfs_iflags_set(ip, XFS_IMODIFIED);
|
||||
_ACL_FREE(default_acl);
|
||||
}
|
||||
|
||||
if (likely(!error)) {
|
||||
ASSERT(vp);
|
||||
ip = vn_to_inode(vp);
|
||||
|
||||
if (S_ISDIR(mode))
|
||||
xfs_validate_fields(ip);
|
||||
d_instantiate(dentry, ip);
|
||||
xfs_validate_fields(dir);
|
||||
}
|
||||
if (S_ISDIR(mode))
|
||||
xfs_validate_fields(inode);
|
||||
d_instantiate(dentry, inode);
|
||||
xfs_validate_fields(dir);
|
||||
return -error;
|
||||
|
||||
out_cleanup_inode:
|
||||
xfs_cleanup_inode(dir, inode, dentry, mode);
|
||||
out_free_acl:
|
||||
if (default_acl)
|
||||
_ACL_FREE(default_acl);
|
||||
return -error;
|
||||
}
|
||||
|
||||
@@ -378,13 +381,15 @@ xfs_vn_lookup(
|
||||
struct dentry *dentry,
|
||||
struct nameidata *nd)
|
||||
{
|
||||
bhv_vnode_t *cvp;
|
||||
struct xfs_inode *cip;
|
||||
struct xfs_name name;
|
||||
int error;
|
||||
|
||||
if (dentry->d_name.len >= MAXNAMELEN)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
|
||||
error = xfs_lookup(XFS_I(dir), dentry, &cvp);
|
||||
xfs_dentry_to_name(&name, dentry);
|
||||
error = xfs_lookup(XFS_I(dir), &name, &cip);
|
||||
if (unlikely(error)) {
|
||||
if (unlikely(error != ENOENT))
|
||||
return ERR_PTR(-error);
|
||||
@@ -392,7 +397,7 @@ xfs_vn_lookup(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return d_splice_alias(vn_to_inode(cvp), dentry);
|
||||
return d_splice_alias(cip->i_vnode, dentry);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
@@ -401,23 +406,24 @@ xfs_vn_link(
|
||||
struct inode *dir,
|
||||
struct dentry *dentry)
|
||||
{
|
||||
struct inode *ip; /* inode of guy being linked to */
|
||||
bhv_vnode_t *vp; /* vp of name being linked */
|
||||
struct inode *inode; /* inode of guy being linked to */
|
||||
struct xfs_name name;
|
||||
int error;
|
||||
|
||||
ip = old_dentry->d_inode; /* inode being linked to */
|
||||
vp = vn_from_inode(ip);
|
||||
inode = old_dentry->d_inode;
|
||||
xfs_dentry_to_name(&name, dentry);
|
||||
|
||||
VN_HOLD(vp);
|
||||
error = xfs_link(XFS_I(dir), vp, dentry);
|
||||
igrab(inode);
|
||||
error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
|
||||
if (unlikely(error)) {
|
||||
VN_RELE(vp);
|
||||
} else {
|
||||
xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
|
||||
xfs_validate_fields(ip);
|
||||
d_instantiate(dentry, ip);
|
||||
iput(inode);
|
||||
return -error;
|
||||
}
|
||||
return -error;
|
||||
|
||||
xfs_iflags_set(XFS_I(dir), XFS_IMODIFIED);
|
||||
xfs_validate_fields(inode);
|
||||
d_instantiate(dentry, inode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
@@ -426,11 +432,13 @@ xfs_vn_unlink(
|
||||
struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct xfs_name name;
|
||||
int error;
|
||||
|
||||
inode = dentry->d_inode;
|
||||
xfs_dentry_to_name(&name, dentry);
|
||||
|
||||
error = xfs_remove(XFS_I(dir), dentry);
|
||||
error = xfs_remove(XFS_I(dir), &name, XFS_I(inode));
|
||||
if (likely(!error)) {
|
||||
xfs_validate_fields(dir); /* size needs update */
|
||||
xfs_validate_fields(inode);
|
||||
@@ -444,29 +452,34 @@ xfs_vn_symlink(
|
||||
struct dentry *dentry,
|
||||
const char *symname)
|
||||
{
|
||||
struct inode *ip;
|
||||
bhv_vnode_t *cvp; /* used to lookup symlink to put in dentry */
|
||||
struct inode *inode;
|
||||
struct xfs_inode *cip = NULL;
|
||||
struct xfs_name name;
|
||||
int error;
|
||||
mode_t mode;
|
||||
|
||||
cvp = NULL;
|
||||
|
||||
mode = S_IFLNK |
|
||||
(irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO);
|
||||
xfs_dentry_to_name(&name, dentry);
|
||||
|
||||
error = xfs_symlink(XFS_I(dir), dentry, (char *)symname, mode,
|
||||
&cvp, NULL);
|
||||
if (likely(!error && cvp)) {
|
||||
error = xfs_init_security(cvp, dir);
|
||||
if (likely(!error)) {
|
||||
ip = vn_to_inode(cvp);
|
||||
d_instantiate(dentry, ip);
|
||||
xfs_validate_fields(dir);
|
||||
xfs_validate_fields(ip);
|
||||
} else {
|
||||
xfs_cleanup_inode(dir, cvp, dentry, 0);
|
||||
}
|
||||
}
|
||||
error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip, NULL);
|
||||
if (unlikely(error))
|
||||
goto out;
|
||||
|
||||
inode = cip->i_vnode;
|
||||
|
||||
error = xfs_init_security(inode, dir);
|
||||
if (unlikely(error))
|
||||
goto out_cleanup_inode;
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
xfs_validate_fields(dir);
|
||||
xfs_validate_fields(inode);
|
||||
return 0;
|
||||
|
||||
out_cleanup_inode:
|
||||
xfs_cleanup_inode(dir, inode, dentry, 0);
|
||||
out:
|
||||
return -error;
|
||||
}
|
||||
|
||||
@@ -476,9 +489,12 @@ xfs_vn_rmdir(
|
||||
struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct xfs_name name;
|
||||
int error;
|
||||
|
||||
error = xfs_rmdir(XFS_I(dir), dentry);
|
||||
xfs_dentry_to_name(&name, dentry);
|
||||
|
||||
error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode));
|
||||
if (likely(!error)) {
|
||||
xfs_validate_fields(inode);
|
||||
xfs_validate_fields(dir);
|
||||
@@ -494,12 +510,15 @@ xfs_vn_rename(
|
||||
struct dentry *ndentry)
|
||||
{
|
||||
struct inode *new_inode = ndentry->d_inode;
|
||||
bhv_vnode_t *tvp; /* target directory */
|
||||
struct xfs_name oname;
|
||||
struct xfs_name nname;
|
||||
int error;
|
||||
|
||||
tvp = vn_from_inode(ndir);
|
||||
xfs_dentry_to_name(&oname, odentry);
|
||||
xfs_dentry_to_name(&nname, ndentry);
|
||||
|
||||
error = xfs_rename(XFS_I(odir), odentry, tvp, ndentry);
|
||||
error = xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
|
||||
XFS_I(ndir), &nname);
|
||||
if (likely(!error)) {
|
||||
if (new_inode)
|
||||
xfs_validate_fields(new_inode);
|
||||
@@ -700,11 +719,19 @@ xfs_vn_setattr(
|
||||
return -error;
|
||||
}
|
||||
|
||||
/*
|
||||
* block_truncate_page can return an error, but we can't propagate it
|
||||
* at all here. Leave a complaint + stack trace in the syslog because
|
||||
* this could be bad. If it is bad, we need to propagate the error further.
|
||||
*/
|
||||
STATIC void
|
||||
xfs_vn_truncate(
|
||||
struct inode *inode)
|
||||
{
|
||||
block_truncate_page(inode->i_mapping, inode->i_size, xfs_get_blocks);
|
||||
int error;
|
||||
error = block_truncate_page(inode->i_mapping, inode->i_size,
|
||||
xfs_get_blocks);
|
||||
WARN_ON(error);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
|
||||
@@ -99,7 +99,6 @@
|
||||
/*
|
||||
* Feature macros (disable/enable)
|
||||
*/
|
||||
#undef HAVE_REFCACHE /* reference cache not needed for NFS in 2.6 */
|
||||
#define HAVE_SPLICE /* a splice(2) exists in 2.6, but not in 2.4 */
|
||||
#ifdef CONFIG_SMP
|
||||
#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */
|
||||
|
||||
@@ -176,7 +176,6 @@ xfs_read(
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
bhv_vnode_t *vp = XFS_ITOV(ip);
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
size_t size = 0;
|
||||
ssize_t ret = 0;
|
||||
@@ -228,11 +227,11 @@ xfs_read(
|
||||
xfs_ilock(ip, XFS_IOLOCK_SHARED);
|
||||
|
||||
if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) {
|
||||
bhv_vrwlock_t locktype = VRWLOCK_READ;
|
||||
int dmflags = FILP_DELAY_FLAG(file) | DM_SEM_FLAG_RD(ioflags);
|
||||
int iolock = XFS_IOLOCK_SHARED;
|
||||
|
||||
ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, vp, *offset, size,
|
||||
dmflags, &locktype);
|
||||
ret = -XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *offset, size,
|
||||
dmflags, &iolock);
|
||||
if (ret) {
|
||||
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
||||
if (unlikely(ioflags & IO_ISDIRECT))
|
||||
@@ -242,7 +241,7 @@ xfs_read(
|
||||
}
|
||||
|
||||
if (unlikely(ioflags & IO_ISDIRECT)) {
|
||||
if (VN_CACHED(vp))
|
||||
if (inode->i_mapping->nrpages)
|
||||
ret = xfs_flushinval_pages(ip, (*offset & PAGE_CACHE_MASK),
|
||||
-1, FI_REMAPF_LOCKED);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
@@ -276,7 +275,6 @@ xfs_splice_read(
|
||||
int flags,
|
||||
int ioflags)
|
||||
{
|
||||
bhv_vnode_t *vp = XFS_ITOV(ip);
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
ssize_t ret;
|
||||
|
||||
@@ -287,11 +285,11 @@ xfs_splice_read(
|
||||
xfs_ilock(ip, XFS_IOLOCK_SHARED);
|
||||
|
||||
if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && !(ioflags & IO_INVIS)) {
|
||||
bhv_vrwlock_t locktype = VRWLOCK_READ;
|
||||
int iolock = XFS_IOLOCK_SHARED;
|
||||
int error;
|
||||
|
||||
error = XFS_SEND_DATA(mp, DM_EVENT_READ, vp, *ppos, count,
|
||||
FILP_DELAY_FLAG(infilp), &locktype);
|
||||
error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, *ppos, count,
|
||||
FILP_DELAY_FLAG(infilp), &iolock);
|
||||
if (error) {
|
||||
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
||||
return -error;
|
||||
@@ -317,7 +315,6 @@ xfs_splice_write(
|
||||
int flags,
|
||||
int ioflags)
|
||||
{
|
||||
bhv_vnode_t *vp = XFS_ITOV(ip);
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
ssize_t ret;
|
||||
struct inode *inode = outfilp->f_mapping->host;
|
||||
@@ -330,11 +327,11 @@ xfs_splice_write(
|
||||
xfs_ilock(ip, XFS_IOLOCK_EXCL);
|
||||
|
||||
if (DM_EVENT_ENABLED(ip, DM_EVENT_WRITE) && !(ioflags & IO_INVIS)) {
|
||||
bhv_vrwlock_t locktype = VRWLOCK_WRITE;
|
||||
int iolock = XFS_IOLOCK_EXCL;
|
||||
int error;
|
||||
|
||||
error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, vp, *ppos, count,
|
||||
FILP_DELAY_FLAG(outfilp), &locktype);
|
||||
error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, ip, *ppos, count,
|
||||
FILP_DELAY_FLAG(outfilp), &iolock);
|
||||
if (error) {
|
||||
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
||||
return -error;
|
||||
@@ -573,14 +570,12 @@ xfs_write(
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct address_space *mapping = file->f_mapping;
|
||||
struct inode *inode = mapping->host;
|
||||
bhv_vnode_t *vp = XFS_ITOV(xip);
|
||||
unsigned long segs = nsegs;
|
||||
xfs_mount_t *mp;
|
||||
ssize_t ret = 0, error = 0;
|
||||
xfs_fsize_t isize, new_size;
|
||||
int iolock;
|
||||
int eventsent = 0;
|
||||
bhv_vrwlock_t locktype;
|
||||
size_t ocount = 0, count;
|
||||
loff_t pos;
|
||||
int need_i_mutex;
|
||||
@@ -607,11 +602,9 @@ xfs_write(
|
||||
relock:
|
||||
if (ioflags & IO_ISDIRECT) {
|
||||
iolock = XFS_IOLOCK_SHARED;
|
||||
locktype = VRWLOCK_WRITE_DIRECT;
|
||||
need_i_mutex = 0;
|
||||
} else {
|
||||
iolock = XFS_IOLOCK_EXCL;
|
||||
locktype = VRWLOCK_WRITE;
|
||||
need_i_mutex = 1;
|
||||
mutex_lock(&inode->i_mutex);
|
||||
}
|
||||
@@ -634,9 +627,8 @@ start:
|
||||
dmflags |= DM_FLAGS_IMUX;
|
||||
|
||||
xfs_iunlock(xip, XFS_ILOCK_EXCL);
|
||||
error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, vp,
|
||||
pos, count,
|
||||
dmflags, &locktype);
|
||||
error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, xip,
|
||||
pos, count, dmflags, &iolock);
|
||||
if (error) {
|
||||
goto out_unlock_internal;
|
||||
}
|
||||
@@ -664,10 +656,9 @@ start:
|
||||
return XFS_ERROR(-EINVAL);
|
||||
}
|
||||
|
||||
if (!need_i_mutex && (VN_CACHED(vp) || pos > xip->i_size)) {
|
||||
if (!need_i_mutex && (mapping->nrpages || pos > xip->i_size)) {
|
||||
xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock);
|
||||
iolock = XFS_IOLOCK_EXCL;
|
||||
locktype = VRWLOCK_WRITE;
|
||||
need_i_mutex = 1;
|
||||
mutex_lock(&inode->i_mutex);
|
||||
xfs_ilock(xip, XFS_ILOCK_EXCL|iolock);
|
||||
@@ -727,7 +718,7 @@ retry:
|
||||
current->backing_dev_info = mapping->backing_dev_info;
|
||||
|
||||
if ((ioflags & IO_ISDIRECT)) {
|
||||
if (VN_CACHED(vp)) {
|
||||
if (mapping->nrpages) {
|
||||
WARN_ON(need_i_mutex == 0);
|
||||
xfs_inval_cached_trace(xip, pos, -1,
|
||||
(pos & PAGE_CACHE_MASK), -1);
|
||||
@@ -744,7 +735,6 @@ retry:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
iolock = XFS_IOLOCK_SHARED;
|
||||
locktype = VRWLOCK_WRITE_DIRECT;
|
||||
need_i_mutex = 0;
|
||||
}
|
||||
|
||||
@@ -781,15 +771,15 @@ retry:
|
||||
|
||||
if (ret == -ENOSPC &&
|
||||
DM_EVENT_ENABLED(xip, DM_EVENT_NOSPACE) && !(ioflags & IO_INVIS)) {
|
||||
xfs_rwunlock(xip, locktype);
|
||||
xfs_iunlock(xip, iolock);
|
||||
if (need_i_mutex)
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, vp,
|
||||
DM_RIGHT_NULL, vp, DM_RIGHT_NULL, NULL, NULL,
|
||||
error = XFS_SEND_NAMESP(xip->i_mount, DM_EVENT_NOSPACE, xip,
|
||||
DM_RIGHT_NULL, xip, DM_RIGHT_NULL, NULL, NULL,
|
||||
0, 0, 0); /* Delay flag intentionally unused */
|
||||
if (need_i_mutex)
|
||||
mutex_lock(&inode->i_mutex);
|
||||
xfs_rwlock(xip, locktype);
|
||||
xfs_ilock(xip, iolock);
|
||||
if (error)
|
||||
goto out_unlock_internal;
|
||||
pos = xip->i_size;
|
||||
@@ -817,7 +807,8 @@ retry:
|
||||
/* Handle various SYNC-type writes */
|
||||
if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) {
|
||||
int error2;
|
||||
xfs_rwunlock(xip, locktype);
|
||||
|
||||
xfs_iunlock(xip, iolock);
|
||||
if (need_i_mutex)
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
error2 = sync_page_range(inode, mapping, pos, ret);
|
||||
@@ -825,7 +816,7 @@ retry:
|
||||
error = error2;
|
||||
if (need_i_mutex)
|
||||
mutex_lock(&inode->i_mutex);
|
||||
xfs_rwlock(xip, locktype);
|
||||
xfs_ilock(xip, iolock);
|
||||
error2 = xfs_write_sync_logforce(mp, xip);
|
||||
if (!error)
|
||||
error = error2;
|
||||
@@ -846,7 +837,7 @@ retry:
|
||||
xip->i_d.di_size = xip->i_size;
|
||||
xfs_iunlock(xip, XFS_ILOCK_EXCL);
|
||||
}
|
||||
xfs_rwunlock(xip, locktype);
|
||||
xfs_iunlock(xip, iolock);
|
||||
out_unlock_mutex:
|
||||
if (need_i_mutex)
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
@@ -884,28 +875,23 @@ xfs_bdstrat_cb(struct xfs_buf *bp)
|
||||
}
|
||||
|
||||
/*
|
||||
* Wrapper around bdstrat so that we can stop data
|
||||
* from going to disk in case we are shutting down the filesystem.
|
||||
* Typically user data goes thru this path; one of the exceptions
|
||||
* is the superblock.
|
||||
* Wrapper around bdstrat so that we can stop data from going to disk in case
|
||||
* we are shutting down the filesystem. Typically user data goes thru this
|
||||
* path; one of the exceptions is the superblock.
|
||||
*/
|
||||
int
|
||||
void
|
||||
xfsbdstrat(
|
||||
struct xfs_mount *mp,
|
||||
struct xfs_buf *bp)
|
||||
{
|
||||
ASSERT(mp);
|
||||
if (!XFS_FORCED_SHUTDOWN(mp)) {
|
||||
/* Grio redirection would go here
|
||||
* if (XFS_BUF_IS_GRIO(bp)) {
|
||||
*/
|
||||
|
||||
xfs_buf_iorequest(bp);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
xfs_buftrace("XFSBDSTRAT IOERROR", bp);
|
||||
return (xfs_bioerror_relse(bp));
|
||||
xfs_bioerror_relse(bp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -68,7 +68,8 @@ extern void xfs_inval_cached_trace(struct xfs_inode *,
|
||||
#define xfs_inval_cached_trace(ip, offset, len, first, last)
|
||||
#endif
|
||||
|
||||
extern int xfsbdstrat(struct xfs_mount *, struct xfs_buf *);
|
||||
/* errors from xfsbdstrat() must be extracted from the buffer */
|
||||
extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *);
|
||||
extern int xfs_bdstrat_cb(struct xfs_buf *);
|
||||
extern int xfs_dev_is_read_only(struct xfs_mount *, char *);
|
||||
|
||||
|
||||
@@ -144,8 +144,8 @@ extern void xfs_cleanup_procfs(void);
|
||||
# define XFS_STATS_DEC(count)
|
||||
# define XFS_STATS_ADD(count, inc)
|
||||
|
||||
static __inline void xfs_init_procfs(void) { };
|
||||
static __inline void xfs_cleanup_procfs(void) { };
|
||||
static inline void xfs_init_procfs(void) { };
|
||||
static inline void xfs_cleanup_procfs(void) { };
|
||||
|
||||
#endif /* !CONFIG_PROC_FS */
|
||||
|
||||
|
||||
@@ -896,7 +896,8 @@ xfs_fs_write_inode(
|
||||
struct inode *inode,
|
||||
int sync)
|
||||
{
|
||||
int error = 0, flags = FLUSH_INODE;
|
||||
int error = 0;
|
||||
int flags = 0;
|
||||
|
||||
xfs_itrace_entry(XFS_I(inode));
|
||||
if (sync) {
|
||||
@@ -934,7 +935,7 @@ xfs_fs_clear_inode(
|
||||
xfs_inactive(ip);
|
||||
xfs_iflags_clear(ip, XFS_IMODIFIED);
|
||||
if (xfs_reclaim(ip))
|
||||
panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, inode);
|
||||
panic("%s: cannot reclaim 0x%p\n", __func__, inode);
|
||||
}
|
||||
|
||||
ASSERT(XFS_I(inode) == NULL);
|
||||
@@ -1027,8 +1028,7 @@ xfs_sync_worker(
|
||||
int error;
|
||||
|
||||
if (!(mp->m_flags & XFS_MOUNT_RDONLY))
|
||||
error = xfs_sync(mp, SYNC_FSDATA | SYNC_BDFLUSH | SYNC_ATTR |
|
||||
SYNC_REFCACHE | SYNC_SUPER);
|
||||
error = xfs_sync(mp, SYNC_FSDATA | SYNC_BDFLUSH | SYNC_ATTR);
|
||||
mp->m_sync_seq++;
|
||||
wake_up(&mp->m_wait_single_sync_task);
|
||||
}
|
||||
@@ -1306,7 +1306,7 @@ xfs_fs_fill_super(
|
||||
void *data,
|
||||
int silent)
|
||||
{
|
||||
struct inode *rootvp;
|
||||
struct inode *root;
|
||||
struct xfs_mount *mp = NULL;
|
||||
struct xfs_mount_args *args = xfs_args_allocate(sb, silent);
|
||||
int error;
|
||||
@@ -1344,19 +1344,18 @@ xfs_fs_fill_super(
|
||||
sb->s_time_gran = 1;
|
||||
set_posix_acl_flag(sb);
|
||||
|
||||
rootvp = igrab(mp->m_rootip->i_vnode);
|
||||
if (!rootvp) {
|
||||
root = igrab(mp->m_rootip->i_vnode);
|
||||
if (!root) {
|
||||
error = ENOENT;
|
||||
goto fail_unmount;
|
||||
}
|
||||
|
||||
sb->s_root = d_alloc_root(vn_to_inode(rootvp));
|
||||
if (!sb->s_root) {
|
||||
error = ENOMEM;
|
||||
if (is_bad_inode(root)) {
|
||||
error = EINVAL;
|
||||
goto fail_vnrele;
|
||||
}
|
||||
if (is_bad_inode(sb->s_root->d_inode)) {
|
||||
error = EINVAL;
|
||||
sb->s_root = d_alloc_root(root);
|
||||
if (!sb->s_root) {
|
||||
error = ENOMEM;
|
||||
goto fail_vnrele;
|
||||
}
|
||||
|
||||
@@ -1378,7 +1377,7 @@ fail_vnrele:
|
||||
dput(sb->s_root);
|
||||
sb->s_root = NULL;
|
||||
} else {
|
||||
VN_RELE(rootvp);
|
||||
iput(root);
|
||||
}
|
||||
|
||||
fail_unmount:
|
||||
|
||||
@@ -50,13 +50,7 @@ extern void xfs_qm_exit(void);
|
||||
# define set_posix_acl_flag(sb) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_XFS_SECURITY
|
||||
# define XFS_SECURITY_STRING "security attributes, "
|
||||
# define ENOSECURITY 0
|
||||
#else
|
||||
# define XFS_SECURITY_STRING
|
||||
# define ENOSECURITY EOPNOTSUPP
|
||||
#endif
|
||||
#define XFS_SECURITY_STRING "security attributes, "
|
||||
|
||||
#ifdef CONFIG_XFS_RT
|
||||
# define XFS_REALTIME_STRING "realtime, "
|
||||
|
||||
@@ -49,7 +49,6 @@ typedef struct bhv_vfs_sync_work {
|
||||
#define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */
|
||||
#define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */
|
||||
#define SYNC_IOWAIT 0x0100 /* wait for all I/O to complete */
|
||||
#define SYNC_SUPER 0x0200 /* flush superblock to disk */
|
||||
|
||||
/*
|
||||
* When remounting a filesystem read-only or freezing the filesystem,
|
||||
|
||||
@@ -23,8 +23,6 @@ struct bhv_vattr;
|
||||
struct xfs_iomap;
|
||||
struct attrlist_cursor_kern;
|
||||
|
||||
typedef struct dentry bhv_vname_t;
|
||||
typedef __u64 bhv_vnumber_t;
|
||||
typedef struct inode bhv_vnode_t;
|
||||
|
||||
#define VN_ISLNK(vp) S_ISLNK((vp)->i_mode)
|
||||
@@ -45,18 +43,6 @@ static inline struct inode *vn_to_inode(bhv_vnode_t *vnode)
|
||||
return vnode;
|
||||
}
|
||||
|
||||
/*
|
||||
* Values for the vop_rwlock/rwunlock flags parameter.
|
||||
*/
|
||||
typedef enum bhv_vrwlock {
|
||||
VRWLOCK_NONE,
|
||||
VRWLOCK_READ,
|
||||
VRWLOCK_WRITE,
|
||||
VRWLOCK_WRITE_DIRECT,
|
||||
VRWLOCK_TRY_READ,
|
||||
VRWLOCK_TRY_WRITE
|
||||
} bhv_vrwlock_t;
|
||||
|
||||
/*
|
||||
* Return values for xfs_inactive. A return value of
|
||||
* VN_INACTIVE_NOCACHE implies that the file system behavior
|
||||
@@ -73,12 +59,9 @@ typedef enum bhv_vrwlock {
|
||||
#define IO_INVIS 0x00020 /* don't update inode timestamps */
|
||||
|
||||
/*
|
||||
* Flags for vop_iflush call
|
||||
* Flags for xfs_inode_flush
|
||||
*/
|
||||
#define FLUSH_SYNC 1 /* wait for flush to complete */
|
||||
#define FLUSH_INODE 2 /* flush the inode itself */
|
||||
#define FLUSH_LOG 4 /* force the last log entry for
|
||||
* this inode out to disk */
|
||||
|
||||
/*
|
||||
* Flush/Invalidate options for vop_toss/flush/flushinval_pages.
|
||||
@@ -225,13 +208,6 @@ static inline bhv_vnode_t *vn_grab(bhv_vnode_t *vp)
|
||||
return inode ? vn_from_inode(inode) : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Vname handling macros.
|
||||
*/
|
||||
#define VNAME(dentry) ((char *) (dentry)->d_name.name)
|
||||
#define VNAMELEN(dentry) ((dentry)->d_name.len)
|
||||
#define VNAME_TO_VNODE(dentry) (vn_from_inode((dentry)->d_inode))
|
||||
|
||||
/*
|
||||
* Dealing with bad inodes
|
||||
*/
|
||||
@@ -303,9 +279,9 @@ extern void xfs_itrace_hold(struct xfs_inode *, char *, int, inst_t *);
|
||||
extern void _xfs_itrace_ref(struct xfs_inode *, char *, int, inst_t *);
|
||||
extern void xfs_itrace_rele(struct xfs_inode *, char *, int, inst_t *);
|
||||
#define xfs_itrace_entry(ip) \
|
||||
_xfs_itrace_entry(ip, __FUNCTION__, (inst_t *)__return_address)
|
||||
_xfs_itrace_entry(ip, __func__, (inst_t *)__return_address)
|
||||
#define xfs_itrace_exit(ip) \
|
||||
_xfs_itrace_exit(ip, __FUNCTION__, (inst_t *)__return_address)
|
||||
_xfs_itrace_exit(ip, __func__, (inst_t *)__return_address)
|
||||
#define xfs_itrace_exit_tag(ip, tag) \
|
||||
_xfs_itrace_exit(ip, tag, (inst_t *)__return_address)
|
||||
#define xfs_itrace_ref(ip) \
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user