int obd_llog_repl_cancel(struct obd_device *, struct lov_stripe_md *lsm,
int count, struct llog_cookie *cookies, int flags);
-int llog_obd_setup_logid(struct obd_device *obd, struct obd_device *disk_obd,
- int index, int count, struct llog_logid *logid);
+int llog_obd_setup(struct obd_device *obd, struct obd_device *disk_obd,
+ int index, int count, struct llog_logid *logid);
int llog_obd_cleanup(struct obd_device *obd);
int llog_obd_origin_add(struct obd_export *exp,
int index,
struct llog_rec_hdr *rec, struct lov_stripe_md *lsm,
struct llog_cookie *logcookies, int numcookies);
+int llog_initialize(struct obd_device *obd);
+int llog_disconnect(struct obd_device *obd);
int llog_cat_initialize(struct obd_device *obd, int count);
int numcookies, void *buf, int idx)
{
struct llog_operations *lop;
- int rc;
+ int rc, buflen;
ENTRY;
rc = llog_handle2ops(handle, &lop);
RETURN(rc);
if (lop->lop_write_rec == NULL)
RETURN(-EOPNOTSUPP);
- LASSERT((rec->lrh_len % LLOG_MIN_REC_SIZE) == 0);
+
+ if (buf)
+ buflen = le32_to_cpu(rec->lrh_len) + sizeof(struct llog_rec_hdr)
+ + sizeof(struct llog_rec_tail);
+ else
+ buflen = le32_to_cpu(rec->lrh_len);
+ LASSERT((buflen % LLOG_MIN_REC_SIZE) == 0);
rc = lop->lop_write_rec(handle, rec, logcookies, numcookies, buf, idx);
RETURN(rc);
+
+ blocksize = inode->i_sb->s_blocksize;
+ blocks_per_page = PAGE_SIZE >> inode->i_sb->s_blocksize_bits;
-+ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++ iblock = page->index * blocks_per_page;
+
+ for (i = 0; i < blocks_per_page; i++, iblock++) {
+ blocks[i] = ext3_bmap(inode->i_mapping, iblock);
+ if (IS_ERR(handle))
+ return PTR_ERR(handle);
+
-+ iblock = page->index >> (PAGE_SHIFT - inode->i_sb->s_blocksize_bits);
++ iblock = page->index * blocks_per_page;
+ for (i = 0; i < blocks_per_page; i++, iblock++) {
+ if (blocks[i] != 0)
+ continue;
+++ /dev/null
-drivers/net/3c59x.c
-drivers/net/e100/e100_main.c
-drivers/net/e1000/e1000_main.c
-drivers/net/eepro100.c
-drivers/net/smc-ultra.c
-drivers/net/tlan.c
-drivers/net/tulip/tulip_core.c
-include/linux/netdevice.h
-net/core/dev.c
+++ /dev/null
-fs/ext3/ext3-exports.c
+++ /dev/null
-fs/ext3/inode.c
-fs/ext3/ext3-exports.c
-fs/ext3/Makefile
+++ /dev/null
-fs/ext3/inode.c
-fs/ext3/super.c
+++ /dev/null
-fs/ext3/super.c
-fs/ext3/inode.c
-fs/ext3/file.c
-include/linux/ext3_fs.h
-include/linux/ext3_fs_sb.h
+++ /dev/null
-fs/inode.c
-include/linux/fs.h
+++ /dev/null
-fs/inode.c
-fs/super.c
-include/linux/fs.h
-fs/smbfs/inode.c
+++ /dev/null
-Documentation/filesystems/ext2.txt
-fs/ext3/Makefile
-fs/ext3/inode.c
-fs/ext3/iopen.c
-fs/ext3/iopen.h
-fs/ext3/namei.c
-fs/ext3/super.c
-include/linux/ext3_fs.h
+++ /dev/null
-Makefile
-init/main.c
-fs/Makefile
-mm/Makefile
-fs/Kconfig
+++ /dev/null
-drivers/scsi/Makefile
-drivers/scsi/Kconfig
-drivers/scsi/qla2xxx/Kconfig
-drivers/scsi/qla2xxx/Makefile
-drivers/scsi/qla2xxx/README.qla2x00
-drivers/scsi/qla2xxx/exioct.h
-drivers/scsi/qla2xxx/exioctln.h
-drivers/scsi/qla2xxx/inioct.h
-drivers/scsi/qla2xxx/ql2100tp_fw.c
-drivers/scsi/qla2xxx/ql2200ip_fw.c
-drivers/scsi/qla2xxx/ql2300tpx_fw.c
-drivers/scsi/qla2xxx/qla_cfg.c
-drivers/scsi/qla2xxx/qla_cfg.h
-drivers/scsi/qla2xxx/qla_cfgln.c
-drivers/scsi/qla2xxx/qla_dbg.c
-drivers/scsi/qla2xxx/qla_dbg.h
-drivers/scsi/qla2xxx/qla_def.h
-drivers/scsi/qla2xxx/qla_fo.c
-drivers/scsi/qla2xxx/qla_fo.cfg
-drivers/scsi/qla2xxx/qla_fo.h
-drivers/scsi/qla2xxx/qla_gbl.h
-drivers/scsi/qla2xxx/qla_inioct.c
-drivers/scsi/qla2xxx/qla_init.c
-drivers/scsi/qla2xxx/qla_inline.h
-drivers/scsi/qla2xxx/qla_iocb.c
-drivers/scsi/qla2xxx/qla_ip.c
-drivers/scsi/qla2xxx/qla_ip.h
-drivers/scsi/qla2xxx/qla_isr.c
-drivers/scsi/qla2xxx/qla_listops.h
-drivers/scsi/qla2xxx/qla_mbx.c
-drivers/scsi/qla2xxx/qla_os.c
-drivers/scsi/qla2xxx/qla_os.h
-drivers/scsi/qla2xxx/qla_settings.h
-drivers/scsi/qla2xxx/qla_sup.c
-drivers/scsi/qla2xxx/qla_vendor.c
-drivers/scsi/qla2xxx/qla_version.h
-drivers/scsi/qla2xxx/qla_xioct.c
-drivers/scsi/qla2xxx/qlfo.h
-drivers/scsi/qla2xxx/qlfolimits.h
-drivers/scsi/qla2xxx/qlfoln.h
-drivers/scsi/qla2xxx/release.txt
-drivers/scsi/qla2xxx/revision.notes
+++ /dev/null
-include/linux/skbuff.h
-include/net/tcp.h
-net/netsyms.c
-net/core/skbuff.c
-net/ipv4/tcp.c
+++ /dev/null
-arch/um/common.ld.in
-arch/um/config_block.in
-arch/um/config_char.in
-arch/um/config.in
-arch/um/config_net.in
-arch/um/config.release
-arch/um/config_scsi.in
-arch/um/defconfig
-arch/um/drivers/chan_kern.c
-arch/um/drivers/chan_user.c
-arch/um/drivers/cow.h
-arch/um/drivers/cow_sys.h
-arch/um/drivers/cow_user.c
-arch/um/drivers/daemon.h
-arch/um/drivers/daemon_kern.c
-arch/um/drivers/daemon_user.c
-arch/um/drivers/fd.c
-arch/um/drivers/harddog_kern.c
-arch/um/drivers/harddog_user.c
-arch/um/drivers/hostaudio_kern.c
-arch/um/drivers/hostaudio_user.c
-arch/um/drivers/line.c
-arch/um/drivers/Makefile
-arch/um/drivers/mcast.h
-arch/um/drivers/mcast_kern.c
-arch/um/drivers/mcast_user.c
-arch/um/drivers/mconsole_kern.c
-arch/um/drivers/mconsole_user.c
-arch/um/drivers/mmapper_kern.c
-arch/um/drivers/net_kern.c
-arch/um/drivers/net_user.c
-arch/um/drivers/null.c
-arch/um/drivers/pcap_kern.c
-arch/um/drivers/pcap_user.c
-arch/um/drivers/pcap_user.h
-arch/um/drivers/port.h
-arch/um/drivers/port_kern.c
-arch/um/drivers/port_user.c
-arch/um/drivers/pty.c
-arch/um/drivers/slip.h
-arch/um/drivers/slip_kern.c
-arch/um/drivers/slip_proto.h
-arch/um/drivers/slip_user.c
-arch/um/drivers/slirp.h
-arch/um/drivers/slirp_kern.c
-arch/um/drivers/slirp_user.c
-arch/um/drivers/ssl.c
-arch/um/drivers/ssl.h
-arch/um/drivers/stdio_console.c
-arch/um/drivers/stdio_console.h
-arch/um/drivers/tty.c
-arch/um/drivers/ubd_kern.c
-arch/um/drivers/ubd_user.c
-arch/um/drivers/xterm.c
-arch/um/drivers/xterm.h
-arch/um/drivers/xterm_kern.c
-arch/um/dyn_link.ld.in
-arch/um/fs/hostfs/hostfs.h
-arch/um/fs/hostfs/hostfs_kern.c
-arch/um/fs/hostfs/hostfs_user.c
-arch/um/fs/hostfs/Makefile
-arch/um/fs/hppfs/hppfs_kern.c
-arch/um/fs/hppfs/Makefile
-arch/um/fs/Makefile
-arch/um/include/2_5compat.h
-arch/um/include/chan_kern.h
-arch/um/include/chan_user.h
-arch/um/include/choose-mode.h
-arch/um/include/frame.h
-arch/um/include/frame_kern.h
-arch/um/include/frame_user.h
-arch/um/include/helper.h
-arch/um/include/hostaudio.h
-arch/um/include/init.h
-arch/um/include/initrd.h
-arch/um/include/irq_kern.h
-arch/um/include/irq_user.h
-arch/um/include/kern.h
-arch/um/include/kern_util.h
-arch/um/include/line.h
-arch/um/include/Makefile
-arch/um/include/mconsole.h
-arch/um/include/mconsole_kern.h
-arch/um/include/mem.h
-arch/um/include/mem_user.h
-arch/um/include/mode.h
-arch/um/include/mode_kern.h
-arch/um/include/net_kern.h
-arch/um/include/net_user.h
-arch/um/include/os.h
-arch/um/include/process.h
-arch/um/include/ptrace_user.h
-arch/um/include/sigcontext.h
-arch/um/include/sigio.h
-arch/um/include/signal_kern.h
-arch/um/include/signal_user.h
-arch/um/include/skas_ptrace.h
-arch/um/include/syscall_user.h
-arch/um/include/sysdep-i386/checksum.h
-arch/um/include/sysdep-i386/frame.h
-arch/um/include/sysdep-i386/frame_kern.h
-arch/um/include/sysdep-i386/frame_user.h
-arch/um/include/sysdep-i386/ptrace.h
-arch/um/include/sysdep-i386/ptrace_user.h
-arch/um/include/sysdep-i386/sigcontext.h
-arch/um/include/sysdep-i386/syscalls.h
-arch/um/include/sysdep-ia64/ptrace.h
-arch/um/include/sysdep-ia64/sigcontext.h
-arch/um/include/sysdep-ia64/syscalls.h
-arch/um/include/sysdep-ppc/ptrace.h
-arch/um/include/sysdep-ppc/sigcontext.h
-arch/um/include/sysdep-ppc/syscalls.h
-arch/um/include/sysrq.h
-arch/um/include/tempfile.h
-arch/um/include/time_user.h
-arch/um/include/tlb.h
-arch/um/include/ubd_user.h
-arch/um/include/umid.h
-arch/um/include/uml_uaccess.h
-arch/um/include/um_mmu.h
-arch/um/include/umn.h
-arch/um/include/um_uaccess.h
-arch/um/include/user.h
-arch/um/include/user_util.h
-arch/um/kernel/checksum.c
-arch/um/kernel/config.c.in
-arch/um/kernel/exec_kern.c
-arch/um/kernel/exitcode.c
-arch/um/kernel/frame.c
-arch/um/kernel/frame_kern.c
-arch/um/kernel/gmon_syms.c
-arch/um/kernel/gprof_syms.c
-arch/um/kernel/helper.c
-arch/um/kernel/initrd_kern.c
-arch/um/kernel/initrd_user.c
-arch/um/kernel/init_task.c
-arch/um/kernel/irq.c
-arch/um/kernel/irq_user.c
-arch/um/kernel/ksyms.c
-arch/um/kernel/Makefile
-arch/um/kernel/mem.c
-arch/um/kernel/mem_user.c
-arch/um/kernel/mprot.h
-arch/um/kernel/process.c
-arch/um/kernel/process_kern.c
-arch/um/kernel/ptrace.c
-arch/um/kernel/reboot.c
-arch/um/kernel/resource.c
-arch/um/kernel/sigio_kern.c
-arch/um/kernel/sigio_user.c
-arch/um/kernel/signal_kern.c
-arch/um/kernel/signal_user.c
-arch/um/kernel/skas/exec_kern.c
-arch/um/kernel/skas/exec_user.c
-arch/um/kernel/skas/include/mmu.h
-arch/um/kernel/skas/include/mode.h
-arch/um/kernel/skas/include/mode_kern.h
-arch/um/kernel/skas/include/proc_mm.h
-arch/um/kernel/skas/include/ptrace-skas.h
-arch/um/kernel/skas/include/skas.h
-arch/um/kernel/skas/include/uaccess.h
-arch/um/kernel/skas/Makefile
-arch/um/kernel/skas/mem.c
-arch/um/kernel/skas/mem_user.c
-arch/um/kernel/skas/mmu.c
-arch/um/kernel/skas/process.c
-arch/um/kernel/skas/process_kern.c
-arch/um/kernel/skas/syscall_kern.c
-arch/um/kernel/skas/syscall_user.c
-arch/um/kernel/skas/sys-i386/Makefile
-arch/um/kernel/skas/sys-i386/sigcontext.c
-arch/um/kernel/skas/time.c
-arch/um/kernel/skas/tlb.c
-arch/um/kernel/skas/trap_user.c
-arch/um/kernel/skas/util/Makefile
-arch/um/kernel/skas/util/mk_ptregs.c
-arch/um/kernel/smp.c
-arch/um/kernel/syscall_kern.c
-arch/um/kernel/sys_call_table.c
-arch/um/kernel/syscall_user.c
-arch/um/kernel/sysrq.c
-arch/um/kernel/tempfile.c
-arch/um/kernel/time.c
-arch/um/kernel/time_kern.c
-arch/um/kernel/tlb.c
-arch/um/kernel/trap_kern.c
-arch/um/kernel/trap_user.c
-arch/um/kernel/tt/exec_kern.c
-arch/um/kernel/tt/exec_user.c
-arch/um/kernel/tt/gdb.c
-arch/um/kernel/tt/gdb_kern.c
-arch/um/kernel/tt/include/debug.h
-arch/um/kernel/tt/include/mmu.h
-arch/um/kernel/tt/include/mode.h
-arch/um/kernel/tt/include/mode_kern.h
-arch/um/kernel/tt/include/ptrace-tt.h
-arch/um/kernel/tt/include/tt.h
-arch/um/kernel/tt/include/uaccess.h
-arch/um/kernel/tt/ksyms.c
-arch/um/kernel/tt/Makefile
-arch/um/kernel/tt/mem.c
-arch/um/kernel/tt/mem_user.c
-arch/um/kernel/tt/process_kern.c
-arch/um/kernel/tt/ptproxy/Makefile
-arch/um/kernel/tt/ptproxy/proxy.c
-arch/um/kernel/tt/ptproxy/ptproxy.h
-arch/um/kernel/tt/ptproxy/ptrace.c
-arch/um/kernel/tt/ptproxy/sysdep.c
-arch/um/kernel/tt/ptproxy/sysdep.h
-arch/um/kernel/tt/ptproxy/wait.c
-arch/um/kernel/tt/ptproxy/wait.h
-arch/um/kernel/tt/syscall_kern.c
-arch/um/kernel/tt/syscall_user.c
-arch/um/kernel/tt/sys-i386/Makefile
-arch/um/kernel/tt/sys-i386/sigcontext.c
-arch/um/kernel/tt/time.c
-arch/um/kernel/tt/tlb.c
-arch/um/kernel/tt/tracer.c
-arch/um/kernel/tt/trap_user.c
-arch/um/kernel/tt/uaccess_user.c
-arch/um/kernel/tt/unmap.c
-arch/um/kernel/tty_log.c
-arch/um/kernel/uaccess_user.c
-arch/um/kernel/um_arch.c
-arch/um/kernel/umid.c
-arch/um/kernel/user_syms.c
-arch/um/kernel/user_util.c
-arch/um/link.ld.in
-arch/um/main.c
-arch/um/Makefile
-arch/um/Makefile-i386
-arch/um/Makefile-ia64
-arch/um/Makefile-os-Linux
-arch/um/Makefile-ppc
-arch/um/Makefile-skas
-arch/um/Makefile-tt
-arch/um/os-Linux/drivers/etap.h
-arch/um/os-Linux/drivers/ethertap_kern.c
-arch/um/os-Linux/drivers/ethertap_user.c
-arch/um/os-Linux/drivers/Makefile
-arch/um/os-Linux/drivers/tuntap.h
-arch/um/os-Linux/drivers/tuntap_kern.c
-arch/um/os-Linux/drivers/tuntap_user.c
-arch/um/os-Linux/file.c
-arch/um/os-Linux/include/file.h
-arch/um/os-Linux/Makefile
-arch/um/os-Linux/process.c
-arch/um/os-Linux/tty.c
-arch/um/sys-i386/bugs.c
-arch/um/sys-i386/checksum.S
-arch/um/sys-i386/fault.c
-arch/um/sys-i386/ksyms.c
-arch/um/sys-i386/ldt.c
-arch/um/sys-i386/Makefile
-arch/um/sys-i386/ptrace.c
-arch/um/sys-i386/ptrace_user.c
-arch/um/sys-i386/sigcontext.c
-arch/um/sys-i386/syscalls.c
-arch/um/sys-i386/sysrq.c
-arch/um/sys-i386/util/Makefile
-arch/um/sys-i386/util/mk_sc.c
-arch/um/sys-i386/util/mk_thread_kern.c
-arch/um/sys-i386/util/mk_thread_user.c
-arch/um/sys-ia64/Makefile
-arch/um/sys-ppc/Makefile
-arch/um/sys-ppc/misc.S
-arch/um/sys-ppc/miscthings.c
-arch/um/sys-ppc/ptrace.c
-arch/um/sys-ppc/ptrace_user.c
-arch/um/sys-ppc/sigcontext.c
-arch/um/sys-ppc/sysrq.c
-arch/um/util/Makefile
-arch/um/util/mk_constants_kern.c
-arch/um/util/mk_constants_user.c
-arch/um/util/mk_task_kern.c
-arch/um/util/mk_task_user.c
-CREDITS
-Documentation/Configure.help
-drivers/char/Makefile
-drivers/char/tty_io.c
-drivers/net/setup.c
-include/asm-i386/hardirq.h
-include/asm-um/a.out.h
-include/asm-um/archparam-i386.h
-include/asm-um/archparam-ppc.h
-include/asm-um/arch-signal-i386.h
-include/asm-um/atomic.h
-include/asm-um/bitops.h
-include/asm-um/boot.h
-include/asm-um/bugs.h
-include/asm-um/byteorder.h
-include/asm-um/cache.h
-include/asm-um/checksum.h
-include/asm-um/cobalt.h
-include/asm-um/current.h
-include/asm-um/delay.h
-include/asm-um/desc.h
-include/asm-um/div64.h
-include/asm-um/dma.h
-include/asm-um/elf.h
-include/asm-um/errno.h
-include/asm-um/fcntl.h
-include/asm-um/fixmap.h
-include/asm-um/floppy.h
-include/asm-um/hardirq.h
-include/asm-um/hdreg.h
-include/asm-um/highmem.h
-include/asm-um/hw_irq.h
-include/asm-um/ide.h
-include/asm-um/init.h
-include/asm-um/ioctl.h
-include/asm-um/ioctls.h
-include/asm-um/io.h
-include/asm-um/ipcbuf.h
-include/asm-um/ipc.h
-include/asm-um/irq.h
-include/asm-um/keyboard.h
-include/asm-um/kmap_types.h
-include/asm-um/linux_logo.h
-include/asm-um/locks.h
-include/asm-um/mca_dma.h
-include/asm-um/mman.h
-include/asm-um/mmu_context.h
-include/asm-um/mmu.h
-include/asm-um/module.h
-include/asm-um/msgbuf.h
-include/asm-um/mtrr.h
-include/asm-um/namei.h
-include/asm-um/page.h
-include/asm-um/page_offset.h
-include/asm-um/param.h
-include/asm-um/pci.h
-include/asm-um/pgalloc.h
-include/asm-um/pgtable.h
-include/asm-um/poll.h
-include/asm-um/posix_types.h
-include/asm-um/processor-generic.h
-include/asm-um/processor-i386.h
-include/asm-um/processor-ppc.h
-include/asm-um/ptrace-generic.h
-include/asm-um/ptrace-i386.h
-include/asm-um/resource.h
-include/asm-um/rwlock.h
-include/asm-um/rwsem.h
-include/asm-um/scatterlist.h
-include/asm-um/segment.h
-include/asm-um/semaphore.h
-include/asm-um/sembuf.h
-include/asm-um/serial.h
-include/asm-um/shmbuf.h
-include/asm-um/shmparam.h
-include/asm-um/sigcontext-generic.h
-include/asm-um/sigcontext-i386.h
-include/asm-um/sigcontext-ppc.h
-include/asm-um/siginfo.h
-include/asm-um/signal.h
-include/asm-um/smp.h
-include/asm-um/smplock.h
-include/asm-um/socket.h
-include/asm-um/sockios.h
-include/asm-um/softirq.h
-include/asm-um/spinlock.h
-include/asm-um/statfs.h
-include/asm-um/stat.h
-include/asm-um/string.h
-include/asm-um/system-generic.h
-include/asm-um/system-i386.h
-include/asm-um/system-ppc.h
-include/asm-um/termbits.h
-include/asm-um/termios.h
-include/asm-um/timex.h
-include/asm-um/tlb.h
-include/asm-um/types.h
-include/asm-um/uaccess.h
-include/asm-um/ucontext.h
-include/asm-um/unaligned.h
-include/asm-um/unistd.h
-include/asm-um/user.h
-include/asm-um/vga.h
-include/asm-um/xor.h
-include/linux/blk.h
-include/linux/fs.h
-include/linux/hostfs_fs_i.h
-include/linux/hppfs_fs_i.h
-include/linux/kernel.h
-include/linux/kernel_stat.h
-include/linux/mm.h
-include/linux/proc_mm.h
-include/linux/tty.h
-init/do_mounts.c
-kernel/panic.c
-MAINTAINERS
-Makefile
-mm/Makefile
-mm/mmap.c
-mm/mprotect.c
-mm/proc_mm.c
-mm/slab.c
+++ /dev/null
-fs/exec.c
-fs/dcache.c
-fs/namespace.c
-fs/namei.c
-fs/open.c
-fs/stat.c
-fs/proc/base.c
-include/linux/dcache.h
-include/linux/fs.h
-kernel/fork.c
-kernel/exit.c
-kernel/ksyms.c
+++ /dev/null
-fs/exec.c
-fs/dcache.c
-fs/namespace.c
-fs/namei.c
-fs/nfsd/vfs.c
-fs/open.c
-fs/stat.c
-fs/proc/base.c
-include/linux/dcache.h
-include/linux/fs.h
-include/linux/fs_struct.h
-kernel/ksyms.c
-kernel/fork.c
-kernel/exit.c
+++ /dev/null
-fs/exec.c
-fs/dcache.c
-fs/namespace.c
-fs/namei.c
-fs/nfsd/vfs.c
-fs/open.c
-fs/stat.c
-fs/proc/base.c
-include/linux/dcache.h
-include/linux/fs.h
-include/linux/fs_struct.h
-kernel/ksyms.c
-kernel/fork.c
-kernel/exit.c
+++ /dev/null
-fs/dcache.c
-fs/namei.c
-include/linux/dcache.h
int ll_process_log(char *mds, char *config, struct config_llog_instance *cfg)
{
struct lustre_cfg lcfg;
- int dev;
struct obd_device *obd;
struct lustre_handle mdc_conn = {0, };
struct obd_export *exp;
+ char * name = "mdc_dev";
struct obd_uuid uuid = { "MDC_mount_UUID" };
int rc = 0;
int err;
ENTRY;
- lcfg.lcfg_command = LCFG_ATTACH;
- lcfg.lcfg_dev_name = "mdc_dev";
- lcfg.lcfg_dev_namelen = strlen(lcfg.lcfg_dev_name) + 1;
+ LCFG_INIT(lcfg, LCFG_ATTACH, name);
lcfg.lcfg_inlbuf1 = "mdc";
lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
lcfg.lcfg_inlbuf2 = "mdc_dev_UUID";
lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
- dev = class_attach(&lcfg);
- if (dev < 0)
- GOTO(out, err = dev);
-
- obd = class_name2obd("mdc_dev");
- if (obd == NULL)
- GOTO(out, err = -EINVAL);
-
- memset(&lcfg, 0, sizeof(lcfg));
+ err = class_process_config(&lcfg);
+ if (err < 0)
+ GOTO(out, err);
- lcfg.lcfg_command = LCFG_SETUP;
- lcfg.lcfg_dev_name = "mdc_dev";
- lcfg.lcfg_dev_namelen = strlen(lcfg.lcfg_dev_name) + 1;
+ LCFG_INIT(lcfg, LCFG_SETUP, name);
lcfg.lcfg_inlbuf1 = mds;
lcfg.lcfg_inllen1 = strlen(lcfg.lcfg_inlbuf1) + 1;
lcfg.lcfg_inlbuf2 = "NET_mds_facet_tcp_UUID";
lcfg.lcfg_inllen2 = strlen(lcfg.lcfg_inlbuf2) + 1;
- err = class_setup(obd, &lcfg);
+ err = class_process_config(&lcfg);
if (err < 0)
GOTO(out, err);
+ obd = class_name2obd(name);
+ if (obd == NULL)
+ GOTO(out, err = -EINVAL);
+
err = obd_connect(&mdc_conn, obd, &uuid);
if (err) {
CERROR("cannot connect to %s: rc = %d\n", mds, err);
err = obd_disconnect(exp, 0);
- memset(&lcfg, 0, sizeof(lcfg));
- lcfg.lcfg_command = LCFG_CLEANUP;
- lcfg.lcfg_dev_name = "mdc_dev";
- err = class_cleanup(obd, &lcfg);
+ LCFG_INIT(lcfg, LCFG_CLEANUP, name);
+ err = class_process_config(&lcfg);
if (err < 0)
GOTO(out, err);
- memset(&lcfg, 0, sizeof(lcfg));
- lcfg.lcfg_command = LCFG_DETACH;
- lcfg.lcfg_dev_name = "mdc_dev";
- err = class_detach(obd, &lcfg);
+ LCFG_INIT(lcfg, LCFG_DETACH, name);
+ err = class_process_config(&lcfg);
if (err < 0)
GOTO(out, err);
-
-
out:
if (rc == 0)
rc = err;
list_del(&sbi->ll_conn_chain);
obd_disconnect(sbi->ll_osc_exp, 0);
- /* Force sync on the MDS, and get the last_committed value to flush
- * remaining RPCs from the sending queue on client. */
- if (!class_exp2obd(sbi->ll_mdc_exp)->obd_no_recov)
- mdc_sync(sbi->ll_mdc_exp, NULL, NULL);
-
lprocfs_unregister_mountpoint(sbi);
if (sbi->ll_proc_root) {
lprocfs_remove(sbi->ll_proc_root);
OBD_ALLOC(cln_prof, len);
sprintf(cln_prof, "%s-clean", sbi->ll_profile);
- err = ll_process_log(sbi->ll_mds_uuid.uuid, cln_prof,
- &cfg);
+ err = ll_process_log(sbi->ll_mds_uuid.uuid, cln_prof, &cfg);
if (err < 0)
CERROR("Unable to process log: %s\n", cln_prof);
inode_setattr(inode, attr);
}
+ /* We really need to get our PW lock before we change inode->i_size.
+ * If we don't we can race with other i_size updaters on our node, like
+ * ll_file_read. We can also race with i_size propogation to other
+ * nodes through dirtying and writeback of final cached pages. This
+ * last one is especially bad for racing o_append users on other
+ * nodes. */
if (ia_valid & ATTR_SIZE) {
- struct ldlm_extent extent = { .start = 0,
+ struct ldlm_extent extent = { .start = attr->ia_size,
.end = OBD_OBJECT_EOF };
struct lustre_handle lockh = { 0 };
int err, ast_flags = 0;
/* XXX when we fix the AST intents to pass the discard-range
* XXX extent, make ast_flags always LDLM_AST_DISCARD_DATA
* XXX here. */
-
- /* Writeback uses inode->i_size to determine how far out
- * its cached pages go. ll_truncate gets a PW lock, canceling
- * our lock, _after_ it has updated i_size. this can confuse
- *
- * We really need to get our PW lock before we change
- * inode->i_size. If we don't we can race with other
- * i_size updaters on our node, like ll_file_read. We
- * can also race with i_size propogation to other
- * nodes through dirtying and writeback of final cached
- * pages. This last one is especially bad for racing
- * o_append users on other nodes. */
if (extent.start == 0)
ast_flags = LDLM_AST_DISCARD_DATA;
+
/* bug 1639: avoid write/truncate i_sem/DLM deadlock */
LASSERT(atomic_read(&inode->i_sem.count) <= 0);
up(&inode->i_sem);
void dump_lsm(int level, struct lov_stripe_md *lsm)
{
- CDEBUG(level, "objid "LPX64", maxbytes "LPX64", magic %#08x, "
- "stripe_size %#08x, offset %u, stripe_count %u\n",
+ CDEBUG(level, "objid "LPX64", maxbytes "LPX64", magic 0x%08X, "
+ "stripe_size %u, stripe_count %u\n",
lsm->lsm_object_id, lsm->lsm_maxbytes, lsm->lsm_magic,
- lsm->lsm_stripe_size, lsm->lsm_stripe_offset,
- lsm->lsm_stripe_count);
+ lsm->lsm_stripe_size, lsm->lsm_stripe_count);
}
void ll_update_inode(struct inode *inode, struct mds_body *body,
struct ptlrpc_request *req = NULL;
int rc, flags = 0;
ENTRY;
-
+
switch(cmd) {
case EXT3_IOC_GETFLAGS: {
struct ll_fid fid;
CERROR("failure %d inode %lu\n", rc, inode->i_ino);
RETURN(-abs(rc));
}
-
+
body = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*body));
-
+
if (body->flags & S_APPEND)
flags |= EXT3_APPEND_FL;
if (body->flags & S_IMMUTABLE)
flags |= EXT3_IMMUTABLE_FL;
if (body->flags & S_NOATIME)
flags |= EXT3_NOATIME_FL;
-
+
ptlrpc_req_finished (req);
-
- RETURN( put_user(flags, (int *)arg) );
+
+ RETURN(put_user(flags, (int *)arg));
}
case EXT3_IOC_SETFLAGS: {
struct mdc_op_data op_data;
struct iattr attr;
- struct obdo oa;
+ struct obdo *oa;
struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
-
- if ( get_user( flags, (int *)arg ) )
- RETURN( -EFAULT );
-
+
+ if (get_user(flags, (int *)arg))
+ RETURN(-EFAULT);
+
+ oa = obdo_alloc();
+ if (!oa)
+ RETURN(-ENOMEM);
+
ll_prepare_mdc_op_data(&op_data, inode, NULL, NULL, 0, 0);
-
+
memset(&attr, 0x0, sizeof(attr));
attr.ia_attr_flags = flags;
attr.ia_valid |= ATTR_ATTR_FLAG;
-
+
rc = mdc_setattr(sbi->ll_mdc_exp, &op_data,
&attr, NULL, 0, NULL, 0, &req);
if (rc) {
ptlrpc_req_finished(req);
if (rc != -EPERM && rc != -EACCES)
CERROR("mdc_setattr fails: rc = %d\n", rc);
+ obdo_free(oa);
RETURN(rc);
}
ptlrpc_req_finished(req);
-
- memset(&oa, 0x0, sizeof(oa));
- oa.o_id = lsm->lsm_object_id;
- oa.o_flags = flags;
- oa.o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS;
-
- rc = obd_setattr(sbi->ll_osc_exp, &oa, lsm, NULL);
+
+ oa->o_id = lsm->lsm_object_id;
+ oa->o_flags = flags;
+ oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS;
+
+ rc = obd_setattr(sbi->ll_osc_exp, oa, lsm, NULL);
+ obdo_free(oa);
if (rc) {
if (rc != -EPERM && rc != -EACCES)
CERROR("mdc_setattr fails: rc = %d\n", rc);
RETURN(rc);
}
-
+
if (flags & EXT3_APPEND_FL)
inode->i_flags |= S_APPEND;
else
inode->i_flags |= S_NOATIME;
else
inode->i_flags &= ~S_NOATIME;
-
+
RETURN(0);
}
default:
RETURN(-ENOSYS);
}
-
+
RETURN(0);
}
* See the file COPYING in this distribution
*/
+#define LAP_MAGIC 8200
+
+struct lov_async_page {
+ int lap_magic;
+ int lap_stripe;
+ obd_off lap_sub_offset;
+ void *lap_sub_cookie;
+ struct obd_async_page_ops *lap_caller_ops;
+ struct obd_async_page_ops *lap_caller_data;
+ obd_id lap_loi_id;
+};
+
/* lov_obd.c */
int lov_get_stripecnt(struct lov_obd *lov, int stripe_count);
-int lov_alloc_memmd(struct lov_stripe_md **lsmp, int stripe_count);
+int lov_alloc_memmd(struct lov_stripe_md **lsmp, int stripe_count, int pattern);
void lov_free_memmd(struct lov_stripe_md **lsmp);
/* lov_log.c */
/* lov_pack.c */
int lov_packmd(struct obd_export *exp, struct lov_mds_md **lmm,
struct lov_stripe_md *lsm);
-int lov_unpackmd(struct obd_export *exp, struct lov_stripe_md **lsm,
- struct lov_mds_md *lmm, int lmmsize);
+int lov_unpackmd(struct obd_export *exp, struct lov_stripe_md **lsmp,
+ struct lov_mds_md *lmm, int lmm_bytes);
int lov_setstripe(struct obd_export *exp,
- struct lov_stripe_md **lsmp, struct lov_mds_md *lump);
+ struct lov_stripe_md **lsmp, struct lov_user_md *lump);
int lov_getstripe(struct obd_export *exp,
- struct lov_stripe_md *lsm, struct lov_mds_md *lump);
+ struct lov_stripe_md *lsm, struct lov_user_md *lump);
/* lproc_lov.c */
extern struct file_operations lov_proc_target_fops;
#define FILTER_MOUNT_RECOV 2
#define FILTER_RECOVERY_TIMEOUT (obd_timeout * 5 * HZ / 2) /* *waves hands* */
-/* Data stored per server at the head of the last_rcvd file. In le32 order. */
+#define FILTER_ROCOMPAT_SUPP (0)
+
+#define FILTER_INCOMPAT_GROUPS 0x00000001
+#define FILTER_INCOMPAT_SUPP (FILTER_INCOMPAT_GROUPS)
+
+/* Data stored per server at the head of the last_rcvd file. In le32 order.
+ * Try to keep this the same as mds_server_data so we might one day merge. */
struct filter_server_data {
__u8 fsd_uuid[37]; /* server UUID */
__u8 fsd_uuid_padding[3]; /* unused */
- __u64 fsd_unused;
+ __u64 fsd_unused; /* was fsd_last_objid - don't use for now */
__u64 fsd_last_transno; /* last completed transaction ID */
__u64 fsd_mount_count; /* FILTER incarnation number */
__u32 fsd_feature_compat; /* compatible feature flags */
__u32 fsd_client_start; /* start of per-client data area */
__u16 fsd_client_size; /* size of per-client data area */
__u16 fsd_subdir_count; /* number of subdirectories for objects */
- //__u64 fsd_catalog_oid; /* recovery catalog object id */
- //__u32 fsd_catalog_ogen; /* recovery catalog inode generation */
- //__u64 fsd_catalog_ogr; /* recovery catalog inode group */
+ __u64 fsd_catalog_oid; /* recovery catalog object id */
+ __u32 fsd_catalog_ogen; /* recovery catalog inode generation */
__u8 fsd_peeruuid[37]; /* UUID of MDS associated with this OST */
__u8 peer_padding[3]; /* unused */
- //__u8 fsd_padding[FILTER_LR_SERVER_SIZE - 140];
- __u8 fsd_padding[FILTER_LR_SERVER_SIZE - 128];
+ __u8 fsd_padding[FILTER_LR_SERVER_SIZE - 140];
};
/* Data stored per client in the last_rcvd file. In le32 order. */
int filter_finish_transno(struct obd_export *, struct obd_trans_info *, int rc);
__u64 filter_next_id(struct filter_obd *, struct obdo *);
-int filter_update_server_data(struct obd_device *, struct file *, obd_gr,
+__u64 filter_last_id(struct filter_obd *, struct obdo *);
+int filter_update_server_data(struct obd_device *, struct file *,
struct filter_server_data *, int force_sync);
int filter_update_last_objid(struct obd_device *, obd_gr, int force_sync);
int filter_common_setup(struct obd_device *, obd_count len, void *buf,
#include "filter_internal.h"
-#if 0
-
-/* This is called from filter_setup() and should be single threaded */
-int filter_get_catalog(struct obd_device *obd)
-{
- struct filter_obd *filter = &obd->u.filter;
- struct filter_server_data *fsd = filter->fo_fsd;
- struct obd_run_ctxt saved;
- struct llog_handle *cathandle = NULL;
- struct llog_logid logid;
- struct llog_obd_ctxt *ctxt;
- int rc;
- ENTRY;
-
- push_ctxt(&saved, &obd->obd_ctxt, NULL);
- if (fsd->fsd_catalog_oid) {
- logid.lgl_oid = le64_to_cpu(fsd->fsd_catalog_oid);
- logid.lgl_ogen = 0;
- logid.lgl_ogr = le64_to_cpu(fsd->fsd_catalog_ogr);
- rc = llog_create(obd, &cathandle, &logid, NULL);
- if (rc) {
- CERROR("error opening catalog "LPX64"/"LPX64": rc %d\n",
- logid.lgl_oid, logid.lgl_ogr,
- (int)PTR_ERR(cathandle));
- fsd->fsd_catalog_oid = 0;
- fsd->fsd_catalog_ogr = 0;
- RETURN(rc);
- }
- }
-
- if (!fsd->fsd_catalog_oid) {
- rc = llog_create(obd, &cathandle, NULL, NULL);
- if (rc) {
- CERROR("error creating new catalog: rc %d\n", rc);
- cathandle = ERR_PTR(rc);
- GOTO(out, cathandle);
- }
- logid = cathandle->lgh_id;
- fsd->fsd_catalog_oid = cpu_to_le64(logid.lgl_oid);
- fsd->fsd_catalog_ogr = cpu_to_le64(logid.lgl_ogr);
- rc = filter_update_server_data(obd, filter->fo_rcvd_filp, 1,
- fsd, 0);
- if (rc) {
- CERROR("error writing new catalog to disk: rc %d\n",rc);
- GOTO(out_handle, rc);
- }
- }
-
- rc = llog_init_handle(cathandle, LLOG_F_IS_CAT, &obd->obd_uuid);
- if (rc)
- GOTO(out_handle, rc);
- OBD_ALLOC(ctxt, sizeof(*ctxt));
- if (!ctxt)
- GOTO(out_handle, rc = -ENOMEM);
- LASSERT(obd->obd_llog_ctxt == NULL);
- obd->obd_llog_ctxt = ctxt;
- obd->obd_llog_ctxt->loc_obd = obd;
- obd->obd_llog_ctxt->loc_handles[LLOG_OBD_SZ_LOG_HANDLE] = cathandle;
-
-out:
- pop_ctxt(&saved, &obd->obd_ctxt, NULL);
- RETURN(rc);
-
-out_handle:
- llog_close(cathandle);
- goto out;
-}
-#endif
-
-
int filter_log_sz_change(struct llog_handle *cathandle,
struct ll_fid *mds_fid,
__u32 io_epoch,
obj-y += ptlrpc.o
ptlrpc-objs := recover.o connection.o ptlrpc_module.o events.o service.o \
client.o niobuf.o pack_generic.o lproc_ptlrpc.o pinger.o \
- recov_thread.o ptlrpc_lib.o import.o llog_net.o
+ recov_thread.o ptlrpc_lib.o import.o llog_net.o llogd.o