/* * smb_show_options() is for displaying mount options in /proc/mounts. * It tries to avoid showing settings that were not changed from their * defaults. */ static int smb_show_options(struct seq_file *s, struct vfsmount *m) { struct smb_mount_data_kernel *mnt = SMB_SB(m->mnt_sb)->mnt; int i; for (i = 0; opts[i].name != NULL; i++) if (mnt->flags & opts[i].flag) seq_printf(s, ",%s", opts[i].name); if (mnt->uid != 0) seq_printf(s, ",uid=%d", mnt->uid); if (mnt->gid != 0) seq_printf(s, ",gid=%d", mnt->gid); if (mnt->mounted_uid != 0) seq_printf(s, ",mounted_uid=%d", mnt->mounted_uid); /* * Defaults for file_mode and dir_mode are unknown to us; they * depend on the current umask of the user doing the mount. */ seq_printf(s, ",file_mode=%04o", mnt->file_mode & S_IRWXUGO); seq_printf(s, ",dir_mode=%04o", mnt->dir_mode & S_IRWXUGO); if (strcmp(mnt->codepage.local_name, CONFIG_NLS_DEFAULT)) seq_printf(s, ",iocharset=%s", mnt->codepage.local_name); if (strcmp(mnt->codepage.remote_name, SMB_NLS_REMOTE)) seq_printf(s, ",codepage=%s", mnt->codepage.remote_name); if (mnt->ttl != SMB_TTL_DEFAULT) seq_printf(s, ",ttl=%d", mnt->ttl); return 0; }
static void smb_put_super(struct super_block *sb) { struct smb_sb_info *server = SMB_SB(sb); lock_kernel(); smb_lock_server(server); server->state = CONN_INVALID; smbiod_unregister_server(server); smb_close_socket(server); if (server->conn_pid) kill_pid(server->conn_pid, SIGTERM, 1); bdi_destroy(&server->bdi); kfree(server->ops); smb_unload_nls(server); sb->s_fs_info = NULL; smb_unlock_server(server); put_pid(server->conn_pid); kfree(server); unlock_kernel(); }
/* We are always generating a new inode here */ struct inode * smb_iget(struct super_block *sb, struct smb_fattr *fattr) { struct smb_sb_info *server = SMB_SB(sb); struct inode *result; DEBUG1("smb_iget: %p\n", fattr); result = new_inode(sb); if (!result) return result; result->i_ino = fattr->f_ino; SMB_I(result)->open = 0; SMB_I(result)->fileid = 0; SMB_I(result)->access = 0; SMB_I(result)->flags = 0; SMB_I(result)->closed = 0; SMB_I(result)->openers = 0; smb_set_inode_attr(result, fattr); if (S_ISREG(result->i_mode)) { result->i_op = &smb_file_inode_operations; result->i_fop = &smb_file_operations; result->i_data.a_ops = &smb_file_aops; } else if (S_ISDIR(result->i_mode)) { if (server->opt.capabilities & SMB_CAP_UNIX) result->i_op = &smb_dir_inode_operations_unix; else result->i_op = &smb_dir_inode_operations; result->i_fop = &smb_dir_operations; } else if (S_ISLNK(result->i_mode)) { result->i_op = &smb_link_inode_operations; } else { init_special_inode(result, result->i_mode, fattr->f_rdev); } insert_inode_hash(result); return result; }