- obj = yaffs_dentry_to_obj(dentry);
-
- dev = obj->my_dev;
-
- T(YAFFS_TRACE_OS | YAFFS_TRACE_SYNC,
- (TSTR("yaffs_sync_object\n")));
- yaffs_gross_lock(dev);
- yaffs_flush_file(obj, 1, datasync);
- yaffs_gross_unlock(dev);
- return 0;
-}
-
-/*
- * The VFS layer already does all the dentry stuff for rename.
- *
- * NB: POSIX says you can rename an object over an old object of the same name
- */
-static int yaffs_rename(struct inode *old_dir, struct dentry *old_dentry,
- struct inode *new_dir, struct dentry *new_dentry)
-{
- struct yaffs_dev *dev;
- int ret_val = YAFFS_FAIL;
- struct yaffs_obj *target;
-
- T(YAFFS_TRACE_OS, (TSTR("yaffs_rename\n")));
- dev = yaffs_inode_to_obj(old_dir)->my_dev;
-
- yaffs_gross_lock(dev);
-
- /* Check if the target is an existing directory that is not empty. */
- target = yaffs_find_by_name(yaffs_inode_to_obj(new_dir),
- new_dentry->d_name.name);
-
-
-
- if (target && target->variant_type == YAFFS_OBJECT_TYPE_DIRECTORY &&
- !ylist_empty(&target->variant.dir_variant.children)) {
-
- T(YAFFS_TRACE_OS, (TSTR("target is non-empty dir\n")));
-
- ret_val = YAFFS_FAIL;
- } else {
- /* Now does unlinking internally using shadowing mechanism */
- T(YAFFS_TRACE_OS, (TSTR("calling yaffs_rename_obj\n")));
-
- ret_val = yaffs_rename_obj(yaffs_inode_to_obj(old_dir),
- old_dentry->d_name.name,
- yaffs_inode_to_obj(new_dir),
- new_dentry->d_name.name);
- }
- yaffs_gross_unlock(dev);
-
- if (ret_val == YAFFS_OK) {
- if (target) {
- new_dentry->d_inode->i_nlink--;
- mark_inode_dirty(new_dentry->d_inode);
- }
-
- update_dir_time(old_dir);
- if(old_dir != new_dir)
- update_dir_time(new_dir);
- return 0;
- } else {
- return -ENOTEMPTY;
- }
-}
-
-static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
-{
- struct inode *inode = dentry->d_inode;
- int error = 0;
- struct yaffs_dev *dev;
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_setattr of object %d\n"),
- yaffs_inode_to_obj(inode)->obj_id));
-
- /* Fail if a requested resize >= 2GB */
- if (attr->ia_valid & ATTR_SIZE &&
- (attr->ia_size >> 31))
- error = -EINVAL;
-
- if (error == 0)
- error = inode_change_ok(inode, attr);
- if (error == 0) {
- int result;
- if (!error){
- error = yaffs_vfs_setattr(inode, attr);
- T(YAFFS_TRACE_OS,(TSTR("inode_setattr called\n")));
- if (attr->ia_valid & ATTR_SIZE){
- yaffs_vfs_setsize(inode,attr->ia_size);
- inode->i_blocks = (inode->i_size + 511) >> 9;
- }
- }
- dev = yaffs_inode_to_obj(inode)->my_dev;
- if (attr->ia_valid & ATTR_SIZE){
- T(YAFFS_TRACE_OS,(TSTR("resize to %d(%x)\n"),
- (int)(attr->ia_size),(int)(attr->ia_size)));
- }
- yaffs_gross_lock(dev);
- result = yaffs_set_attribs(yaffs_inode_to_obj(inode), attr);
- if(result == YAFFS_OK) {
- error = 0;
- } else {
- error = -EPERM;
- }
- yaffs_gross_unlock(dev);
-
- }
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_setattr done returning %d\n"),error));
-
- return error;
-}
-
-#ifdef CONFIG_YAFFS_XATTR
-int yaffs_setxattr(struct dentry *dentry, const char *name,
- const void *value, size_t size, int flags)
-{
- struct inode *inode = dentry->d_inode;
- int error = 0;
- struct yaffs_dev *dev;
- struct yaffs_obj *obj = yaffs_inode_to_obj(inode);
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_setxattr of object %d\n"),
- obj->obj_id));
-
-
- if (error == 0) {
- int result;
- dev = obj->my_dev;
- yaffs_gross_lock(dev);
- result = yaffs_set_xattrib(obj, name, value, size, flags);
- if(result == YAFFS_OK)
- error = 0;
- else if(result < 0)
- error = result;
- yaffs_gross_unlock(dev);
-
- }
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_setxattr done returning %d\n"),error));
-
- return error;
-}
-
-
-ssize_t yaffs_getxattr(struct dentry *dentry, const char *name, void *buff,
- size_t size)
-{
- struct inode *inode = dentry->d_inode;
- int error = 0;
- struct yaffs_dev *dev;
- struct yaffs_obj *obj = yaffs_inode_to_obj(inode);
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_getxattr \"%s\" from object %d\n"),
- name, obj->obj_id));
-
- if (error == 0) {
- dev = obj->my_dev;
- yaffs_gross_lock(dev);
- error = yaffs_get_xattrib(obj, name, buff, size);
- yaffs_gross_unlock(dev);
-
- }
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_getxattr done returning %d\n"),error));
-
- return error;
-}
-
-int yaffs_removexattr(struct dentry *dentry, const char *name)
-{
- struct inode *inode = dentry->d_inode;
- int error = 0;
- struct yaffs_dev *dev;
- struct yaffs_obj *obj = yaffs_inode_to_obj(inode);
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_removexattr of object %d\n"),
- obj->obj_id));
-
-
- if (error == 0) {
- int result;
- dev = obj->my_dev;
- yaffs_gross_lock(dev);
- result = yaffs_remove_xattrib(obj, name);
- if(result == YAFFS_OK)
- error = 0;
- else if(result < 0)
- error = result;
- yaffs_gross_unlock(dev);
-
- }
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_removexattr done returning %d\n"),error));
-
- return error;
-}
-
-ssize_t yaffs_listxattr(struct dentry *dentry, char *buff, size_t size)
-{
- struct inode *inode = dentry->d_inode;
- int error = 0;
- struct yaffs_dev *dev;
- struct yaffs_obj *obj = yaffs_inode_to_obj(inode);
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_listxattr of object %d\n"),
- obj->obj_id));
-
-
- if (error == 0) {
- dev = obj->my_dev;
- yaffs_gross_lock(dev);
- error = yaffs_list_xattrib(obj, buff, size);
- yaffs_gross_unlock(dev);
-
- }
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_listxattr done returning %d\n"),error));
-
- return error;
-}
-
-#endif