From mboxrd@z Thu Jan 1 00:00:00 1970 From: rpeterso@sourceware.org Date: 7 Feb 2007 15:25:19 -0000 Subject: [Cluster-devel] cluster cman/lib/libcman.c cman/lib/libcman.h ... Message-ID: <20070207152519.18179.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: STABLE Changes by: rpeterso at sourceware.org 2007-02-07 15:25:06 Modified files: cman/lib : libcman.c libcman.h cman-kernel/src: cnxman.c dlm-kernel/src : lowcomms.c memory.c gfs-kernel/src/dlm: lock_dlm.h gfs-kernel/src/gfs: diaper.c dir.c file.c file.h gfs.h glock.c inode.c ioctl.c ops_file.c ops_fstype.c ops_inode.c ops_super.c recovery.c util.c util.h gfs-kernel/src/gulm: gulm.h gulm_fs.c handler.h gfs-kernel/src/harness: main.c gfs-kernel/src/nolock: main.c gnbd-kernel/src: gnbd.c Log message: Bring the STABLE branch of cluster suite up to the 2.6.20-rc7 and similar kernels. This also includes Wendy Cheng's GFS kernel change for Asynch IO (aio) and fixes a kernel panic reported on the linux-cluster mailing list. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/lib/libcman.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.3.6.1.2.5&r2=1.3.6.1.2.6 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/lib/libcman.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.6.1.2.6&r2=1.2.6.1.2.7 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman-kernel/src/cnxman.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.42.2.12.4.1.2.14&r2=1.42.2.12.4.1.2.15 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/lowcomms.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.22.2.8.4.2.2.2&r2=1.22.2.8.4.2.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/memory.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.3&r2=1.3.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/dlm/lock_dlm.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.18.2.3.6.3&r2=1.18.2.3.6.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/diaper.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1.2.1.4.1.2.1&r2=1.1.2.1.4.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/dir.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.8.6.1.2.3&r2=1.8.6.1.2.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/file.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.4.6.1.2.1&r2=1.4.6.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/file.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.2.8.1&r2=1.2.8.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/gfs.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.5.6.1&r2=1.5.6.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/glock.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.20.2.1.4.1.2.2&r2=1.20.2.1.4.1.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/inode.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.20.6.2.2.2&r2=1.20.6.2.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ioctl.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.7.6.1.2.2&r2=1.7.6.1.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_file.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.16.6.2.2.7&r2=1.16.6.2.2.8 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_fstype.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.13.2.1.4.2.2.3&r2=1.13.2.1.4.2.2.4 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_inode.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.6.6.1.2.5&r2=1.6.6.1.2.6 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_super.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.12.2.1.4.2.2.2&r2=1.12.2.1.4.2.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/recovery.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.5.8.1&r2=1.5.8.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/util.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.9.2.1&r2=1.9.2.1.6.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/util.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.7.8.1&r2=1.7.8.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gulm/gulm.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.11.6.1&r2=1.11.6.1.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gulm/gulm_fs.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.15.2.1&r2=1.15.2.1.6.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gulm/handler.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.1&r2=1.1.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/harness/main.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.3&r2=1.3.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/nolock/main.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.4.6.2.2.1&r2=1.4.6.2.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gnbd-kernel/src/gnbd.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.6.6.1.2.4&r2=1.6.6.1.2.5 --- cluster/cman/lib/libcman.c 2006/04/26 08:55:26 1.3.6.1.2.5 +++ cluster/cman/lib/libcman.c 2007/02/07 15:25:04 1.3.6.1.2.6 @@ -501,3 +501,7 @@ return ioctl(h->fd, SIOCCLUSTER_SET_VOTES, nodeid, sizeof(int)); } +int cman_replyto_shutdown(cman_handle_t handle, int yesno) +{ + return 0; +} --- cluster/cman/lib/libcman.h 2006/09/01 08:37:10 1.2.6.1.2.6 +++ cluster/cman/lib/libcman.h 2007/02/07 15:25:04 1.2.6.1.2.7 @@ -162,4 +162,5 @@ int cman_unregister_quorum_device(cman_handle_t handle); int cman_poll_quorum_device(cman_handle_t handle, int isavailable); +int cman_replyto_shutdown(cman_handle_t handle, int yesno); #endif --- cluster/cman-kernel/src/Attic/cnxman.c 2007/01/19 10:24:46 1.42.2.12.4.1.2.14 +++ cluster/cman-kernel/src/Attic/cnxman.c 2007/02/07 15:25:04 1.42.2.12.4.1.2.15 @@ -1760,7 +1760,7 @@ /* Make sure we have a node name */ if (nodename[0] == '\0') - strcpy(nodename, system_utsname.nodename); + strcpy(nodename, init_utsname()->nodename); membership_pid = start_membership_services(kcluster_pid); if (membership_pid < 0) { --- cluster/dlm-kernel/src/Attic/lowcomms.c 2005/12/20 09:22:04 1.22.2.8.4.2.2.2 +++ cluster/dlm-kernel/src/Attic/lowcomms.c 2007/02/07 15:25:04 1.22.2.8.4.2.2.3 @@ -133,7 +133,7 @@ /* An array of pointers to connections, indexed by NODEID */ static struct connection **connections; static struct semaphore connections_lock; -static kmem_cache_t *con_cache; +static struct kmem_cache *con_cache; static int conn_array_size; static atomic_t accepting; --- cluster/dlm-kernel/src/Attic/memory.c 2004/07/15 07:45:57 1.3 +++ cluster/dlm-kernel/src/Attic/memory.c 2007/02/07 15:25:04 1.3.8.1 @@ -24,12 +24,12 @@ /* as the man says...Shouldn't this be in a header file somewhere? */ #define BYTES_PER_WORD sizeof(void *) -static kmem_cache_t *rsb_cache_small; -static kmem_cache_t *rsb_cache_large; -static kmem_cache_t *lkb_cache; -static kmem_cache_t *lvb_cache; -static kmem_cache_t *resdir_cache_large; -static kmem_cache_t *resdir_cache_small; +static struct kmem_cache *rsb_cache_small; +static struct kmem_cache *rsb_cache_large; +static struct kmem_cache *lkb_cache; +static struct kmem_cache *lvb_cache; +static struct kmem_cache *resdir_cache_large; +static struct kmem_cache *resdir_cache_small; /* The thresholds above which we allocate large RSBs/direntry rather than small * ones. This must make the resultant structure end on a word boundary */ --- cluster/gfs-kernel/src/dlm/Attic/lock_dlm.h 2006/12/08 17:27:44 1.18.2.3.6.3 +++ cluster/gfs-kernel/src/dlm/Attic/lock_dlm.h 2007/02/07 15:25:05 1.18.2.3.6.4 @@ -24,10 +24,11 @@ #include #include #include -#include -#include -#include -#include + +#include "lm_interface.h" +#include "cluster/cnxman.h" +#include "cluster/service.h" +#include "cluster/dlm.h" /* We take a shortcut and use lm_lockname structs for internal locks. This means we must be careful to keep these types different from those used in --- cluster/gfs-kernel/src/gfs/Attic/diaper.c 2006/06/26 21:53:51 1.1.2.1.4.1.2.1 +++ cluster/gfs-kernel/src/gfs/Attic/diaper.c 2007/02/07 15:25:05 1.1.2.1.4.1.2.2 @@ -50,7 +50,7 @@ static LIST_HEAD(diaper_list); static spinlock_t diaper_lock; static DEFINE_IDR(diaper_idr); -kmem_cache_t *diaper_slab; +struct kmem_cache *diaper_slab; /** * diaper_open - @@ -232,9 +232,9 @@ struct inode *inode; int error; - mutex_lock(&real->bd_mount_mutex); + down(&real->bd_mount_sem); sb = sget(&gfs_fs_type, gfs_test_bdev_super, gfs_set_bdev_super, real); - mutex_unlock(&real->bd_mount_mutex); + up(&real->bd_mount_sem); if (IS_ERR(sb)) return PTR_ERR(sb); @@ -252,7 +252,6 @@ sb->s_op = &gfs_dummy_sops; sb->s_fs_info = dh; - up_write(&sb->s_umount); module_put(gfs_fs_type.owner); dh->dh_dummy_sb = sb; @@ -263,7 +262,6 @@ iput(inode); fail: - up_write(&sb->s_umount); deactivate_super(sb); return error; } --- cluster/gfs-kernel/src/gfs/dir.c 2006/06/29 16:50:41 1.8.6.1.2.3 +++ cluster/gfs-kernel/src/gfs/dir.c 2007/02/07 15:25:05 1.8.6.1.2.4 @@ -2213,7 +2213,7 @@ dip->i_di.di_blocks--; } - error = gfs_writei(dip, ht, index * sizeof (uint64_t), size, gfs_zero_blocks); + error = gfs_writei(dip, ht, index * sizeof (uint64_t), size, gfs_zero_blocks, NULL); if (error != size) { if (error >= 0) --- cluster/gfs-kernel/src/gfs/file.c 2006/02/20 03:55:31 1.4.6.1.2.1 +++ cluster/gfs-kernel/src/gfs/file.c 2007/02/07 15:25:05 1.4.6.1.2.2 @@ -305,8 +305,9 @@ int gfs_writei(struct gfs_inode *ip, void *buf, - uint64_t offset, unsigned int size, - write_copy_fn_t copy_fn) + uint64_t offset, unsigned int size, + write_copy_fn_t copy_fn, + struct kiocb *iocb) { struct gfs_sbd *sdp = ip->i_sbd; struct buffer_head *dibh, *bh; --- cluster/gfs-kernel/src/gfs/file.h 2006/02/20 03:55:31 1.2.8.1 +++ cluster/gfs-kernel/src/gfs/file.h 2007/02/07 15:25:05 1.2.8.2 @@ -32,7 +32,8 @@ int gfs_copy_from_user(struct gfs_inode *ip, struct buffer_head *bh, void **buf, unsigned int offset, unsigned int size, int new); int gfs_writei(struct gfs_inode *ip, void *buf, uint64_t offset, - unsigned int size, write_copy_fn_t copy_fn); + unsigned int size, write_copy_fn_t copy_fn, + struct kiocb *iocb); int gfs_zero_blocks(struct gfs_inode *ip, struct buffer_head *bh, void **buf, unsigned int offset, unsigned int size, int new); @@ -48,7 +49,7 @@ gfs_internal_write(struct gfs_inode *ip, char *buf, uint64_t offset, unsigned int size) { - return gfs_writei(ip, buf, offset, size, gfs_copy_from_mem); + return gfs_writei(ip, buf, offset, size, gfs_copy_from_mem, NULL); } #endif /* __FILE_DOT_H__ */ --- cluster/gfs-kernel/src/gfs/gfs.h 2005/04/26 18:33:10 1.5.6.1 +++ cluster/gfs-kernel/src/gfs/gfs.h 2007/02/07 15:25:05 1.5.6.1.2.1 @@ -16,9 +16,9 @@ #define GFS_RELEASE_NAME "" -#include #include +#include "lm_interface.h" #include "fixed_div64.h" #include "lvb.h" #include "incore.h" @@ -67,8 +67,8 @@ #define get_v2sdp(sb) ((struct gfs_sbd *)(sb)->s_fs_info) #define set_v2sdp(sb, sdp) (sb)->s_fs_info = (sdp) -#define get_v2ip(inode) ((struct gfs_inode *)(inode)->u.generic_ip) -#define set_v2ip(inode, ip) (inode)->u.generic_ip = (ip) +#define get_v2ip(inode) ((struct gfs_inode *)(inode)->i_private) +#define set_v2ip(inode, ip) (inode)->i_private = (ip) #define get_v2fp(file) ((struct gfs_file *)(file)->private_data) #define set_v2fp(file, fp) (file)->private_data = (fp) #define get_v2bd(bh) ((struct gfs_bufdata *)(bh)->b_private) --- cluster/gfs-kernel/src/gfs/glock.c 2006/05/17 15:28:24 1.20.2.1.4.1.2.2 +++ cluster/gfs-kernel/src/gfs/glock.c 2007/02/07 15:25:05 1.20.2.1.4.1.2.3 @@ -38,7 +38,7 @@ struct greedy { struct gfs_holder gr_gh; - struct work_struct gr_work; + struct delayed_work gr_work; }; typedef void (*glock_examiner) (struct gfs_glock * gl); @@ -1747,9 +1747,9 @@ */ static void -greedy_work(void *data) +greedy_work(struct work_struct *work) { - struct greedy *gr = (struct greedy *)data; + struct greedy *gr = container_of(work, struct greedy, gr_work.work); struct gfs_holder *gh = &gr->gr_gh; struct gfs_glock *gl = gh->gh_gl; struct gfs_glock_operations *glops = gl->gl_ops; @@ -1804,7 +1804,7 @@ gfs_holder_init(gl, 0, 0, gh); set_bit(HIF_GREEDY, &gh->gh_iflags); gh->gh_owner = NULL; - INIT_WORK(&gr->gr_work, greedy_work, gr); + INIT_DELAYED_WORK(&gr->gr_work, greedy_work); set_bit(GLF_SKIP_WAITERS2, &gl->gl_flags); schedule_delayed_work(&gr->gr_work, time); --- cluster/gfs-kernel/src/gfs/inode.c 2005/09/18 03:01:24 1.20.6.2.2.2 +++ cluster/gfs-kernel/src/gfs/inode.c 2007/02/07 15:25:05 1.20.6.2.2.3 @@ -97,7 +97,6 @@ inode->i_mtime.tv_sec = ip->i_di.di_mtime; inode->i_ctime.tv_sec = ip->i_di.di_ctime; inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0; - inode->i_blksize = PAGE_SIZE; inode->i_blocks = ip->i_di.di_blocks << (ip->i_sbd->sd_sb.sb_bsize_shift - GFS_BASIC_BLOCK_SHIFT); inode->i_generation = ip->i_di.di_header.mh_incarn; --- cluster/gfs-kernel/src/gfs/ioctl.c 2006/11/13 22:48:06 1.7.6.1.2.2 +++ cluster/gfs-kernel/src/gfs/ioctl.c 2007/02/07 15:25:05 1.7.6.1.2.3 @@ -1231,7 +1231,7 @@ } error = gfs_writei(ip, gi->gi_data, gi->gi_offset, gi->gi_size, - gfs_copy_from_user); + gfs_copy_from_user, NULL); gfs_trans_end(sdp); --- cluster/gfs-kernel/src/gfs/ops_file.c 2007/01/17 22:30:12 1.16.6.2.2.7 +++ cluster/gfs-kernel/src/gfs/ops_file.c 2007/02/07 15:25:05 1.16.6.2.2.8 @@ -74,9 +74,10 @@ }; typedef ssize_t(*do_rw_t) (struct file * file, - char *buf, - size_t size, loff_t * offset, - unsigned int num_gh, struct gfs_holder * ghs); + char *buf, + size_t size, loff_t * offset, + struct kiocb *iocb, + unsigned int num_gh, struct gfs_holder * ghs); /** * gfs_llseek - seek to a location in a file @@ -129,7 +130,7 @@ static ssize_t walk_vm_hard(struct file *file, char *buf, size_t size, loff_t *offset, - do_rw_t operation) + struct kiocb *iocb, do_rw_t operation) { struct gfs_holder *ghs; unsigned int num_gh = 0; @@ -178,7 +179,7 @@ gfs_assert(get_v2sdp(sb), x == num_gh,); } - count = operation(file, buf, size, offset, num_gh, ghs); + count = operation(file, buf, size, offset, iocb, num_gh, ghs); while (num_gh--) gfs_holder_uninit(&ghs[num_gh]); @@ -204,7 +205,7 @@ static ssize_t walk_vm(struct file *file, char *buf, size_t size, loff_t *offset, - do_rw_t operation) + struct kiocb *iocb, do_rw_t operation) { if (current->mm) { struct super_block *sb = file->f_dentry->d_inode->i_sb; @@ -231,11 +232,11 @@ { struct gfs_holder gh; - return operation(file, buf, size, offset, 0, &gh); + return operation(file, buf, size, offset, iocb, 0, &gh); } do_locks: - return walk_vm_hard(file, buf, size, offset, operation); + return walk_vm_hard(file, buf, size, offset, iocb, operation); } /** @@ -250,7 +251,8 @@ */ static ssize_t -do_read_readi(struct file *file, char *buf, size_t size, loff_t *offset) +do_read_readi(struct file *file, char *buf, size_t size, loff_t *offset, + struct kiocb *iocb) { struct gfs_inode *ip = get_v2ip(file->f_mapping->host); ssize_t count = 0; @@ -291,7 +293,8 @@ static ssize_t do_read_direct(struct file *file, char *buf, size_t size, loff_t *offset, - unsigned int num_gh, struct gfs_holder *ghs) + struct kiocb *iocb, + unsigned int num_gh, struct gfs_holder *ghs) { struct inode *inode = file->f_mapping->host; struct gfs_inode *ip = get_v2ip(inode); @@ -324,10 +327,18 @@ if (((*offset) & mask) || (((unsigned long)buf) & mask)) goto out_gunlock; - count = do_read_readi(file, buf, size & ~mask, offset); + count = do_read_readi(file, buf, size & ~mask, offset, iocb); + } + else { + if (!iocb) + count = do_sync_read(file, buf, size, offset); + else { + struct iovec local_iov = { .iov_base = buf, .iov_len = size}; + + count = generic_file_aio_read(iocb, &local_iov, 1, *offset); + iocb->ki_pos = *offset; + } } - else - count = generic_file_read(file, buf, size, offset); error = 0; @@ -356,7 +367,8 @@ static ssize_t do_read_buf(struct file *file, char *buf, size_t size, loff_t *offset, - unsigned int num_gh, struct gfs_holder *ghs) + struct kiocb *iocb, + unsigned int num_gh, struct gfs_holder *ghs) { struct gfs_inode *ip = get_v2ip(file->f_mapping->host); ssize_t count = 0; @@ -370,9 +382,17 @@ if (gfs_is_jdata(ip) || (gfs_is_stuffed(ip) && !test_bit(GIF_PAGED, &ip->i_flags))) - count = do_read_readi(file, buf, size, offset); - else - count = generic_file_read(file, buf, size, offset); + count = do_read_readi(file, buf, size, offset, iocb); + else { + if (!iocb) { + count = do_sync_read(file, buf, size, offset); + } else { + struct iovec local_iov = { .iov_base = buf, .iov_len = size}; + + count = generic_file_aio_read(iocb, &local_iov, 1, *offset); + iocb->ki_pos = *offset; + } + } gfs_glock_dq_m(num_gh + 1, ghs); @@ -382,6 +402,18 @@ return (count) ? count : error; } +static ssize_t +__gfs_read(struct file *file, char *buf, size_t size, loff_t *offset, + struct kiocb *iocb) +{ + atomic_inc(&get_v2sdp(file->f_mapping->host->i_sb)->sd_ops_file); + + if (file->f_flags & O_DIRECT) + return walk_vm(file, buf, size, offset, iocb, do_read_direct); + else + return walk_vm(file, buf, size, offset, iocb, do_read_buf); +} + /** * gfs_read - Read bytes from a file * @file: The file to read from @@ -397,12 +429,21 @@ static ssize_t gfs_read(struct file *file, char *buf, size_t size, loff_t *offset) { - atomic_inc(&get_v2sdp(file->f_mapping->host->i_sb)->sd_ops_file); + return(__gfs_read(file, buf, size, offset, NULL)); +} - if (file->f_flags & O_DIRECT) - return walk_vm(file, buf, size, offset, do_read_direct); - else - return walk_vm(file, buf, size, offset, do_read_buf); +/* + * gfs_aio_read: match with vfs generic_file_aio_read as: + * (struct kiocb *iocb, char __user *buf, size_t count, loff_t pos) + */ +static ssize_t +gfs_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long count, + loff_t pos) +{ + struct file *filp = iocb->ki_filp; + + BUG_ON(iocb->ki_pos != pos); + return(__gfs_read(filp, iov->iov_base, iov->iov_len, &iocb->ki_pos, iocb)); } /** @@ -437,6 +478,41 @@ } /** + * gfs_file_aio_write_nolock - Call vfs aio layer to write bytes to a file + * @file: The file to write to + * @buf: The buffer to copy from + * @size: The amount of data requested + * @offset: The offset in the file to write + * @iocb: The io control block. If NULL, a temporary one will be used. + * + * Returns: The number of bytes written, errno on failure + */ +static ssize_t +gfs_file_aio_write_nolock(struct file *file, char *buf, size_t size, + loff_t *offset, struct kiocb *iocb) +{ + struct iovec local_iov = { .iov_base = buf, .iov_len = size }; + struct kiocb local_iocb, *kiocb = NULL; + ssize_t count; + + if (!iocb) { + init_sync_kiocb(&local_iocb, file); + local_iocb.ki_nr_segs = 1; + kiocb = &local_iocb; + } + else + kiocb = iocb; + + kiocb->ki_pos = *offset; + count = generic_file_aio_write_nolock(kiocb, &local_iov, kiocb->ki_nr_segs, + kiocb->ki_pos); + *offset = kiocb->ki_pos; + if (kiocb == &local_iocb && count == -EIOCBQUEUED) + count = wait_on_sync_kiocb(kiocb); + return count; +} + +/** * do_write_direct_alloc - Write bytes to a file * @file: The file to write to * @buf: The buffer to copy from @@ -449,13 +525,13 @@ */ static ssize_t -do_write_direct_alloc(struct file *file, char *buf, size_t size, loff_t *offset) +do_write_direct_alloc(struct file *file, char *buf, size_t size, loff_t *offset, + struct kiocb *iocb) { struct inode *inode = file->f_mapping->host; struct gfs_inode *ip = get_v2ip(inode); struct gfs_sbd *sdp = ip->i_sbd; struct gfs_alloc *al = NULL; - struct iovec local_iov = { .iov_base = buf, .iov_len = size }; struct buffer_head *dibh; unsigned int data_blocks, ind_blocks; ssize_t count; @@ -508,7 +584,7 @@ goto fail_end_trans; } - count = generic_file_write_nolock(file, &local_iov, 1, offset); + count = gfs_file_aio_write_nolock(file, buf, size, offset, iocb); if (count < 0) { error = count; goto fail_end_trans; @@ -576,6 +652,7 @@ static ssize_t do_write_direct(struct file *file, char *buf, size_t size, loff_t *offset, + struct kiocb *iocb, unsigned int num_gh, struct gfs_holder *ghs) { struct gfs_inode *ip = get_v2ip(file->f_mapping->host); @@ -646,13 +723,19 @@ if (alloc_required) { set_bit(GFF_DID_DIRECT_ALLOC, &fp->f_flags); + /* for asynchronous IO, the buffer can not be splitted */ + if (iocb) { + count = do_write_direct_alloc(file, buf, size, offset, iocb); + goto out_iocb_write; + } + /* split large writes into smaller atomic transactions */ while (size) { s = gfs_tune_get(sdp, gt_max_atomic_write); if (s > size) s = size; - error = do_write_direct_alloc(file, buf, s, offset); + error = do_write_direct_alloc(file, buf, s, offset, iocb); if (error < 0) goto out_gunlock; @@ -661,7 +744,6 @@ count += error; } } else { - struct iovec local_iov = { .iov_base = buf, .iov_len = size }; struct gfs_holder t_gh; clear_bit(GFF_DID_DIRECT_ALLOC, &fp->f_flags); @@ -670,17 +752,17 @@ if (error) goto out_gunlock; - count = generic_file_write_nolock(file, &local_iov, 1, offset); - + count = gfs_file_aio_write_nolock(file, buf, size, offset, iocb); gfs_glock_dq_uninit(&t_gh); } +out_iocb_write: error = 0; - out_gunlock: +out_gunlock: gfs_glock_dq_m(num_gh + 1, ghs); - out: +out: gfs_holder_uninit(&ghs[num_gh]); return (count) ? count : error; @@ -699,7 +781,8 @@ */ static ssize_t -do_do_write_buf(struct file *file, char *buf, size_t size, loff_t *offset) +do_do_write_buf(struct file *file, char *buf, size_t size, loff_t *offset, + struct kiocb *iocb) { struct inode *inode = file->f_mapping->host; struct gfs_inode *ip = get_v2ip(inode); @@ -777,7 +860,7 @@ (gfs_is_stuffed(ip) && !test_bit(GIF_PAGED, &ip->i_flags) && *offset + size <= sdp->sd_sb.sb_bsize - sizeof(struct gfs_dinode))) { - count = gfs_writei(ip, buf, *offset, size, gfs_copy_from_user); + count = gfs_writei(ip, buf, *offset, size, gfs_copy_from_user, iocb); if (count < 0) { error = count; goto fail_end_trans; @@ -792,9 +875,7 @@ } *offset += count; } else { - struct iovec local_iov = { .iov_base = buf, .iov_len = size }; - - count = generic_file_write_nolock(file, &local_iov, 1, offset); + count = gfs_file_aio_write_nolock(file, buf, size, offset, iocb); if (count < 0) { error = count; goto fail_end_trans; @@ -869,8 +950,9 @@ static ssize_t do_write_buf(struct file *file, - char *buf, size_t size, loff_t *offset, - unsigned int num_gh, struct gfs_holder *ghs) + char *buf, size_t size, loff_t *offset, + struct kiocb *iocb, + unsigned int num_gh, struct gfs_holder *ghs) { struct gfs_inode *ip = get_v2ip(file->f_mapping->host); struct gfs_sbd *sdp = ip->i_sbd; @@ -907,7 +989,7 @@ if (s > size) s = size; - error = do_do_write_buf(file, buf, s, offset); + error = do_do_write_buf(file, buf, s, offset, iocb); if (error < 0) goto out_gunlock; @@ -940,7 +1022,7 @@ */ static ssize_t -gfs_write(struct file *file, const char *buf, size_t size, loff_t *offset) +__gfs_write(struct file *file, const char *buf, size_t size, loff_t *offset, struct kiocb *iocb) { struct inode *inode = file->f_mapping->host; ssize_t count; @@ -954,14 +1036,32 @@ mutex_lock(&inode->i_mutex); if (file->f_flags & O_DIRECT) - count = walk_vm(file, (char *)buf, size, offset, do_write_direct); + count = walk_vm(file, (char *)buf, size, offset, iocb, do_write_direct); else - count = walk_vm(file, (char *)buf, size, offset, do_write_buf); + count = walk_vm(file, (char *)buf, size, offset, iocb, do_write_buf); mutex_unlock(&inode->i_mutex); return count; } +static ssize_t +gfs_write(struct file *file, const char *buf, size_t size, loff_t *offset) +{ + return(__gfs_write(file, buf, size, offset, NULL)); +} + +static ssize_t +gfs_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long segs, + loff_t pos) +{ + struct file *file = iocb->ki_filp; + + BUG_ON(iocb->ki_pos != pos); + + return(__gfs_write(file, iov->iov_base, iov->iov_len, &iocb->ki_pos, + iocb)); +} + /** * filldir_reg_func - Report a directory entry to the caller of gfs_dir_read() * @opaque: opaque data used by the function @@ -1647,6 +1747,8 @@ .llseek = gfs_llseek, .read = gfs_read, .write = gfs_write, + .aio_read = gfs_aio_read, + .aio_write = gfs_aio_write, .ioctl = gfs_ioctl, .mmap = gfs_mmap, .open = gfs_open, --- cluster/gfs-kernel/src/gfs/ops_fstype.c 2006/06/29 16:50:41 1.13.2.1.4.2.2.3 +++ cluster/gfs-kernel/src/gfs/ops_fstype.c 2007/02/07 15:25:05 1.13.2.1.4.2.2.4 @@ -2,7 +2,7 @@ ******************************************************************************* ** ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. -** Copyright (C) 2004 Red Hat, Inc. All rights reserved. +** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. ** ** This copyrighted material is made available to anyone wishing to use, ** modify, copy, or redistribute it subject to the terms and conditions @@ -29,6 +29,7 @@ #include "inode.h" #include "lm.h" #include "mount.h" +#include "ops_dentry.h" #include "ops_export.h" #include "ops_fstype.h" #include "ops_super.h" @@ -492,6 +493,7 @@ error = -ENOMEM; goto fail_li_free; } + sb->s_root->d_op = &gfs_dops; /* Start up the logd thread */ @@ -679,9 +681,8 @@ * Returns: the new superblock */ -struct super_block * -gfs_get_sb(struct file_system_type *fs_type, int flags, - const char *dev_name, void *data) +static int gfs_get_sb(struct file_system_type *fs_type, int flags, + const char *dev_name, void *data, struct vfsmount *mnt) { struct block_device *real, *diaper; struct super_block *sb; @@ -689,17 +690,17 @@ real = open_bdev_excl(dev_name, flags, fs_type); if (IS_ERR(real)) - return (struct super_block *)real; + return PTR_ERR(real); diaper = gfs_diaper_get(real, flags); if (IS_ERR(diaper)) { close_bdev_excl(real); - return (struct super_block *)diaper; + return PTR_ERR(diaper); } - mutex_lock(&diaper->bd_mount_mutex); + down(&diaper->bd_mount_sem); sb = sget(fs_type, gfs_test_bdev_super, gfs_set_bdev_super, diaper); - mutex_unlock(&diaper->bd_mount_mutex); + up(&diaper->bd_mount_sem); if (IS_ERR(sb)) goto out; @@ -723,14 +724,20 @@ sb = ERR_PTR(error); } else sb->s_flags |= MS_ACTIVE; + if (real->bd_disk) { + if (real->bd_part) + kobject_uevent(&real->bd_part->kobj, KOBJ_MOUNT); + else + kobject_uevent(&real->bd_disk->kobj, KOBJ_MOUNT); + } } - return sb; + return simple_set_mnt(mnt, sb); out: gfs_diaper_put(diaper); close_bdev_excl(real); - return sb; + return simple_set_mnt(mnt, sb); } /** @@ -752,6 +759,13 @@ set_blocksize(diaper, bsize); set_blocksize(real, bsize); gfs_diaper_put(diaper); + if (real->bd_disk) { + if (real->bd_part) + kobject_uevent(&real->bd_part->kobj, KOBJ_UMOUNT); + else + kobject_uevent(&real->bd_disk->kobj, KOBJ_UMOUNT); + } + sync_blockdev(real); close_bdev_excl(real); } --- cluster/gfs-kernel/src/gfs/ops_inode.c 2006/08/16 14:40:54 1.6.6.1.2.5 +++ cluster/gfs-kernel/src/gfs/ops_inode.c 2007/02/07 15:25:05 1.6.6.1.2.6 @@ -171,22 +171,22 @@ parent = dget_parent(dentry); if (gfs_filecmp(&dentry->d_name, "@hostname", 9)) - new = lookup_one_len(system_utsname.nodename, + new = lookup_one_len(init_utsname()->nodename, parent, - strlen(system_utsname.nodename)); + strlen(init_utsname()->nodename)); else if (gfs_filecmp(&dentry->d_name, "@nodeid", 7)) new = lookup_one_len(buf, parent, sprintf(buf, "%s%i", "node", get_my_nodeid())); else if (gfs_filecmp(&dentry->d_name, "@mach", 5)) - new = lookup_one_len(system_utsname.machine, + new = lookup_one_len(init_utsname()->machine, parent, - strlen(system_utsname.machine)); + strlen(init_utsname()->machine)); else if (gfs_filecmp(&dentry->d_name, "@os", 3)) - new = lookup_one_len(system_utsname.sysname, + new = lookup_one_len(init_utsname()->sysname, parent, - strlen(system_utsname.sysname)); + strlen(init_utsname()->sysname)); else if (gfs_filecmp(&dentry->d_name, "@uid", 4)) new = lookup_one_len(buf, parent, @@ -199,8 +199,8 @@ new = lookup_one_len(buf, parent, sprintf(buf, "%s_%s", - system_utsname.machine, - system_utsname.sysname)); + init_utsname()->machine, + init_utsname()->sysname)); else if (gfs_filecmp(&dentry->d_name, "@jid", 4)) new = lookup_one_len(buf, parent, @@ -235,22 +235,22 @@ parent = dget_parent(dentry); if (gfs_filecmp(&dentry->d_name, "{hostname}", 10)) - new = lookup_one_len(system_utsname.nodename, + new = lookup_one_len(init_utsname()->nodename, parent, - strlen(system_utsname.nodename)); + strlen(init_utsname()->nodename)); else if (gfs_filecmp(&dentry->d_name, "{nodeid}", 8)) new = lookup_one_len(buf, parent, sprintf(buf, "%s%i", "node", get_my_nodeid())); else if (gfs_filecmp(&dentry->d_name, "{mach}", 6)) - new = lookup_one_len(system_utsname.machine, + new = lookup_one_len(init_utsname()->machine, parent, - strlen(system_utsname.machine)); + strlen(init_utsname()->machine)); else if (gfs_filecmp(&dentry->d_name, "{os}", 4)) - new = lookup_one_len(system_utsname.sysname, + new = lookup_one_len(init_utsname()->sysname, parent, - strlen(system_utsname.sysname)); + strlen(init_utsname()->sysname)); else if (gfs_filecmp(&dentry->d_name, "{uid}", 5)) new = lookup_one_len(buf, parent, @@ -263,8 +263,8 @@ new = lookup_one_len(buf, parent, sprintf(buf, "%s_%s", - system_utsname.machine, - system_utsname.sysname)); + init_utsname()->machine, + init_utsname()->sysname)); else if (gfs_filecmp(&dentry->d_name, "{jid}", 5)) new = lookup_one_len(buf, parent, --- cluster/gfs-kernel/src/gfs/ops_super.c 2006/02/15 22:49:19 1.12.2.1.4.2.2.2 +++ cluster/gfs-kernel/src/gfs/ops_super.c 2007/02/07 15:25:05 1.12.2.1.4.2.2.3 @@ -275,8 +275,9 @@ */ static int -gfs_statfs(struct super_block *sb, struct kstatfs *buf) +gfs_statfs(struct dentry *dentry, struct kstatfs *buf) { + struct super_block *sb = dentry->d_inode->i_sb; struct gfs_sbd *sdp = get_v2sdp(sb); struct gfs_stat_gfs sg; int error; --- cluster/gfs-kernel/src/gfs/recovery.c 2006/02/15 22:46:43 1.5.8.1 +++ cluster/gfs-kernel/src/gfs/recovery.c 2007/02/07 15:25:05 1.5.8.2 @@ -548,7 +548,7 @@ } /** - * gfs_recover_journal - recovery a given journal + * gfs_recover_journal - recover a given journal * @sdp: the filesystem * @jid: the number of the journal to recover * @jdesc: the struct gfs_jindex describing the journal @@ -573,7 +573,7 @@ printk("GFS: fsid=%s: jid=%u: Trying to acquire journal lock...\n", sdp->sd_fsname, jid); - /* Aquire the journal lock so we can do recovery */ + /* Acquire the journal lock so we can do recovery */ error = gfs_glock_nq_num(sdp, jdesc->ji_addr, &gfs_meta_glops, --- cluster/gfs-kernel/src/gfs/util.c 2005/03/22 15:54:09 1.9.2.1 +++ cluster/gfs-kernel/src/gfs/util.c 2007/02/07 15:25:05 1.9.2.1.6.1 @@ -26,10 +26,10 @@ uint32_t gfs_random_number; -kmem_cache_t *gfs_glock_cachep = NULL; -kmem_cache_t *gfs_inode_cachep = NULL; -kmem_cache_t *gfs_bufdata_cachep = NULL; -kmem_cache_t *gfs_mhc_cachep = NULL; +struct kmem_cache *gfs_glock_cachep = NULL; +struct kmem_cache *gfs_inode_cachep = NULL; +struct kmem_cache *gfs_bufdata_cachep = NULL; +struct kmem_cache *gfs_mhc_cachep = NULL; /** * gfs_random - Generate a random 32-bit number --- cluster/gfs-kernel/src/gfs/util.h 2006/02/20 04:01:05 1.7.8.1 +++ cluster/gfs-kernel/src/gfs/util.h 2007/02/07 15:25:05 1.7.8.2 @@ -311,10 +311,10 @@ yield(); \ } -extern kmem_cache_t *gfs_glock_cachep; -extern kmem_cache_t *gfs_inode_cachep; -extern kmem_cache_t *gfs_bufdata_cachep; -extern kmem_cache_t *gfs_mhc_cachep; +extern struct kmem_cache *gfs_glock_cachep; +extern struct kmem_cache *gfs_inode_cachep; +extern struct kmem_cache *gfs_bufdata_cachep; +extern struct kmem_cache *gfs_mhc_cachep; void *gmalloc(unsigned int size); --- cluster/gfs-kernel/src/gulm/Attic/gulm.h 2005/06/01 19:11:58 1.11.6.1 +++ cluster/gfs-kernel/src/gulm/Attic/gulm.h 2007/02/07 15:25:05 1.11.6.1.2.1 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -73,7 +72,7 @@ /* Divide x by y. Round up if there is a remainder. */ #define DIV_RU(x, y) (((x) + (y) - 1) / (y)) -#include +#include "lm_interface.h" #include "gulm_prints.h" --- cluster/gfs-kernel/src/gulm/Attic/gulm_fs.c 2005/03/04 20:08:00 1.15.2.1 +++ cluster/gfs-kernel/src/gulm/Attic/gulm_fs.c 2007/02/07 15:25:05 1.15.2.1.6.1 @@ -258,7 +258,7 @@ if (hostdata != NULL && strlen (hostdata) > 0) { strncpy (gulm_cm.myName, hostdata, 64); } else { - strncpy (gulm_cm.myName, system_utsname.nodename, 64); + strncpy (gulm_cm.myName, init_utsname()->nodename, 64); } gulm_cm.myName[63] = '\0'; --- cluster/gfs-kernel/src/gulm/Attic/handler.h 2004/06/24 08:53:28 1.1 +++ cluster/gfs-kernel/src/gulm/Attic/handler.h 2007/02/07 15:25:05 1.1.8.1 @@ -13,7 +13,8 @@ #ifndef __handler_c__ #define __handler_c__ -#include + +#include "lm_interface.h" struct callback_qu_s { struct completion startup; --- cluster/gfs-kernel/src/harness/Attic/main.c 2004/12/22 02:23:11 1.3 +++ cluster/gfs-kernel/src/harness/Attic/main.c 2007/02/07 15:25:05 1.3.8.1 @@ -19,7 +19,8 @@ #include #include #include -#include + +#include "lm_interface.h" #define RELEASE_NAME "" --- cluster/gfs-kernel/src/nolock/Attic/main.c 2006/06/26 21:27:43 1.4.6.2.2.1 +++ cluster/gfs-kernel/src/nolock/Attic/main.c 2007/02/07 15:25:05 1.4.6.2.2.2 @@ -18,7 +18,8 @@ #include #include #include -#include + +#include "lm_interface.h" #define RELEASE_NAME "" --- cluster/gnbd-kernel/src/gnbd.c 2006/07/12 17:34:29 1.6.6.1.2.4 +++ cluster/gnbd-kernel/src/gnbd.c 2007/02/07 15:25:05 1.6.6.1.2.5 @@ -30,12 +30,11 @@ #include #include #include -#include #include #include -#include +#include "gnbd.h" static int major_nr = 0; uint64_t insmod_time; @@ -578,10 +577,10 @@ struct gnbd_device *dev; blkdev_dequeue_request(req); - dprintk(DBG_BLKDEV, "%s: request %p: dequeued (flags=%lx)\n", - req->rq_disk->disk_name, req, req->flags); + dprintk(DBG_BLKDEV, "%s: request %p: dequeued (flags=%x)\n", + req->rq_disk->disk_name, req, req->cmd_type); - if (!(req->flags & REQ_CMD)) + if (!blk_fs_request(req)) goto error_out; dev = req->rq_disk->private_data; @@ -845,7 +844,6 @@ { .minor = MISC_DYNAMIC_MINOR, .name = "gnbd_ctl", - .devfs_name = "gnbd_ctl", .fops = &_gnbd_ctl_fops }; @@ -890,12 +888,12 @@ printk(KERN_CRIT "gnbd: sizeof gnbd_request needs to be 28 in order to work!\n" ); return -EIO; } - shutdown_req.flags = REQ_SPECIAL; + shutdown_req.cmd_type = REQ_TYPE_SPECIAL; gnbd_cmd(&shutdown_req) = GNBD_CMD_DISC; shutdown_req.sector = 0; shutdown_req.nr_sectors = 0; - ping_req.flags = REQ_SPECIAL; + ping_req.cmd_type = REQ_TYPE_SPECIAL; gnbd_cmd(&ping_req) = GNBD_CMD_PING; ping_req.sector = 0; ping_req.nr_sectors = 0; @@ -926,7 +924,6 @@ printk(KERN_INFO "gnbd: registered device at major %d\n", major_nr); dprintk(DBG_INIT, "gnbd: debugflags=0x%x\n", debugflags); - devfs_mk_dir("gnbd_minor"); err = class_register(&gnbd_class); if (err) goto out_unregister; @@ -982,7 +979,6 @@ disk->fops = &gnbd_fops; disk->private_data = &gnbd_dev[i]; sprintf(disk->disk_name, "gnbd%d", i); - sprintf(disk->devfs_name, "gnbd_minor/%d", i); set_capacity(disk, 0); add_disk(disk); if(sysfs_create_link(&gnbd_dev[i].class_dev.kobj, @@ -1036,7 +1032,6 @@ kfree(gnbd_dev[i].server_name); } class_unregister(&gnbd_class); - devfs_remove("gnbd"); unregister_blkdev(major_nr, "gnbd"); printk(KERN_INFO "gnbd: unregistered device at major %d\n", major_nr); }