X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flvfs%2Ffsfilt_reiserfs.c;h=83db369e8633c065cb6210a45afd4b495a7eaf48;hb=3f30bb03767b74b88ab7da1c2a50334e45cdd704;hp=9864eda7a78385ce9e08f4b10f3c308d04071629;hpb=30c3a18963d1d6d70175fbbbdd9554e1eb2fa40d;p=fs%2Flustre-release.git diff --git a/lustre/lvfs/fsfilt_reiserfs.c b/lustre/lvfs/fsfilt_reiserfs.c index 9864eda..83db369 100644 --- a/lustre/lvfs/fsfilt_reiserfs.c +++ b/lustre/lvfs/fsfilt_reiserfs.c @@ -1,26 +1,41 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * lustre/lib/fsfilt_reiserfs.c - * Lustre filesystem abstraction routines + * GPL HEADER START * - * Copyright (C) 2002 Cluster File Systems, Inc. - * Author: Andreas Dilger + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of Lustre, http://www.lustre.org. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/lvfs/fsfilt_reiserfs.c + * + * Author: Andreas Dilger */ /* @@ -33,31 +48,34 @@ #define DEBUG_SUBSYSTEM S_FILTER #include -#include #include #include #include #include -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) #include #include -#endif -#include -#include -#include -#include +#include +#include +#include #include #include +/* XXX We cannot include linux/reiserfs_fs.h here, because of symbols clash, + but we need MAX_HEIGHT definition for proper reserve calculations +#include +*/ +#define MAX_HEIGHT 5 /* maximal height of a tree. don't change this without + changing JOURNAL_PER_BALANCE_CNT */ + static void *fsfilt_reiserfs_start(struct inode *inode, int op, - void *desc_private) + void *desc_private, int logs) { return (void *)0xf00f00be; } static void *fsfilt_reiserfs_brw_start(int objcount, struct fsfilt_objinfo *fso, int niocount, struct niobuf_local *nb, - void *desc_private) + void *desc_private, int logs) { return (void *)0xf00f00be; } @@ -90,7 +108,7 @@ static int fsfilt_reiserfs_setattr(struct dentry *dentry, void *handle, if (iattr->ia_valid & ATTR_SIZE && !do_trunc) { /* ATTR_SIZE would invoke truncate: clear it */ iattr->ia_valid &= ~ATTR_SIZE; - inode->i_size = iattr->ia_size; + i_size_write(inode, iattr->ia_size); /* make sure _something_ gets set - so new inode * goes to disk (probably won't work over XFS @@ -119,7 +137,7 @@ static int fsfilt_reiserfs_setattr(struct dentry *dentry, void *handle, } static int fsfilt_reiserfs_set_md(struct inode *inode, void *handle, - void *lmm, int lmm_size) + void *lmm, int lmm_size, const char *name) { /* XXX write stripe data into MDS file itself */ CERROR("not implemented yet\n"); @@ -127,10 +145,11 @@ static int fsfilt_reiserfs_set_md(struct inode *inode, void *handle, return -ENOSYS; } -static int fsfilt_reiserfs_get_md(struct inode *inode, void *lmm, int lmm_size) +static int fsfilt_reiserfs_get_md(struct inode *inode, void *lmm, int lmm_size, + const char *name) { if (lmm == NULL) - return inode->i_size; + return i_size_read(inode); CERROR("not implemented yet\n"); return -ENOSYS; @@ -165,9 +184,7 @@ static int fsfilt_reiserfs_statfs(struct super_block *sb, int rc; memset(&sfs, 0, sizeof(sfs)); - - rc = sb->s_op->statfs(sb, &sfs); - + rc = ll_do_statfs(sb, &sfs); statfs_pack(osfs, &sfs); return rc; } @@ -177,19 +194,49 @@ static int fsfilt_reiserfs_sync(struct super_block *sb) return fsync_dev(sb->s_dev); } +/* If fso is NULL, op is FSFILT operation, otherwise op is number of fso + objects. Logs is number of logfiles to update */ +static int fsfilt_reiserfs_get_op_len(int op, struct fsfilt_objinfo *fso, + int logs) +{ + if ( !fso ) { + switch(op) { + case FSFILT_OP_CREATE: + /* directory leaf, index & indirect & EA*/ + return MAX_HEIGHT + logs; + case FSFILT_OP_UNLINK: + return MAX_HEIGHT + logs; + } + + } else { + int i; + int needed = MAX_HEIGHT; + struct super_block *sb = fso->fso_dentry->d_inode->i_sb; + int blockpp = 1 << (CFS_PAGE_SHIFT - sb->s_blocksize_bits); + for (i = 0; i < op; i++, fso++) { + int nblocks = fso->fso_bufcnt * blockpp; + + needed += nblocks; + } + return needed + logs; + } + + return 0; +} static struct fsfilt_operations fsfilt_reiserfs_ops = { - fs_type: "reiserfs", - fs_owner: THIS_MODULE, - fs_start: fsfilt_reiserfs_start, - fs_brw_start: fsfilt_reiserfs_brw_start, - fs_commit: fsfilt_reiserfs_commit, - fs_setattr: fsfilt_reiserfs_setattr, - fs_set_md: fsfilt_reiserfs_set_md, - fs_get_md: fsfilt_reiserfs_get_md, - fs_readpage: fsfilt_reiserfs_readpage, - fs_add_journal_cb: fsfilt_reiserfs_add_journal_cb, - fs_statfs: fsfilt_reiserfs_statfs, - fs_sync: fsfilt_reiserfs_sync, + .fs_type = "reiserfs", + .fs_owner = THIS_MODULE, + .fs_start = fsfilt_reiserfs_start, + .fs_brw_start = fsfilt_reiserfs_brw_start, + .fs_commit = fsfilt_reiserfs_commit, + .fs_setattr = fsfilt_reiserfs_setattr, + .fs_set_md = fsfilt_reiserfs_set_md, + .fs_get_md = fsfilt_reiserfs_get_md, + .fs_readpage = fsfilt_reiserfs_readpage, + .fs_add_journal_cb = fsfilt_reiserfs_add_journal_cb, + .fs_statfs = fsfilt_reiserfs_statfs, + .fs_sync = fsfilt_reiserfs_sync, + .fs_get_op_len = fsfilt_reiserfs_get_op_len, }; static int __init fsfilt_reiserfs_init(void) @@ -202,7 +249,7 @@ static void __exit fsfilt_reiserfs_exit(void) fsfilt_unregister_ops(&fsfilt_reiserfs_ops); } -MODULE_AUTHOR("Cluster File Systems, Inc. "); +MODULE_AUTHOR("Sun Microsystems, Inc. "); MODULE_DESCRIPTION("Lustre reiserfs Filesystem Helper v0.1"); MODULE_LICENSE("GPL");