int fat_notify_change(struct dentry *dentry, struct iattr *attr) { struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb); struct inode *inode = dentry->d_inode; int mask, error = 0; lock_kernel(); /* * Expand the file. Since inode_setattr() updates ->i_size * before calling the ->truncate(), but FAT needs to fill the * hole before it. */ if (attr->ia_valid & ATTR_SIZE) { if (attr->ia_size > inode->i_size) { error = fat_cont_expand(inode, attr->ia_size); //error = fat_cont_expand(inode, (unsigned int)attr->ia_size); if (error || attr->ia_valid == ATTR_SIZE) goto out; attr->ia_valid &= ~ATTR_SIZE; } } error = inode_change_ok(inode, attr); if (error) { if (sbi->options.quiet) error = 0; goto out; } if (((attr->ia_valid & ATTR_UID) && (attr->ia_uid != sbi->options.fs_uid)) || ((attr->ia_valid & ATTR_GID) && (attr->ia_gid != sbi->options.fs_gid)) || ((attr->ia_valid & ATTR_MODE) && (attr->ia_mode & ~MSDOS_VALID_MODE))) error = -EPERM; if (error) { if (sbi->options.quiet) error = 0; goto out; } error = inode_setattr(inode, attr); if (error) goto out; if (S_ISDIR(inode->i_mode)) mask = sbi->options.fs_dmask; else mask = sbi->options.fs_fmask; inode->i_mode &= S_IFMT | (S_IRWXUGO & ~mask); out: unlock_kernel(); return error; }
err = fat_chain_add(inode, cluster, 1); if (err) { fat_free_clusters(inode, cluster); goto error; } } err = fat_get_cluster(inode, FAT_ENT_EOF, &fclus, &dclus); if (err < 0) { fat_msg(sb, KERN_ERR, "fat_fallocate():fat_get_cluster() error"); goto error; } MSDOS_I(inode)->mmu_private = (fclus + 1) << sbi->cluster_bits; } else { mutex_lock(&inode->i_mutex); err = fat_cont_expand(inode, (offset + len)); if (err) { fat_msg(sb, KERN_ERR, "fat_fallocate():fat_cont_expand() error"); } } error: mutex_unlock(&inode->i_mutex); return err; } #endif /* Free all clusters after the skip'th cluster. */ static int fat_free(struct inode *inode, int skip) { struct super_block *sb = inode->i_sb;