diff -urNp --exclude CVS --exclude BitKeeper x-ref/drivers/block/loop.c x/drivers/block/loop.c --- x-ref/drivers/block/loop.c 2003-08-31 03:09:31.000000000 +0200 +++ x/drivers/block/loop.c 2003-08-31 03:09:40.000000000 +0200 @@ -157,7 +157,7 @@ struct loop_func_table *xfer_funcs[MAX_L static int compute_loop_size(struct loop_device *lo, struct dentry * lo_dentry, kdev_t lodev) { if (S_ISREG(lo_dentry->d_inode->i_mode)) - return (lo_dentry->d_inode->i_size - lo->lo_offset) >> BLOCK_SIZE_BITS; + return (i_size_read(lo_dentry->d_inode) - lo->lo_offset) >> BLOCK_SIZE_BITS; if (blk_size[MAJOR(lodev)]) return blk_size[MAJOR(lodev)][MINOR(lodev)] - (lo->lo_offset >> BLOCK_SIZE_BITS); diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/binfmt_aout.c x/fs/binfmt_aout.c --- x-ref/fs/binfmt_aout.c 2002-01-22 18:55:26.000000000 +0100 +++ x/fs/binfmt_aout.c 2003-08-31 03:09:40.000000000 +0200 @@ -263,7 +263,7 @@ static int load_aout_binary(struct linux if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC && N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) || N_TRSIZE(ex) || N_DRSIZE(ex) || - bprm->file->f_dentry->d_inode->i_size < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) { + i_size_read(bprm->file->f_dentry->d_inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) { return -ENOEXEC; } @@ -443,7 +443,7 @@ static int load_aout_library(struct file /* We come in here for the regular a.out style of shared libraries */ if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) || N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) || - inode->i_size < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) { + i_size_read(inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) { goto out; } diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/block_dev.c x/fs/block_dev.c --- x-ref/fs/block_dev.c 2003-08-31 03:09:31.000000000 +0200 +++ x/fs/block_dev.c 2003-08-31 03:09:40.000000000 +0200 @@ -167,7 +167,7 @@ static int blkdev_commit_write(struct fi static loff_t block_llseek(struct file *file, loff_t offset, int origin) { /* ewww */ - loff_t size = file->f_dentry->d_inode->i_bdev->bd_inode->i_size; + loff_t size = i_size_read(file->f_dentry->d_inode->i_bdev->bd_inode); loff_t retval; switch (origin) { diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/buffer.c x/fs/buffer.c --- x-ref/fs/buffer.c 2003-08-31 03:09:39.000000000 +0200 +++ x/fs/buffer.c 2003-08-31 03:09:40.000000000 +0200 @@ -1747,7 +1747,7 @@ int block_read_full_page(struct page *pa blocks = PAGE_CACHE_SIZE >> inode->i_blkbits; iblock = page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); - lblock = (inode->i_size+blocksize-1) >> inode->i_blkbits; + lblock = (i_size_read(inode)+blocksize-1) >> inode->i_blkbits; bh = head; nr = 0; i = 0; @@ -1968,8 +1968,12 @@ int generic_commit_write(struct file *fi loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to; __block_commit_write(inode,page,from,to); kunmap(page); + /* + * No need of using i_size_read here, the i_size + * cannot change under us because we hold the i_sem. + */ if (pos > inode->i_size) { - inode->i_size = pos; + i_size_write(inode, pos); mark_inode_dirty(inode); } return 0; @@ -2058,7 +2062,8 @@ out: int block_write_full_page(struct page *page, get_block_t *get_block) { struct inode *inode = page->mapping->host; - unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT; + loff_t i_size = i_size_read(inode); + unsigned long end_index = i_size >> PAGE_CACHE_SHIFT; unsigned offset; int err; @@ -2067,7 +2072,7 @@ int block_write_full_page(struct page *p return __block_write_full_page(inode, page, get_block); /* things got complicated... */ - offset = inode->i_size & (PAGE_CACHE_SIZE-1); + offset = i_size & (PAGE_CACHE_SIZE-1); /* OK, are we completely out? */ if (page->index >= end_index+1 || !offset) { UnlockPage(page); diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/ioctl.c x/fs/ioctl.c --- x-ref/fs/ioctl.c 2003-08-31 03:09:32.000000000 +0200 +++ x/fs/ioctl.c 2003-08-31 03:09:40.000000000 +0200 @@ -38,7 +38,7 @@ static int file_ioctl(struct file *filp, return -EBADF; return put_user(inode->i_sb->s_blocksize, (int *) arg); case FIONREAD: - return put_user(inode->i_size - filp->f_pos, (int *) arg); + return put_user(i_size_read(inode) - filp->f_pos, (int *) arg); } if (filp->f_op && filp->f_op->ioctl) return filp->f_op->ioctl(inode, filp, cmd, arg); diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/locks.c x/fs/locks.c --- x-ref/fs/locks.c 2003-08-31 03:09:31.000000000 +0200 +++ x/fs/locks.c 2003-08-31 03:09:40.000000000 +0200 @@ -261,7 +261,7 @@ static int flock_to_posix_lock(struct fi start = filp->f_pos; break; case 2: /*SEEK_END*/ - start = filp->f_dentry->d_inode->i_size; + start = i_size_read(filp->f_dentry->d_inode); break; default: return -EINVAL; @@ -311,7 +311,7 @@ static int flock64_to_posix_lock(struct start = filp->f_pos; break; case 2: /*SEEK_END*/ - start = filp->f_dentry->d_inode->i_size; + start = i_size_read(filp->f_dentry->d_inode); break; default: return -EINVAL; diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/open.c x/fs/open.c --- x-ref/fs/open.c 2003-08-31 03:09:34.000000000 +0200 +++ x/fs/open.c 2003-08-31 03:09:40.000000000 +0200 @@ -903,7 +903,7 @@ asmlinkage long sys_vhangup(void) */ int generic_file_open(struct inode * inode, struct file * filp) { - if (!(filp->f_flags & O_LARGEFILE) && inode->i_size > MAX_NON_LFS) + if (!(filp->f_flags & O_LARGEFILE) && i_size_read(inode) > MAX_NON_LFS) return -EFBIG; return 0; } diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/read_write.c x/fs/read_write.c --- x-ref/fs/read_write.c 2003-08-26 00:13:04.000000000 +0200 +++ x/fs/read_write.c 2003-08-31 03:09:40.000000000 +0200 @@ -46,7 +46,7 @@ loff_t generic_file_llseek(struct file * switch (origin) { case 2: - offset += file->f_dentry->d_inode->i_size; + offset += i_size_read(file->f_dentry->d_inode); break; case 1: offset += file->f_pos; @@ -74,7 +74,7 @@ loff_t default_llseek(struct file *file, switch (origin) { case 2: - offset += file->f_dentry->d_inode->i_size; + offset += i_size_read(file->f_dentry->d_inode); break; case 1: offset += file->f_pos; diff -urNp --exclude CVS --exclude BitKeeper x-ref/fs/stat.c x/fs/stat.c --- x-ref/fs/stat.c 2003-08-26 00:13:04.000000000 +0200 +++ x/fs/stat.c 2003-08-31 03:09:57.000000000 +0200 @@ -36,6 +36,7 @@ static int cp_old_stat(struct inode * in { static int warncount = 5; struct __old_kernel_stat tmp; + loff_t i_size; memset(&tmp, 0, sizeof(struct __old_kernel_stat)); @@ -55,11 +56,13 @@ static int cp_old_stat(struct inode * in SET_OLDSTAT_UID(tmp, inode->i_uid); SET_OLDSTAT_GID(tmp, inode->i_gid); tmp.st_rdev = kdev_t_to_nr(inode->i_rdev); + + i_size = i_size_read(inode); #if BITS_PER_LONG == 32 - if (inode->i_size > MAX_NON_LFS) + if (i_size > MAX_NON_LFS) return -EOVERFLOW; #endif - tmp.st_size = inode->i_size; + tmp.st_size = i_size; tmp.st_atime = inode->i_atime; tmp.st_mtime = inode->i_mtime; tmp.st_ctime = inode->i_ctime; @@ -72,6 +75,7 @@ static int cp_new_stat(struct inode * in { struct stat tmp; unsigned int blocks, indirect; + loff_t i_size; memset(&tmp, 0, sizeof(tmp)); tmp.st_dev = kdev_t_to_nr(inode->i_dev); @@ -81,11 +85,13 @@ static int cp_new_stat(struct inode * in SET_STAT_UID(tmp, inode->i_uid); SET_STAT_GID(tmp, inode->i_gid); tmp.st_rdev = kdev_t_to_nr(inode->i_rdev); + + i_size = i_size_read(inode); #if BITS_PER_LONG == 32 - if (inode->i_size > MAX_NON_LFS) + if (i_size > MAX_NON_LFS) return -EOVERFLOW; #endif - tmp.st_size = inode->i_size; + tmp.st_size = i_size; tmp.st_atime = inode->i_atime; tmp.st_mtime = inode->i_mtime; tmp.st_ctime = inode->i_ctime; @@ -291,7 +297,7 @@ static long cp_new_stat64(struct inode * tmp.st_atime = inode->i_atime; tmp.st_mtime = inode->i_mtime; tmp.st_ctime = inode->i_ctime; - tmp.st_size = inode->i_size; + tmp.st_size = i_size_read(inode); /* * st_blocks and st_blksize are approximated with a simple algorithm if * they aren't supported directly by the filesystem. The minix and msdos diff -urNp --exclude CVS --exclude BitKeeper x-ref/ipc/shm.c x/ipc/shm.c --- x-ref/ipc/shm.c 2003-08-31 03:09:32.000000000 +0200 +++ x/ipc/shm.c 2003-08-31 03:09:40.000000000 +0200 @@ -624,7 +624,7 @@ asmlinkage long sys_shmat (int shmid, ch return -EACCES; } file = shp->shm_file; - size = file->f_dentry->d_inode->i_size; + size = i_size_read(file->f_dentry->d_inode); shp->shm_nattch++; shm_unlock(shmid); diff -urNp --exclude CVS --exclude BitKeeper x-ref/mm/filemap.c x/mm/filemap.c --- x-ref/mm/filemap.c 2003-08-31 03:09:38.000000000 +0200 +++ x/mm/filemap.c 2003-08-31 03:09:40.000000000 +0200 @@ -1195,7 +1195,7 @@ static void generic_file_readahead(int r unsigned long raend; int max_readahead = get_max_readahead(inode); - end_index = inode->i_size >> PAGE_CACHE_SHIFT; + end_index = i_size_read(inode) >> PAGE_CACHE_SHIFT; raend = filp->f_raend; max_ahead = 0; @@ -1368,14 +1368,15 @@ void __do_generic_file_read(struct file for (;;) { struct page *page, **hash; unsigned long end_index, nr, ret; + loff_t i_size = i_size_read(inode); - end_index = inode->i_size >> PAGE_CACHE_SHIFT; + end_index = i_size >> PAGE_CACHE_SHIFT; if (index > end_index) break; nr = PAGE_CACHE_SIZE; if (index == end_index) { - nr = inode->i_size & ~PAGE_CACHE_MASK; + nr = i_size & ~PAGE_CACHE_MASK; if (nr <= offset) break; } @@ -1558,7 +1559,7 @@ static ssize_t generic_file_direct_IO(in struct kiobuf * iobuf; struct address_space * mapping = filp->f_dentry->d_inode->i_mapping; struct inode * inode = mapping->host; - loff_t size = inode->i_size; + loff_t size = i_size_read(inode); new_iobuf = 0; iobuf = filp->f_iobuf; @@ -1861,7 +1862,7 @@ static ssize_t do_readahead(struct file return -EINVAL; /* Limit it to the size of the file.. */ - max = (mapping->host->i_size + ~PAGE_CACHE_MASK) >> PAGE_CACHE_SHIFT; + max = (i_size_read(mapping->host) + ~PAGE_CACHE_MASK) >> PAGE_CACHE_SHIFT; if (index > max) return 0; max -= index; @@ -1986,7 +1987,7 @@ retry_all: * An external ptracer can access pages that normally aren't * accessible.. */ - size = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; + size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; if ((pgoff >= size) && (area->vm_mm == current->mm)) return NULL; @@ -2510,7 +2511,7 @@ static long madvise_willneed(struct vm_a inode = file->f_dentry->d_inode; if (!inode->i_mapping->a_ops->readpage) return error; - size = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; + size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; start = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; if (end > vma->vm_end) diff -urNp --exclude CVS --exclude BitKeeper x-ref/mm/memory.c x/mm/memory.c --- x-ref/mm/memory.c 2003-08-31 03:09:39.000000000 +0200 +++ x/mm/memory.c 2003-08-31 03:09:40.000000000 +0200 @@ -1102,7 +1102,7 @@ int vmtruncate(struct inode * inode, lof if (inode->i_size < offset) goto do_expand; - inode->i_size = offset; + i_size_write(inode, offset); spin_lock(&mapping->i_shared_lock); if (!mapping->i_mmap && !mapping->i_mmap_shared) goto out_unlock; @@ -1124,7 +1124,7 @@ do_expand: goto out_sig; if (offset > inode->i_sb->s_maxbytes) goto out; - inode->i_size = offset; + i_size_write(inode, offset); out_truncate: if (inode->i_op && inode->i_op->truncate) { diff -urNp --exclude CVS --exclude BitKeeper x-ref/mm/swapfile.c x/mm/swapfile.c --- x-ref/mm/swapfile.c 2003-08-31 03:09:34.000000000 +0200 +++ x/mm/swapfile.c 2003-08-31 03:09:40.000000000 +0200 @@ -975,7 +975,7 @@ asmlinkage long sys_swapon(const char * swapfilesize = blk_size[MAJOR(dev)][MINOR(dev)] >> (PAGE_SHIFT - 10); } else if (S_ISREG(swap_inode->i_mode)) - swapfilesize = swap_inode->i_size >> PAGE_SHIFT; + swapfilesize = i_size_read(swap_inode) >> PAGE_SHIFT; else goto bad_swap;