X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Flinux%2Flinux-obdo.c;h=b3933232413f9c036f778747bdf9f12b17040a93;hb=1b2547843817b4b7adbeb87ea9b070d9cac35c90;hp=d87dd09691d6c4e83c2f0d6011b1edfe668474ed;hpb=63b227ab99f727c9cd9e81b98a9fb3d9fe4f1dae;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/linux/linux-obdo.c b/lustre/obdclass/linux/linux-obdo.c index d87dd09..b393323 100644 --- a/lustre/obdclass/linux/linux-obdo.c +++ b/lustre/obdclass/linux/linux-obdo.c @@ -1,36 +1,46 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START * - * Object Devices Class Driver + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * 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. * - * Copyright (C) 2001-2003 Cluster File Systems, Inc. + * 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). * - * This file is part of the Lustre file system, http://www.lustre.org - * Lustre is a trademark of Cluster File Systems, Inc. + * 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 may have signed or agreed to another license before downloading - * this software. If so, you are bound by the terms and conditions - * of that agreement, and the following does not apply to you. See the - * LICENSE file included with this distribution for more information. + * 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 (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. * - * If you did not agree to a different license, then this copy of Lustre - * is open source 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. + * Copyright (c) 2012, 2013, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. * - * In either case, 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 - * license text for more details. + * lustre/obdclass/linux/linux-obdo.c * + * Object Devices Class Driver * These are the only exported functions, they provide some generic * infrastructure for managing object devices */ #define DEBUG_SUBSYSTEM S_CLASS -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #ifndef __KERNEL__ #include @@ -44,118 +54,101 @@ #include #include /* for PAGE_CACHE_SIZE */ -/* WARNING: the file systems must take care not to tinker with - attributes they don't manage (such as blocks). */ -void obdo_from_inode(struct obdo *dst, struct inode *src, obd_flag valid) +/*FIXME: Just copy from obdo_from_inode*/ +void obdo_from_la(struct obdo *dst, struct lu_attr *la, __u64 valid) { obd_flag newvalid = 0; - if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME)) - CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n", - valid, LTIME_S(src->i_mtime), - LTIME_S(src->i_ctime)); - - if (valid & OBD_MD_FLATIME) { - dst->o_atime = LTIME_S(src->i_atime); + if (valid & LA_ATIME) { + dst->o_atime = la->la_atime; newvalid |= OBD_MD_FLATIME; } - if (valid & OBD_MD_FLMTIME) { - dst->o_mtime = LTIME_S(src->i_mtime); + if (valid & LA_MTIME) { + dst->o_mtime = la->la_mtime; newvalid |= OBD_MD_FLMTIME; } - if (valid & OBD_MD_FLCTIME) { - dst->o_ctime = LTIME_S(src->i_ctime); + if (valid & LA_CTIME) { + dst->o_ctime = la->la_ctime; newvalid |= OBD_MD_FLCTIME; } - if (valid & OBD_MD_FLSIZE) { - dst->o_size = i_size_read(src); + if (valid & LA_SIZE) { + dst->o_size = la->la_size; newvalid |= OBD_MD_FLSIZE; } - if (valid & OBD_MD_FLBLOCKS) { /* allocation of space (x512 bytes) */ - dst->o_blocks = src->i_blocks; + if (valid & LA_BLOCKS) { /* allocation of space (x512 bytes) */ + dst->o_blocks = la->la_blocks; newvalid |= OBD_MD_FLBLOCKS; } - if (valid & OBD_MD_FLBLKSZ) { /* optimal block size */ - dst->o_blksize = 1 << src->i_blkbits; - newvalid |= OBD_MD_FLBLKSZ; - } - if (valid & OBD_MD_FLTYPE) { - dst->o_mode = (dst->o_mode & S_IALLUGO)|(src->i_mode & S_IFMT); + if (valid & LA_TYPE) { + dst->o_mode = (dst->o_mode & S_IALLUGO) | + (la->la_mode & S_IFMT); newvalid |= OBD_MD_FLTYPE; } - if (valid & OBD_MD_FLMODE) { - dst->o_mode = (dst->o_mode & S_IFMT)|(src->i_mode & S_IALLUGO); + if (valid & LA_MODE) { + dst->o_mode = (dst->o_mode & S_IFMT) | + (la->la_mode & S_IALLUGO); newvalid |= OBD_MD_FLMODE; } - if (valid & OBD_MD_FLUID) { - dst->o_uid = src->i_uid; + if (valid & LA_UID) { + dst->o_uid = la->la_uid; newvalid |= OBD_MD_FLUID; } - if (valid & OBD_MD_FLGID) { - dst->o_gid = src->i_gid; + if (valid & LA_GID) { + dst->o_gid = la->la_gid; newvalid |= OBD_MD_FLGID; } - if (valid & OBD_MD_FLFLAGS) { - dst->o_flags = src->i_flags; - newvalid |= OBD_MD_FLFLAGS; - } - if (valid & OBD_MD_FLGENER) { - dst->o_generation = src->i_generation; - newvalid |= OBD_MD_FLGENER; - } - if (valid & OBD_MD_FLFID) { - dst->o_fid = src->i_ino; - newvalid |= OBD_MD_FLFID; - } - dst->o_valid |= newvalid; } -EXPORT_SYMBOL(obdo_from_inode); +EXPORT_SYMBOL(obdo_from_la); /*FIXME: Just copy from obdo_from_inode*/ -void obdo_from_la(struct obdo *dst, struct lu_attr *la, obd_flag valid) +void la_from_obdo(struct lu_attr *dst, struct obdo *obdo, obd_flag valid) { - obd_flag newvalid = 0; + __u64 newvalid = 0; + + valid &= obdo->o_valid; if (valid & OBD_MD_FLATIME) { - dst->o_atime = la->la_atime; - newvalid |= OBD_MD_FLATIME; + dst->la_atime = obdo->o_atime; + newvalid |= LA_ATIME; } if (valid & OBD_MD_FLMTIME) { - dst->o_mtime = la->la_mtime; - newvalid |= OBD_MD_FLMTIME; + dst->la_mtime = obdo->o_mtime; + newvalid |= LA_MTIME; } if (valid & OBD_MD_FLCTIME) { - dst->o_ctime = la->la_ctime; - newvalid |= OBD_MD_FLCTIME; + dst->la_ctime = obdo->o_ctime; + newvalid |= LA_CTIME; } if (valid & OBD_MD_FLSIZE) { - dst->o_size = la->la_size; - newvalid |= OBD_MD_FLSIZE; + dst->la_size = obdo->o_size; + newvalid |= LA_SIZE; } - if (valid & OBD_MD_FLBLOCKS) { /* allocation of space (x512 bytes) */ - dst->o_blocks = la->la_blocks; - newvalid |= OBD_MD_FLBLOCKS; + if (valid & OBD_MD_FLBLOCKS) { + dst->la_blocks = obdo->o_blocks; + newvalid |= LA_BLOCKS; } if (valid & OBD_MD_FLTYPE) { - dst->o_mode = (dst->o_mode & S_IALLUGO)|(la->la_mode & S_IFMT); - newvalid |= OBD_MD_FLTYPE; + dst->la_mode = (dst->la_mode & S_IALLUGO) | + (obdo->o_mode & S_IFMT); + newvalid |= LA_TYPE; } if (valid & OBD_MD_FLMODE) { - dst->o_mode = (dst->o_mode & S_IFMT)|(la->la_mode & S_IALLUGO); - newvalid |= OBD_MD_FLMODE; + dst->la_mode = (dst->la_mode & S_IFMT) | + (obdo->o_mode & S_IALLUGO); + newvalid |= LA_MODE; } if (valid & OBD_MD_FLUID) { - dst->o_uid = la->la_uid; - newvalid |= OBD_MD_FLUID; + dst->la_uid = obdo->o_uid; + newvalid |= LA_UID; } if (valid & OBD_MD_FLGID) { - dst->o_gid = la->la_gid; - newvalid |= OBD_MD_FLGID; + dst->la_gid = obdo->o_gid; + newvalid |= LA_GID; } - dst->o_valid |= newvalid; + dst->la_valid = newvalid; } -EXPORT_SYMBOL(obdo_from_la); +EXPORT_SYMBOL(la_from_obdo); void obdo_refresh_inode(struct inode *dst, struct obdo *src, obd_flag valid) { @@ -169,35 +162,25 @@ void obdo_refresh_inode(struct inode *dst, struct obdo *src, obd_flag valid) if (valid & OBD_MD_FLATIME && src->o_atime > LTIME_S(dst->i_atime)) LTIME_S(dst->i_atime) = src->o_atime; - - /* mtime is always updated with ctime, but can be set in past. - As write and utime(2) may happen within 1 second, and utime's - mtime has a priority over write's one, leave mtime from mds - for the same ctimes. */ - if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(dst->i_ctime)) { + if (valid & OBD_MD_FLMTIME && src->o_mtime > LTIME_S(dst->i_mtime)) + LTIME_S(dst->i_mtime) = src->o_mtime; + if (valid & OBD_MD_FLCTIME && src->o_ctime > LTIME_S(dst->i_ctime)) LTIME_S(dst->i_ctime) = src->o_ctime; - if (valid & OBD_MD_FLMTIME) - LTIME_S(dst->i_mtime) = src->o_mtime; - } if (valid & OBD_MD_FLSIZE) i_size_write(dst, src->o_size); - /* optimum IO size */ - if (valid & OBD_MD_FLBLKSZ && src->o_blksize > (1 << dst->i_blkbits)) { - dst->i_blkbits = ffs(src->o_blksize) - 1; -#ifdef HAVE_INODE_BLKSIZE - dst->i_blksize = src->o_blksize; -#endif - } + /* optimum IO size */ + if (valid & OBD_MD_FLBLKSZ && src->o_blksize > (1 << dst->i_blkbits)) + dst->i_blkbits = ffs(src->o_blksize) - 1; - if (dst->i_blkbits < CFS_PAGE_SHIFT) { -#ifdef HAVE_INODE_BLKSIZE - dst->i_blksize = CFS_PAGE_SIZE; -#endif - dst->i_blkbits = CFS_PAGE_SHIFT; - } + if (dst->i_blkbits < PAGE_CACHE_SHIFT) + dst->i_blkbits = PAGE_CACHE_SHIFT; /* allocation of space */ if (valid & OBD_MD_FLBLOCKS && src->o_blocks > dst->i_blocks) + /* + * XXX shouldn't overflow be checked here like in + * obdo_to_inode(). + */ dst->i_blocks = src->o_blocks; } EXPORT_SYMBOL(obdo_refresh_inode); @@ -206,6 +189,10 @@ void obdo_to_inode(struct inode *dst, struct obdo *src, obd_flag valid) { valid &= src->o_valid; + LASSERTF(!(valid & (OBD_MD_FLTYPE | OBD_MD_FLGENER | OBD_MD_FLFID | + OBD_MD_FLID | OBD_MD_FLGROUP)), + "object "DOSTID", valid %x\n", POSTID(&src->o_oi), valid); + if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME)) CDEBUG(D_INODE, "valid "LPX64", cur time %lu/%lu, new "LPU64"/"LPU64"\n", @@ -226,14 +213,8 @@ void obdo_to_inode(struct inode *dst, struct obdo *src, obd_flag valid) dst->i_blocks = -1; } - if (valid & OBD_MD_FLBLKSZ) { - dst->i_blkbits = ffs(src->o_blksize)-1; -#ifdef HAVE_INODE_BLKSIZE - dst->i_blksize = src->o_blksize; -#endif - } - if (valid & OBD_MD_FLTYPE) - dst->i_mode = (dst->i_mode & ~S_IFMT) | (src->o_mode & S_IFMT); + if (valid & OBD_MD_FLBLKSZ) + dst->i_blkbits = ffs(src->o_blksize)-1; if (valid & OBD_MD_FLMODE) dst->i_mode = (dst->i_mode & S_IFMT) | (src->o_mode & ~S_IFMT); if (valid & OBD_MD_FLUID) @@ -242,8 +223,6 @@ void obdo_to_inode(struct inode *dst, struct obdo *src, obd_flag valid) dst->i_gid = src->o_gid; if (valid & OBD_MD_FLFLAGS) dst->i_flags = src->o_flags; - if (valid & OBD_MD_FLGENER) - dst->i_generation = src->o_generation; } EXPORT_SYMBOL(obdo_to_inode); #endif