Merge git://oss.sgi.com:8090/xfs/xfs-2.6

* git://oss.sgi.com:8090/xfs/xfs-2.6: (49 commits)
  [XFS] Remove v1 dir trace macro - missed in a past commit.
  [XFS] 955947: Infinite loop in xfs_bulkstat() on formatter() error
  [XFS] pv 956241, author: nathans, rv: vapo - make ino validation checks
  [XFS] pv 956240, author: nathans, rv: vapo - Minor fixes in
  [XFS] Really fix use after free in xfs_iunpin.
  [XFS] Collapse sv_init and init_sv into just the one interface.
  [XFS] standardize on one sema init macro
  [XFS] Reduce endian flipping in alloc_btree, same as was done for
  [XFS] Minor cleanup from dio locking fix, remove an extra conditional.
  [XFS] Fix kmem_zalloc_greedy warnings on 64 bit platforms.
  [XFS] pv 955157, rv bnaujok - break the loop on EFAULT formatter() error
  [XFS] pv 955157, rv bnaujok - break the loop on formatter() error
  [XFS] Fixes the leak in reservation space because we weren't ungranting
  [XFS] Add lock annotations to xfs_trans_update_ail and
  [XFS] Fix a porting botch on the realtime subvol growfs code path.
  [XFS] Minor code rearranging and cleanup to prevent some coverity false
  [XFS] Remove a no-longer-correct debug assert from dio completion
  [XFS] Add a greedy allocation interface, allocating within a min/max size
  [XFS] Improve error handling for the zero-fsblock extent detection code.
  [XFS] Be more defensive with page flags (error/private) for metadata
  ...
This commit is contained in:
Linus Torvalds
2006-09-29 09:36:55 -07:00
64 changed files with 1058 additions and 1035 deletions
-1
View File
@@ -30,7 +30,6 @@ ifeq ($(CONFIG_XFS_TRACE),y)
EXTRA_CFLAGS += -DXFS_BLI_TRACE EXTRA_CFLAGS += -DXFS_BLI_TRACE
EXTRA_CFLAGS += -DXFS_BMAP_TRACE EXTRA_CFLAGS += -DXFS_BMAP_TRACE
EXTRA_CFLAGS += -DXFS_BMBT_TRACE EXTRA_CFLAGS += -DXFS_BMBT_TRACE
EXTRA_CFLAGS += -DXFS_DIR_TRACE
EXTRA_CFLAGS += -DXFS_DIR2_TRACE EXTRA_CFLAGS += -DXFS_DIR2_TRACE
EXTRA_CFLAGS += -DXFS_DQUOT_TRACE EXTRA_CFLAGS += -DXFS_DQUOT_TRACE
EXTRA_CFLAGS += -DXFS_ILOCK_TRACE EXTRA_CFLAGS += -DXFS_ILOCK_TRACE
+29
View File
@@ -34,6 +34,14 @@ kmem_alloc(size_t size, unsigned int __nocast flags)
gfp_t lflags = kmem_flags_convert(flags); gfp_t lflags = kmem_flags_convert(flags);
void *ptr; void *ptr;
#ifdef DEBUG
if (unlikely(!(flags & KM_LARGE) && (size > PAGE_SIZE))) {
printk(KERN_WARNING "Large %s attempt, size=%ld\n",
__FUNCTION__, (long)size);
dump_stack();
}
#endif
do { do {
if (size < MAX_SLAB_SIZE || retries > MAX_VMALLOCS) if (size < MAX_SLAB_SIZE || retries > MAX_VMALLOCS)
ptr = kmalloc(size, lflags); ptr = kmalloc(size, lflags);
@@ -60,6 +68,27 @@ kmem_zalloc(size_t size, unsigned int __nocast flags)
return ptr; return ptr;
} }
void *
kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize,
unsigned int __nocast flags)
{
void *ptr;
size_t kmsize = maxsize;
unsigned int kmflags = (flags & ~KM_SLEEP) | KM_NOSLEEP;
while (!(ptr = kmem_zalloc(kmsize, kmflags))) {
if ((kmsize <= minsize) && (flags & KM_NOSLEEP))
break;
if ((kmsize >>= 1) <= minsize) {
kmsize = minsize;
kmflags = flags;
}
}
if (ptr)
*size = kmsize;
return ptr;
}
void void
kmem_free(void *ptr, size_t size) kmem_free(void *ptr, size_t size)
{ {
+4 -2
View File
@@ -30,6 +30,7 @@
#define KM_NOSLEEP 0x0002u #define KM_NOSLEEP 0x0002u
#define KM_NOFS 0x0004u #define KM_NOFS 0x0004u
#define KM_MAYFAIL 0x0008u #define KM_MAYFAIL 0x0008u
#define KM_LARGE 0x0010u
/* /*
* We use a special process flag to avoid recursive callbacks into * We use a special process flag to avoid recursive callbacks into
@@ -41,7 +42,7 @@ kmem_flags_convert(unsigned int __nocast flags)
{ {
gfp_t lflags; gfp_t lflags;
BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL)); BUG_ON(flags & ~(KM_SLEEP|KM_NOSLEEP|KM_NOFS|KM_MAYFAIL|KM_LARGE));
if (flags & KM_NOSLEEP) { if (flags & KM_NOSLEEP) {
lflags = GFP_ATOMIC | __GFP_NOWARN; lflags = GFP_ATOMIC | __GFP_NOWARN;
@@ -54,8 +55,9 @@ kmem_flags_convert(unsigned int __nocast flags)
} }
extern void *kmem_alloc(size_t, unsigned int __nocast); extern void *kmem_alloc(size_t, unsigned int __nocast);
extern void *kmem_realloc(void *, size_t, size_t, unsigned int __nocast);
extern void *kmem_zalloc(size_t, unsigned int __nocast); extern void *kmem_zalloc(size_t, unsigned int __nocast);
extern void *kmem_zalloc_greedy(size_t *, size_t, size_t, unsigned int __nocast);
extern void *kmem_realloc(void *, size_t, size_t, unsigned int __nocast);
extern void kmem_free(void *, size_t); extern void kmem_free(void *, size_t);
/* /*
-2
View File
@@ -29,8 +29,6 @@
typedef struct semaphore sema_t; typedef struct semaphore sema_t;
#define init_sema(sp, val, c, d) sema_init(sp, val)
#define initsema(sp, val) sema_init(sp, val)
#define initnsema(sp, val, name) sema_init(sp, val) #define initnsema(sp, val, name) sema_init(sp, val)
#define psema(sp, b) down(sp) #define psema(sp, b) down(sp)
#define vsema(sp) up(sp) #define vsema(sp) up(sp)
-2
View File
@@ -53,8 +53,6 @@ static inline void _sv_wait(sv_t *sv, spinlock_t *lock, int state,
remove_wait_queue(&sv->waiters, &wait); remove_wait_queue(&sv->waiters, &wait);
} }
#define init_sv(sv,type,name,flag) \
init_waitqueue_head(&(sv)->waiters)
#define sv_init(sv,flag,name) \ #define sv_init(sv,flag,name) \
init_waitqueue_head(&(sv)->waiters) init_waitqueue_head(&(sv)->waiters)
#define sv_destroy(sv) \ #define sv_destroy(sv) \
+4 -5
View File
@@ -71,7 +71,7 @@ xfs_page_trace(
int tag, int tag,
struct inode *inode, struct inode *inode,
struct page *page, struct page *page,
int mask) unsigned long pgoff)
{ {
xfs_inode_t *ip; xfs_inode_t *ip;
bhv_vnode_t *vp = vn_from_inode(inode); bhv_vnode_t *vp = vn_from_inode(inode);
@@ -91,7 +91,7 @@ xfs_page_trace(
(void *)ip, (void *)ip,
(void *)inode, (void *)inode,
(void *)page, (void *)page,
(void *)((unsigned long)mask), (void *)pgoff,
(void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)), (void *)((unsigned long)((ip->i_d.di_size >> 32) & 0xffffffff)),
(void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)), (void *)((unsigned long)(ip->i_d.di_size & 0xffffffff)),
(void *)((unsigned long)((isize >> 32) & 0xffffffff)), (void *)((unsigned long)((isize >> 32) & 0xffffffff)),
@@ -105,7 +105,7 @@ xfs_page_trace(
(void *)NULL); (void *)NULL);
} }
#else #else
#define xfs_page_trace(tag, inode, page, mask) #define xfs_page_trace(tag, inode, page, pgoff)
#endif #endif
/* /*
@@ -1197,7 +1197,7 @@ xfs_vm_releasepage(
.nr_to_write = 1, .nr_to_write = 1,
}; };
xfs_page_trace(XFS_RELEASEPAGE_ENTER, inode, page, gfp_mask); xfs_page_trace(XFS_RELEASEPAGE_ENTER, inode, page, 0);
if (!page_has_buffers(page)) if (!page_has_buffers(page))
return 0; return 0;
@@ -1356,7 +1356,6 @@ xfs_end_io_direct(
ioend->io_size = size; ioend->io_size = size;
xfs_finish_ioend(ioend); xfs_finish_ioend(ioend);
} else { } else {
ASSERT(size >= 0);
xfs_destroy_ioend(ioend); xfs_destroy_ioend(ioend);
} }
+30 -21
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000-2005 Silicon Graphics, Inc. * Copyright (c) 2000-2006 Silicon Graphics, Inc.
* All Rights Reserved. * All Rights Reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@@ -318,8 +318,12 @@ xfs_buf_free(
if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1)) if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1))
free_address(bp->b_addr - bp->b_offset); free_address(bp->b_addr - bp->b_offset);
for (i = 0; i < bp->b_page_count; i++) for (i = 0; i < bp->b_page_count; i++) {
page_cache_release(bp->b_pages[i]); struct page *page = bp->b_pages[i];
ASSERT(!PagePrivate(page));
page_cache_release(page);
}
_xfs_buf_free_pages(bp); _xfs_buf_free_pages(bp);
} else if (bp->b_flags & _XBF_KMEM_ALLOC) { } else if (bp->b_flags & _XBF_KMEM_ALLOC) {
/* /*
@@ -400,6 +404,7 @@ _xfs_buf_lookup_pages(
nbytes = min_t(size_t, size, PAGE_CACHE_SIZE - offset); nbytes = min_t(size_t, size, PAGE_CACHE_SIZE - offset);
size -= nbytes; size -= nbytes;
ASSERT(!PagePrivate(page));
if (!PageUptodate(page)) { if (!PageUptodate(page)) {
page_count--; page_count--;
if (blocksize >= PAGE_CACHE_SIZE) { if (blocksize >= PAGE_CACHE_SIZE) {
@@ -768,7 +773,7 @@ xfs_buf_get_noaddr(
_xfs_buf_initialize(bp, target, 0, len, 0); _xfs_buf_initialize(bp, target, 0, len, 0);
try_again: try_again:
data = kmem_alloc(malloc_len, KM_SLEEP | KM_MAYFAIL); data = kmem_alloc(malloc_len, KM_SLEEP | KM_MAYFAIL | KM_LARGE);
if (unlikely(data == NULL)) if (unlikely(data == NULL))
goto fail_free_buf; goto fail_free_buf;
@@ -1117,10 +1122,10 @@ xfs_buf_bio_end_io(
do { do {
struct page *page = bvec->bv_page; struct page *page = bvec->bv_page;
ASSERT(!PagePrivate(page));
if (unlikely(bp->b_error)) { if (unlikely(bp->b_error)) {
if (bp->b_flags & XBF_READ) if (bp->b_flags & XBF_READ)
ClearPageUptodate(page); ClearPageUptodate(page);
SetPageError(page);
} else if (blocksize >= PAGE_CACHE_SIZE) { } else if (blocksize >= PAGE_CACHE_SIZE) {
SetPageUptodate(page); SetPageUptodate(page);
} else if (!PagePrivate(page) && } else if (!PagePrivate(page) &&
@@ -1156,16 +1161,16 @@ _xfs_buf_ioapply(
total_nr_pages = bp->b_page_count; total_nr_pages = bp->b_page_count;
map_i = 0; map_i = 0;
if (bp->b_flags & _XBF_RUN_QUEUES) {
bp->b_flags &= ~_XBF_RUN_QUEUES;
rw = (bp->b_flags & XBF_READ) ? READ_SYNC : WRITE_SYNC;
} else {
rw = (bp->b_flags & XBF_READ) ? READ : WRITE;
}
if (bp->b_flags & XBF_ORDERED) { if (bp->b_flags & XBF_ORDERED) {
ASSERT(!(bp->b_flags & XBF_READ)); ASSERT(!(bp->b_flags & XBF_READ));
rw = WRITE_BARRIER; rw = WRITE_BARRIER;
} else if (bp->b_flags & _XBF_RUN_QUEUES) {
ASSERT(!(bp->b_flags & XBF_READ_AHEAD));
bp->b_flags &= ~_XBF_RUN_QUEUES;
rw = (bp->b_flags & XBF_WRITE) ? WRITE_SYNC : READ_SYNC;
} else {
rw = (bp->b_flags & XBF_WRITE) ? WRITE :
(bp->b_flags & XBF_READ_AHEAD) ? READA : READ;
} }
/* Special code path for reading a sub page size buffer in -- /* Special code path for reading a sub page size buffer in --
@@ -1681,6 +1686,7 @@ xfsbufd(
xfs_buf_t *bp, *n; xfs_buf_t *bp, *n;
struct list_head *dwq = &target->bt_delwrite_queue; struct list_head *dwq = &target->bt_delwrite_queue;
spinlock_t *dwlk = &target->bt_delwrite_lock; spinlock_t *dwlk = &target->bt_delwrite_lock;
int count;
current->flags |= PF_MEMALLOC; current->flags |= PF_MEMALLOC;
@@ -1696,6 +1702,7 @@ xfsbufd(
schedule_timeout_interruptible( schedule_timeout_interruptible(
xfs_buf_timer_centisecs * msecs_to_jiffies(10)); xfs_buf_timer_centisecs * msecs_to_jiffies(10));
count = 0;
age = xfs_buf_age_centisecs * msecs_to_jiffies(10); age = xfs_buf_age_centisecs * msecs_to_jiffies(10);
spin_lock(dwlk); spin_lock(dwlk);
list_for_each_entry_safe(bp, n, dwq, b_list) { list_for_each_entry_safe(bp, n, dwq, b_list) {
@@ -1711,9 +1718,11 @@ xfsbufd(
break; break;
} }
bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|
_XBF_RUN_QUEUES);
bp->b_flags |= XBF_WRITE; bp->b_flags |= XBF_WRITE;
list_move(&bp->b_list, &tmp); list_move_tail(&bp->b_list, &tmp);
count++;
} }
} }
spin_unlock(dwlk); spin_unlock(dwlk);
@@ -1724,12 +1733,12 @@ xfsbufd(
list_del_init(&bp->b_list); list_del_init(&bp->b_list);
xfs_buf_iostrategy(bp); xfs_buf_iostrategy(bp);
blk_run_address_space(target->bt_mapping);
} }
if (as_list_len > 0) if (as_list_len > 0)
purge_addresses(); purge_addresses();
if (count)
blk_run_address_space(target->bt_mapping);
clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); clear_bit(XBT_FORCE_FLUSH, &target->bt_flags);
} while (!kthread_should_stop()); } while (!kthread_should_stop());
@@ -1767,7 +1776,7 @@ xfs_flush_buftarg(
continue; continue;
} }
list_move(&bp->b_list, &tmp); list_move_tail(&bp->b_list, &tmp);
} }
spin_unlock(dwlk); spin_unlock(dwlk);
@@ -1776,7 +1785,7 @@ xfs_flush_buftarg(
*/ */
list_for_each_entry_safe(bp, n, &tmp, b_list) { list_for_each_entry_safe(bp, n, &tmp, b_list) {
xfs_buf_lock(bp); xfs_buf_lock(bp);
bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|_XBF_RUN_QUEUES);
bp->b_flags |= XBF_WRITE; bp->b_flags |= XBF_WRITE;
if (wait) if (wait)
bp->b_flags &= ~XBF_ASYNC; bp->b_flags &= ~XBF_ASYNC;
@@ -1786,6 +1795,9 @@ xfs_flush_buftarg(
xfs_buf_iostrategy(bp); xfs_buf_iostrategy(bp);
} }
if (wait)
blk_run_address_space(target->bt_mapping);
/* /*
* Remaining list items must be flushed before returning * Remaining list items must be flushed before returning
*/ */
@@ -1797,9 +1809,6 @@ xfs_flush_buftarg(
xfs_buf_relse(bp); xfs_buf_relse(bp);
} }
if (wait)
blk_run_address_space(target->bt_mapping);
return pincount; return pincount;
} }
-7
View File
@@ -298,11 +298,6 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *);
#define XFS_BUF_UNWRITE(bp) ((bp)->b_flags &= ~XBF_WRITE) #define XFS_BUF_UNWRITE(bp) ((bp)->b_flags &= ~XBF_WRITE)
#define XFS_BUF_ISWRITE(bp) ((bp)->b_flags & XBF_WRITE) #define XFS_BUF_ISWRITE(bp) ((bp)->b_flags & XBF_WRITE)
#define XFS_BUF_ISUNINITIAL(bp) (0)
#define XFS_BUF_UNUNINITIAL(bp) (0)
#define XFS_BUF_BP_ISMAPPED(bp) (1)
#define XFS_BUF_IODONE_FUNC(bp) ((bp)->b_iodone) #define XFS_BUF_IODONE_FUNC(bp) ((bp)->b_iodone)
#define XFS_BUF_SET_IODONE_FUNC(bp, func) ((bp)->b_iodone = (func)) #define XFS_BUF_SET_IODONE_FUNC(bp, func) ((bp)->b_iodone = (func))
#define XFS_BUF_CLR_IODONE_FUNC(bp) ((bp)->b_iodone = NULL) #define XFS_BUF_CLR_IODONE_FUNC(bp) ((bp)->b_iodone = NULL)
@@ -393,8 +388,6 @@ static inline int XFS_bwrite(xfs_buf_t *bp)
return error; return error;
} }
#define XFS_bdwrite(bp) xfs_buf_iostart(bp, XBF_DELWRI | XBF_ASYNC)
static inline int xfs_bdwrite(void *mp, xfs_buf_t *bp) static inline int xfs_bdwrite(void *mp, xfs_buf_t *bp)
{ {
bp->b_strat = xfs_bdstrat_cb; bp->b_strat = xfs_bdstrat_cb;
+1 -1
View File
@@ -34,7 +34,7 @@ xfs_param_t xfs_params = {
.restrict_chown = { 0, 1, 1 }, .restrict_chown = { 0, 1, 1 },
.sgid_inherit = { 0, 0, 1 }, .sgid_inherit = { 0, 0, 1 },
.symlink_mode = { 0, 0, 1 }, .symlink_mode = { 0, 0, 1 },
.panic_mask = { 0, 0, 127 }, .panic_mask = { 0, 0, 255 },
.error_level = { 0, 3, 11 }, .error_level = { 0, 3, 11 },
.syncd_timer = { 1*100, 30*100, 7200*100}, .syncd_timer = { 1*100, 30*100, 7200*100},
.stats_clear = { 0, 0, 1 }, .stats_clear = { 0, 0, 1 },
+7 -12
View File
@@ -653,7 +653,7 @@ xfs_attrmulti_by_handle(
STATIC int STATIC int
xfs_ioc_space( xfs_ioc_space(
bhv_desc_t *bdp, bhv_desc_t *bdp,
bhv_vnode_t *vp, struct inode *inode,
struct file *filp, struct file *filp,
int flags, int flags,
unsigned int cmd, unsigned int cmd,
@@ -735,7 +735,7 @@ xfs_ioctl(
!capable(CAP_SYS_ADMIN)) !capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
return xfs_ioc_space(bdp, vp, filp, ioflags, cmd, arg); return xfs_ioc_space(bdp, inode, filp, ioflags, cmd, arg);
case XFS_IOC_DIOINFO: { case XFS_IOC_DIOINFO: {
struct dioattr da; struct dioattr da;
@@ -763,6 +763,8 @@ xfs_ioctl(
return xfs_ioc_fsgeometry(mp, arg); return xfs_ioc_fsgeometry(mp, arg);
case XFS_IOC_GETVERSION: case XFS_IOC_GETVERSION:
return put_user(inode->i_generation, (int __user *)arg);
case XFS_IOC_GETXFLAGS: case XFS_IOC_GETXFLAGS:
case XFS_IOC_SETXFLAGS: case XFS_IOC_SETXFLAGS:
case XFS_IOC_FSGETXATTR: case XFS_IOC_FSGETXATTR:
@@ -957,7 +959,7 @@ xfs_ioctl(
STATIC int STATIC int
xfs_ioc_space( xfs_ioc_space(
bhv_desc_t *bdp, bhv_desc_t *bdp,
bhv_vnode_t *vp, struct inode *inode,
struct file *filp, struct file *filp,
int ioflags, int ioflags,
unsigned int cmd, unsigned int cmd,
@@ -967,13 +969,13 @@ xfs_ioc_space(
int attr_flags = 0; int attr_flags = 0;
int error; int error;
if (vp->v_inode.i_flags & (S_IMMUTABLE|S_APPEND)) if (inode->i_flags & (S_IMMUTABLE|S_APPEND))
return -XFS_ERROR(EPERM); return -XFS_ERROR(EPERM);
if (!(filp->f_mode & FMODE_WRITE)) if (!(filp->f_mode & FMODE_WRITE))
return -XFS_ERROR(EBADF); return -XFS_ERROR(EBADF);
if (!VN_ISREG(vp)) if (!S_ISREG(inode->i_mode))
return -XFS_ERROR(EINVAL); return -XFS_ERROR(EINVAL);
if (copy_from_user(&bf, arg, sizeof(bf))) if (copy_from_user(&bf, arg, sizeof(bf)))
@@ -1264,13 +1266,6 @@ xfs_ioc_xattr(
break; break;
} }
case XFS_IOC_GETVERSION: {
flags = vn_to_inode(vp)->i_generation;
if (copy_to_user(arg, &flags, sizeof(flags)))
error = -EFAULT;
break;
}
default: default:
error = -ENOTTY; error = -ENOTTY;
break; break;
+20 -5
View File
@@ -623,12 +623,27 @@ xfs_vn_getattr(
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
bhv_vnode_t *vp = vn_from_inode(inode); bhv_vnode_t *vp = vn_from_inode(inode);
int error = 0; bhv_vattr_t vattr = { .va_mask = XFS_AT_STAT };
int error;
if (unlikely(vp->v_flag & VMODIFIED)) error = bhv_vop_getattr(vp, &vattr, ATTR_LAZY, NULL);
error = vn_revalidate(vp); if (likely(!error)) {
if (!error) stat->size = i_size_read(inode);
generic_fillattr(inode, stat); stat->dev = inode->i_sb->s_dev;
stat->rdev = (vattr.va_rdev == 0) ? 0 :
MKDEV(sysv_major(vattr.va_rdev) & 0x1ff,
sysv_minor(vattr.va_rdev));
stat->mode = vattr.va_mode;
stat->nlink = vattr.va_nlink;
stat->uid = vattr.va_uid;
stat->gid = vattr.va_gid;
stat->ino = vattr.va_nodeid;
stat->atime = vattr.va_atime;
stat->mtime = vattr.va_mtime;
stat->ctime = vattr.va_ctime;
stat->blocks = vattr.va_nblocks;
stat->blksize = vattr.va_blocksize;
}
return -error; return -error;
} }
+7 -7
View File
@@ -148,11 +148,7 @@ BUFFER_FNS(PrivateStart, unwritten);
(current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) (current->flags = ((current->flags & ~(f)) | (*(sp) & (f))))
#define NBPP PAGE_SIZE #define NBPP PAGE_SIZE
#define DPPSHFT (PAGE_SHIFT - 9)
#define NDPP (1 << (PAGE_SHIFT - 9)) #define NDPP (1 << (PAGE_SHIFT - 9))
#define dtop(DD) (((DD) + NDPP - 1) >> DPPSHFT)
#define dtopt(DD) ((DD) >> DPPSHFT)
#define dpoff(DD) ((DD) & (NDPP-1))
#define NBBY 8 /* number of bits per byte */ #define NBBY 8 /* number of bits per byte */
#define NBPC PAGE_SIZE /* Number of bytes per click */ #define NBPC PAGE_SIZE /* Number of bytes per click */
@@ -172,8 +168,6 @@ BUFFER_FNS(PrivateStart, unwritten);
#define btoct(x) ((__psunsigned_t)(x)>>BPCSHIFT) #define btoct(x) ((__psunsigned_t)(x)>>BPCSHIFT)
#define btoc64(x) (((__uint64_t)(x)+(NBPC-1))>>BPCSHIFT) #define btoc64(x) (((__uint64_t)(x)+(NBPC-1))>>BPCSHIFT)
#define btoct64(x) ((__uint64_t)(x)>>BPCSHIFT) #define btoct64(x) ((__uint64_t)(x)>>BPCSHIFT)
#define io_btoc(x) (((__psunsigned_t)(x)+(IO_NBPC-1))>>IO_BPCSHIFT)
#define io_btoct(x) ((__psunsigned_t)(x)>>IO_BPCSHIFT)
/* off_t bytes to clicks */ /* off_t bytes to clicks */
#define offtoc(x) (((__uint64_t)(x)+(NBPC-1))>>BPCSHIFT) #define offtoc(x) (((__uint64_t)(x)+(NBPC-1))>>BPCSHIFT)
@@ -186,7 +180,6 @@ BUFFER_FNS(PrivateStart, unwritten);
#define ctob(x) ((__psunsigned_t)(x)<<BPCSHIFT) #define ctob(x) ((__psunsigned_t)(x)<<BPCSHIFT)
#define btoct(x) ((__psunsigned_t)(x)>>BPCSHIFT) #define btoct(x) ((__psunsigned_t)(x)>>BPCSHIFT)
#define ctob64(x) ((__uint64_t)(x)<<BPCSHIFT) #define ctob64(x) ((__uint64_t)(x)<<BPCSHIFT)
#define io_ctob(x) ((__psunsigned_t)(x)<<IO_BPCSHIFT)
/* bytes to clicks */ /* bytes to clicks */
#define btoc(x) (((__psunsigned_t)(x)+(NBPC-1))>>BPCSHIFT) #define btoc(x) (((__psunsigned_t)(x)+(NBPC-1))>>BPCSHIFT)
@@ -339,4 +332,11 @@ static inline __uint64_t roundup_64(__uint64_t x, __uint32_t y)
return(x * y); return(x * y);
} }
static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y)
{
x += y - 1;
do_div(x, y);
return x;
}
#endif /* __XFS_LINUX__ */ #endif /* __XFS_LINUX__ */
+5 -5
View File
@@ -270,12 +270,12 @@ xfs_read(
} }
} }
if (unlikely((ioflags & IO_ISDIRECT) && VN_CACHED(vp))) if (unlikely(ioflags & IO_ISDIRECT)) {
bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)), if (VN_CACHED(vp))
-1, FI_REMAPF_LOCKED); bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)),
-1, FI_REMAPF_LOCKED);
if (unlikely(ioflags & IO_ISDIRECT))
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
}
xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore, xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore,
(void *)iovp, segs, *offset, ioflags); (void *)iovp, segs, *offset, ioflags);
+2
View File
@@ -227,7 +227,9 @@ xfs_initialize_vnode(
xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip); xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
xfs_set_inodeops(inode); xfs_set_inodeops(inode);
spin_lock(&ip->i_flags_lock);
ip->i_flags &= ~XFS_INEW; ip->i_flags &= ~XFS_INEW;
spin_unlock(&ip->i_flags_lock);
barrier(); barrier();
unlock_new_inode(inode); unlock_new_inode(inode);
+1 -1
View File
@@ -79,7 +79,7 @@ typedef enum {
#define VFS_RDONLY 0x0001 /* read-only vfs */ #define VFS_RDONLY 0x0001 /* read-only vfs */
#define VFS_GRPID 0x0002 /* group-ID assigned from directory */ #define VFS_GRPID 0x0002 /* group-ID assigned from directory */
#define VFS_DMI 0x0004 /* filesystem has the DMI enabled */ #define VFS_DMI 0x0004 /* filesystem has the DMI enabled */
#define VFS_UMOUNT 0x0008 /* unmount in progress */ /* ---- VFS_UMOUNT ---- 0x0008 -- unneeded, fixed via kthread APIs */
#define VFS_32BITINODES 0x0010 /* do not use inums above 32 bits */ #define VFS_32BITINODES 0x0010 /* do not use inums above 32 bits */
#define VFS_END 0x0010 /* max flag */ #define VFS_END 0x0010 /* max flag */
-2
View File
@@ -85,8 +85,6 @@ typedef enum {
#define VN_BHV_HEAD(vp) ((bhv_head_t *)(&((vp)->v_bh))) #define VN_BHV_HEAD(vp) ((bhv_head_t *)(&((vp)->v_bh)))
#define vn_bhv_head_init(bhp,name) bhv_head_init(bhp,name) #define vn_bhv_head_init(bhp,name) bhv_head_init(bhp,name)
#define vn_bhv_remove(bhp,bdp) bhv_remove(bhp,bdp) #define vn_bhv_remove(bhp,bdp) bhv_remove(bhp,bdp)
#define vn_bhv_lookup(bhp,ops) bhv_lookup(bhp,ops)
#define vn_bhv_lookup_unlocked(bhp,ops) bhv_lookup_unlocked(bhp,ops)
/* /*
* Vnode to Linux inode mapping. * Vnode to Linux inode mapping.
-26
View File
@@ -381,18 +381,6 @@ xfs_qm_dquot_logitem_unlock(
} }
/*
* The transaction with the dquot locked has aborted. The dquot
* must not be dirty within the transaction. We simply unlock just
* as if the transaction had been cancelled.
*/
STATIC void
xfs_qm_dquot_logitem_abort(
xfs_dq_logitem_t *ql)
{
xfs_qm_dquot_logitem_unlock(ql);
}
/* /*
* this needs to stamp an lsn into the dquot, I think. * this needs to stamp an lsn into the dquot, I think.
* rpc's that look at user dquot's would then have to * rpc's that look at user dquot's would then have to
@@ -426,7 +414,6 @@ STATIC struct xfs_item_ops xfs_dquot_item_ops = {
.iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
xfs_qm_dquot_logitem_committed, xfs_qm_dquot_logitem_committed,
.iop_push = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_push, .iop_push = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_push,
.iop_abort = (void(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_abort,
.iop_pushbuf = (void(*)(xfs_log_item_t*)) .iop_pushbuf = (void(*)(xfs_log_item_t*))
xfs_qm_dquot_logitem_pushbuf, xfs_qm_dquot_logitem_pushbuf,
.iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
@@ -558,17 +545,6 @@ xfs_qm_qoff_logitem_committed(xfs_qoff_logitem_t *qf, xfs_lsn_t lsn)
return (lsn); return (lsn);
} }
/*
* The transaction of which this QUOTAOFF is a part has been aborted.
* Just clean up after ourselves.
* Shouldn't this never happen in the case of qoffend logitems? XXX
*/
STATIC void
xfs_qm_qoff_logitem_abort(xfs_qoff_logitem_t *qf)
{
kmem_free(qf, sizeof(xfs_qoff_logitem_t));
}
/* /*
* There isn't much you can do to push on an quotaoff item. It is simply * There isn't much you can do to push on an quotaoff item. It is simply
* stuck waiting for the log to be flushed to disk. * stuck waiting for the log to be flushed to disk.
@@ -644,7 +620,6 @@ STATIC struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
.iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
xfs_qm_qoffend_logitem_committed, xfs_qm_qoffend_logitem_committed,
.iop_push = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push, .iop_push = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push,
.iop_abort = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_abort,
.iop_pushbuf = NULL, .iop_pushbuf = NULL,
.iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
xfs_qm_qoffend_logitem_committing xfs_qm_qoffend_logitem_committing
@@ -667,7 +642,6 @@ STATIC struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
.iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t)) .iop_committed = (xfs_lsn_t(*)(xfs_log_item_t*, xfs_lsn_t))
xfs_qm_qoff_logitem_committed, xfs_qm_qoff_logitem_committed,
.iop_push = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push, .iop_push = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_push,
.iop_abort = (void(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_abort,
.iop_pushbuf = NULL, .iop_pushbuf = NULL,
.iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t)) .iop_committing = (void(*)(xfs_log_item_t*, xfs_lsn_t))
xfs_qm_qoff_logitem_committing xfs_qm_qoff_logitem_committing
+7 -7
View File
@@ -112,17 +112,17 @@ xfs_Gqm_init(void)
{ {
xfs_dqhash_t *udqhash, *gdqhash; xfs_dqhash_t *udqhash, *gdqhash;
xfs_qm_t *xqm; xfs_qm_t *xqm;
uint i, hsize, flags = KM_SLEEP | KM_MAYFAIL; size_t hsize;
uint i;
/* /*
* Initialize the dquot hash tables. * Initialize the dquot hash tables.
*/ */
hsize = XFS_QM_HASHSIZE_HIGH; udqhash = kmem_zalloc_greedy(&hsize,
while (!(udqhash = kmem_zalloc(hsize * sizeof(xfs_dqhash_t), flags))) { XFS_QM_HASHSIZE_LOW, XFS_QM_HASHSIZE_HIGH,
if ((hsize >>= 1) <= XFS_QM_HASHSIZE_LOW) KM_SLEEP | KM_MAYFAIL | KM_LARGE);
flags = KM_SLEEP; gdqhash = kmem_zalloc(hsize, KM_SLEEP | KM_LARGE);
} hsize /= sizeof(xfs_dqhash_t);
gdqhash = kmem_zalloc(hsize * sizeof(xfs_dqhash_t), KM_SLEEP);
ndquot = hsize << 8; ndquot = hsize << 8;
xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP); xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP);
-6
View File
@@ -55,12 +55,6 @@ extern kmem_zone_t *qm_dqtrxzone;
#define XFS_QM_HASHSIZE_LOW (NBPP / sizeof(xfs_dqhash_t)) #define XFS_QM_HASHSIZE_LOW (NBPP / sizeof(xfs_dqhash_t))
#define XFS_QM_HASHSIZE_HIGH ((NBPP * 4) / sizeof(xfs_dqhash_t)) #define XFS_QM_HASHSIZE_HIGH ((NBPP * 4) / sizeof(xfs_dqhash_t))
/*
* We output a cmn_err when quotachecking a quota file with more than
* this many fsbs.
*/
#define XFS_QM_BIG_QCHECK_NBLKS 500
/* /*
* This defines the unit of allocation of dquots. * This defines the unit of allocation of dquots.
* Currently, it is just one file system block, and a 4K blk contains 30 * Currently, it is just one file system block, and a 4K blk contains 30
-2
View File
@@ -75,7 +75,6 @@ static inline int XQMISLCKD(struct xfs_dqhash *h)
#define xfs_qm_freelist_lock(qm) XQMLCK(&((qm)->qm_dqfreelist)) #define xfs_qm_freelist_lock(qm) XQMLCK(&((qm)->qm_dqfreelist))
#define xfs_qm_freelist_unlock(qm) XQMUNLCK(&((qm)->qm_dqfreelist)) #define xfs_qm_freelist_unlock(qm) XQMUNLCK(&((qm)->qm_dqfreelist))
#define XFS_QM_IS_FREELIST_LOCKED(qm) XQMISLCKD(&((qm)->qm_dqfreelist))
/* /*
* Hash into a bucket in the dquot hash table, based on <mp, id>. * Hash into a bucket in the dquot hash table, based on <mp, id>.
@@ -170,6 +169,5 @@ for ((dqp) = (qlist)->qh_next; (dqp) != (xfs_dquot_t *)(qlist); \
#define DQFLAGTO_TYPESTR(d) (((d)->dq_flags & XFS_DQ_USER) ? "USR" : \ #define DQFLAGTO_TYPESTR(d) (((d)->dq_flags & XFS_DQ_USER) ? "USR" : \
(((d)->dq_flags & XFS_DQ_GROUP) ? "GRP" : \ (((d)->dq_flags & XFS_DQ_GROUP) ? "GRP" : \
(((d)->dq_flags & XFS_DQ_PROJ) ? "PRJ":"???"))) (((d)->dq_flags & XFS_DQ_PROJ) ? "PRJ":"???")))
#define DQFLAGTO_DIRTYSTR(d) (XFS_DQ_IS_DIRTY(d) ? "DIRTY" : "NOTDIRTY")
#endif /* __XFS_QUOTA_PRIV_H__ */ #endif /* __XFS_QUOTA_PRIV_H__ */

Some files were not shown because too many files have changed in this diff Show More