uboot/fs/yaffs2/yaffs_attribs.c
<<
>>
Prefs
   1/*
   2 * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
   3 *
   4 * Copyright (C) 2002-2011 Aleph One Ltd.
   5 *   for Toby Churchill Ltd and Brightstar Engineering
   6 *
   7 * Created by Charles Manning <charles@aleph1.co.uk>
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License version 2 as
  11 * published by the Free Software Foundation.
  12 */
  13
  14#include "yaffs_attribs.h"
  15
  16
  17void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh)
  18{
  19        obj->yst_uid = oh->yst_uid;
  20        obj->yst_gid = oh->yst_gid;
  21        obj->yst_atime = oh->yst_atime;
  22        obj->yst_mtime = oh->yst_mtime;
  23        obj->yst_ctime = oh->yst_ctime;
  24        obj->yst_rdev = oh->yst_rdev;
  25}
  26
  27
  28void yaffs_load_attribs_oh(struct yaffs_obj_hdr *oh, struct yaffs_obj *obj)
  29{
  30#ifdef CONFIG_YAFFS_WINCE
  31                oh->win_atime[0] = obj->win_atime[0];
  32                oh->win_ctime[0] = obj->win_ctime[0];
  33                oh->win_mtime[0] = obj->win_mtime[0];
  34                oh->win_atime[1] = obj->win_atime[1];
  35                oh->win_ctime[1] = obj->win_ctime[1];
  36                oh->win_mtime[1] = obj->win_mtime[1];
  37#else
  38                oh->yst_uid = obj->yst_uid;
  39                oh->yst_gid = obj->yst_gid;
  40                oh->yst_atime = obj->yst_atime;
  41                oh->yst_mtime = obj->yst_mtime;
  42                oh->yst_ctime = obj->yst_ctime;
  43                oh->yst_rdev = obj->yst_rdev;
  44#endif
  45
  46}
  47
  48void yaffs_attribs_init(struct yaffs_obj *obj, u32 gid, u32 uid, u32 rdev)
  49{
  50
  51#ifdef CONFIG_YAFFS_WINCE
  52                yfsd_win_file_time_now(obj->win_atime);
  53                obj->win_ctime[0] = obj->win_mtime[0] = obj->win_atime[0];
  54                obj->win_ctime[1] = obj->win_mtime[1] = obj->win_atime[1];
  55
  56#else
  57        yaffs_load_current_time(obj, 1, 1);
  58        obj->yst_rdev = rdev;
  59        obj->yst_uid = uid;
  60        obj->yst_gid = gid;
  61#endif
  62}
  63
  64void yaffs_load_current_time(struct yaffs_obj *obj, int do_a, int do_c)
  65{
  66#ifdef CONFIG_YAFFS_WINCE
  67                yfsd_win_file_time_now(the_obj->win_atime);
  68                the_obj->win_ctime[0] = the_obj->win_mtime[0] =
  69                    the_obj->win_atime[0];
  70                the_obj->win_ctime[1] = the_obj->win_mtime[1] =
  71                    the_obj->win_atime[1];
  72
  73#else
  74
  75        obj->yst_mtime = Y_CURRENT_TIME;
  76        if (do_a)
  77                obj->yst_atime = obj->yst_atime;
  78        if (do_c)
  79                obj->yst_ctime = obj->yst_atime;
  80#endif
  81}
  82
  83loff_t yaffs_get_file_size(struct yaffs_obj *obj)
  84{
  85        YCHAR *alias = NULL;
  86        obj = yaffs_get_equivalent_obj(obj);
  87
  88        switch (obj->variant_type) {
  89        case YAFFS_OBJECT_TYPE_FILE:
  90                return obj->variant.file_variant.file_size;
  91        case YAFFS_OBJECT_TYPE_SYMLINK:
  92                alias = obj->variant.symlink_variant.alias;
  93                if (!alias)
  94                        return 0;
  95                return yaffs_strnlen(alias, YAFFS_MAX_ALIAS_LENGTH);
  96        default:
  97                return 0;
  98        }
  99}
 100
 101int yaffs_set_attribs(struct yaffs_obj *obj, struct iattr *attr)
 102{
 103        unsigned int valid = attr->ia_valid;
 104
 105        if (valid & ATTR_MODE)
 106                obj->yst_mode = attr->ia_mode;
 107        if (valid & ATTR_UID)
 108                obj->yst_uid = attr->ia_uid;
 109        if (valid & ATTR_GID)
 110                obj->yst_gid = attr->ia_gid;
 111
 112        if (valid & ATTR_ATIME)
 113                obj->yst_atime = Y_TIME_CONVERT(attr->ia_atime);
 114        if (valid & ATTR_CTIME)
 115                obj->yst_ctime = Y_TIME_CONVERT(attr->ia_ctime);
 116        if (valid & ATTR_MTIME)
 117                obj->yst_mtime = Y_TIME_CONVERT(attr->ia_mtime);
 118
 119        if (valid & ATTR_SIZE)
 120                yaffs_resize_file(obj, attr->ia_size);
 121
 122        yaffs_update_oh(obj, NULL, 1, 0, 0, NULL);
 123
 124        return YAFFS_OK;
 125
 126}
 127
 128int yaffs_get_attribs(struct yaffs_obj *obj, struct iattr *attr)
 129{
 130        unsigned int valid = 0;
 131
 132        attr->ia_mode = obj->yst_mode;
 133        valid |= ATTR_MODE;
 134        attr->ia_uid = obj->yst_uid;
 135        valid |= ATTR_UID;
 136        attr->ia_gid = obj->yst_gid;
 137        valid |= ATTR_GID;
 138
 139        Y_TIME_CONVERT(attr->ia_atime) = obj->yst_atime;
 140        valid |= ATTR_ATIME;
 141        Y_TIME_CONVERT(attr->ia_ctime) = obj->yst_ctime;
 142        valid |= ATTR_CTIME;
 143        Y_TIME_CONVERT(attr->ia_mtime) = obj->yst_mtime;
 144        valid |= ATTR_MTIME;
 145
 146        attr->ia_size = yaffs_get_file_size(obj);
 147        valid |= ATTR_SIZE;
 148
 149        attr->ia_valid = valid;
 150
 151        return YAFFS_OK;
 152}
 153